private void AddFactoryMethodArguments( MethodInfo factory, MethodCall factoryMethodCall, List<ApiCall> quotedValues) { foreach (var factoryMethodParameter in factory.GetParameters()) { var parameterName = factoryMethodParameter.Name; var parameterType = factoryMethodParameter.ParameterType; ApiCall quotedCodeBlock = FindValue(parameterName, quotedValues); // special case to prefer Syntax.IdentifierName("C") to // Syntax.IdentifierName(Syntax.Identifier("C")) if (parameterName == "name" && parameterType == typeof(string)) { quotedCodeBlock = quotedValues.First(a => a.Name == "Identifier"); var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == "SyntaxFactory.Identifier") { if (methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); } else { factoryMethodCall.AddArgument(quotedCodeBlock); } quotedValues.Remove(quotedCodeBlock); continue; } } // special case to prefer Syntax.ClassDeclarationSyntax(string) instead of // Syntax.ClassDeclarationSyntax(SyntaxToken) if (parameterName == "identifier" && parameterType == typeof(string)) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == "SyntaxFactory.Identifier" && methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); quotedValues.Remove(quotedCodeBlock); continue; } } if (quotedCodeBlock != null) { factoryMethodCall.AddArgument(quotedCodeBlock); quotedValues.Remove(quotedCodeBlock); } else if (!factoryMethodParameter.IsOptional) { throw new InvalidOperationException( string.Format( "Couldn't find value for parameter '{0}' of method '{1}'. Go to QuotePropertyValues and add your node type to the exception list.", parameterName, factory)); } } }
private void AddFactoryMethodArguments( MethodInfo factory, MethodCall factoryMethodCall, List <ApiCall> quotedValues) { foreach (var factoryMethodParameter in factory.GetParameters()) { var parameterName = factoryMethodParameter.Name; var parameterType = factoryMethodParameter.ParameterType; ApiCall quotedCodeBlock = FindValue(parameterName, quotedValues); // if we have Block(List<StatementSyntax>(new StatementSyntax[] { A, B })), just simplify it to // Block(A, B) if (quotedCodeBlock != null && factory.GetParameters().Length == 1 && factoryMethodParameter.GetCustomAttribute <ParamArrayAttribute>() != null) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name.Contains("List") && methodCall.Arguments.Count == 1) { var argument = methodCall.Arguments[0] as ApiCall; var arrayCreation = argument.FactoryMethodCall as MethodCall; if (argument != null && arrayCreation != null && arrayCreation.Name.StartsWith("new ") && arrayCreation.Name.EndsWith("[]")) { foreach (var arrayElement in arrayCreation.Arguments) { factoryMethodCall.AddArgument(arrayElement); } quotedValues.Remove(quotedCodeBlock); return; } } } // special case to prefer SyntaxFactory.IdentifierName("C") to // SyntaxFactory.IdentifierName(Syntax.Identifier("C")) if (parameterName == "name" && parameterType == typeof(string)) { quotedCodeBlock = quotedValues.First(a => a.Name == "Identifier"); var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactory("Identifier")) { if (methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); } else { factoryMethodCall.AddArgument(quotedCodeBlock); } quotedValues.Remove(quotedCodeBlock); continue; } } // special case to prefer SyntaxFactory.ClassDeclarationSyntax(string) instead of // SyntaxFactory.ClassDeclarationSyntax(SyntaxToken) if (parameterName == "identifier" && parameterType == typeof(string)) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactory("Identifier") && methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); quotedValues.Remove(quotedCodeBlock); continue; } } if (quotedCodeBlock != null) { factoryMethodCall.AddArgument(quotedCodeBlock); quotedValues.Remove(quotedCodeBlock); } else if (!factoryMethodParameter.IsOptional) { if (parameterType.IsArray) { // assuming this is a params parameter that accepts an array, so if we have nothing we don't need to pass anything continue; } throw new InvalidOperationException( string.Format( "Couldn't find value for parameter '{0}' of method '{1}'. Go to QuotePropertyValues() and add your node type to the exception list.", parameterName, factory)); } } }
private void AddFactoryMethodArguments( MethodInfo factory, MethodCall factoryMethodCall, List<ApiCall> quotedValues) { foreach (var factoryMethodParameter in factory.GetParameters()) { var parameterName = factoryMethodParameter.Name; var parameterType = factoryMethodParameter.ParameterType; ApiCall quotedCodeBlock = FindValue(parameterName, quotedValues); // if we have Block(List<StatementSyntax>(new StatementSyntax[] { A, B })), just simplify it to // Block(A, B) if (quotedCodeBlock != null && factory.GetParameters().Length == 1 && factoryMethodParameter.GetCustomAttribute<ParamArrayAttribute>() != null) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name.Contains("List") && methodCall.Arguments.Count == 1) { var argument = methodCall.Arguments[0] as ApiCall; var arrayCreation = argument.FactoryMethodCall as MethodCall; if (argument != null && arrayCreation != null && arrayCreation.Name.StartsWith("new ") && arrayCreation.Name.EndsWith("[]")) { foreach (var arrayElement in arrayCreation.Arguments) { factoryMethodCall.AddArgument(arrayElement); } quotedValues.Remove(quotedCodeBlock); return; } } } // special case to prefer SyntaxFactory.IdentifierName("C") to // SyntaxFactory.IdentifierName(Syntax.Identifier("C")) if (parameterName == "name" && parameterType == typeof(string)) { quotedCodeBlock = quotedValues.First(a => a.Name == "Identifier"); var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactoryMethod("Identifier")) { if (methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); } else { factoryMethodCall.AddArgument(quotedCodeBlock); } quotedValues.Remove(quotedCodeBlock); continue; } } // special case to prefer SyntaxFactory.ClassDeclarationSyntax(string) instead of // SyntaxFactory.ClassDeclarationSyntax(SyntaxToken) if (parameterName == "identifier" && parameterType == typeof(string)) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactoryMethod("Identifier") && methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); quotedValues.Remove(quotedCodeBlock); continue; } } if (quotedCodeBlock != null) { factoryMethodCall.AddArgument(quotedCodeBlock); quotedValues.Remove(quotedCodeBlock); } else if (!factoryMethodParameter.IsOptional) { if (parameterType.IsArray) { // assuming this is a params parameter that accepts an array, so if we have nothing we don't need to pass anything continue; } throw new InvalidOperationException( string.Format( "Couldn't find value for parameter '{0}' of method '{1}'. Go to QuotePropertyValues() and add your node type to the exception list.", parameterName, factory)); } } }
private void AddFactoryMethodArguments( MethodInfo factory, MethodCall factoryMethodCall, List <ApiCall> quotedValues) { foreach (var factoryMethodParameter in factory.GetParameters()) { var parameterName = factoryMethodParameter.Name; var parameterType = factoryMethodParameter.ParameterType; ApiCall quotedCodeBlock = FindValue(parameterName, quotedValues); // if we have Block(List<StatementSyntax>(new StatementSyntax[] { A, B })), just simplify it to // Block(A, B) if (quotedCodeBlock != null && factory.GetParameters().Length == 1 && factoryMethodParameter.GetCustomAttribute <ParamArrayAttribute>() != null) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name.Contains("List") && methodCall.Arguments.Count == 1) { var argument = methodCall.Arguments[0] as ApiCall; var arrayCreation = argument.FactoryMethodCall as MethodCall; if (argument != null && arrayCreation != null && arrayCreation.Name.StartsWith("new ") && arrayCreation.Name.EndsWith("[]")) { foreach (var arrayElement in arrayCreation.Arguments) { factoryMethodCall.AddArgument(arrayElement); } quotedValues.Remove(quotedCodeBlock); return; } } } // special case to prefer SyntaxFactory.IdentifierName("C") to // SyntaxFactory.IdentifierName(Syntax.Identifier("C")) if (parameterName == "name" && parameterType == typeof(string)) { quotedCodeBlock = quotedValues.FirstOrDefault(a => a.Name == "Identifier"); if (quotedCodeBlock == null) { throw new NotImplementedException($"An unsupported factory method was chosen: {factory.ToString()}\r\nPlease add this method to the list of factoryMethodsToExclude."); } var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactoryMethod("Identifier")) { if (methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); } else { factoryMethodCall.AddArgument(quotedCodeBlock); } quotedValues.Remove(quotedCodeBlock); continue; } } // special case to prefer SyntaxFactory.ClassDeclarationSyntax(string) instead of // SyntaxFactory.ClassDeclarationSyntax(SyntaxToken) if (parameterName == "identifier" && parameterType == typeof(string)) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactoryMethod("Identifier") && methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); quotedValues.Remove(quotedCodeBlock); continue; } } if (quotedCodeBlock != null) { factoryMethodCall.AddArgument(quotedCodeBlock); quotedValues.Remove(quotedCodeBlock); } else if (!factoryMethodParameter.IsOptional) { if (parameterType.IsArray) { // assuming this is a params parameter that accepts an array, so if we have nothing we don't need to pass anything continue; } // if we don't have a value just try passing null and see if it will work later if (!parameterType.IsValueType) { factoryMethodCall.AddArgument("null"); } else { factoryMethodCall.AddArgument( new MethodCall() { Name = "default", Arguments = new List <object> { GetPrintableTypeName(parameterType) } }); } } } }
private void AddFactoryMethodArguments( MethodInfo factory, MethodCall factoryMethodCall, List <ApiCall> quotedValues) { foreach (var factoryMethodParameter in factory.GetParameters()) { var parameterName = factoryMethodParameter.Name; var parameterType = factoryMethodParameter.ParameterType; ApiCall quotedCodeBlock = FindValue(parameterName, quotedValues); // special case to prefer SyntaxFactory.IdentifierName("C") to // SyntaxFactory.IdentifierName(Syntax.Identifier("C")) if (parameterName == "name" && parameterType == typeof(string)) { quotedCodeBlock = quotedValues.First(a => a.Name == "Identifier"); var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactory("Identifier")) { if (methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); } else { factoryMethodCall.AddArgument(quotedCodeBlock); } quotedValues.Remove(quotedCodeBlock); continue; } } // special case to prefer SyntaxFactory.ClassDeclarationSyntax(string) instead of // SyntaxFactory.ClassDeclarationSyntax(SyntaxToken) if (parameterName == "identifier" && parameterType == typeof(string)) { var methodCall = quotedCodeBlock.FactoryMethodCall as MethodCall; if (methodCall != null && methodCall.Name == SyntaxFactory("Identifier") && methodCall.Arguments.Count == 1) { factoryMethodCall.AddArgument(methodCall.Arguments[0]); quotedValues.Remove(quotedCodeBlock); continue; } } if (quotedCodeBlock != null) { factoryMethodCall.AddArgument(quotedCodeBlock); quotedValues.Remove(quotedCodeBlock); } else if (!factoryMethodParameter.IsOptional) { throw new InvalidOperationException( string.Format( "Couldn't find value for parameter '{0}' of method '{1}'. Go to QuotePropertyValues() and add your node type to the exception list.", parameterName, factory)); } } }