public Statement GetStatement() { var typeInfo = semanticModel.GetTypeInfo(objectCreationExpressionSyntax); var objectCreationStatement = new ObjectCreationStatement { Type = typeInfo.GetClassType() }; if (objectCreationExpressionSyntax.Initializer != null) { objectCreationStatement.Initializer = new List <Statement>(); foreach (var expression in objectCreationExpressionSyntax.Initializer.Expressions) { var statement = statementInterpreterHandler.GetStatement(expression) ; objectCreationStatement.Initializer.Add(statement); } } if (objectCreationExpressionSyntax.ArgumentList?.Arguments != null) { var arguments = new List <Statement>(); foreach (var argumentSyntax in objectCreationExpressionSyntax.ArgumentList.Arguments) { arguments.Add(statementInterpreterHandler.GetStatement(argumentSyntax)); } objectCreationStatement.ArgumentList = arguments; } return(objectCreationStatement); }
public ObjectCreationExpressionInterpreter(ExpressionInterpreterHandler expressionInterpreterHandler, ObjectCreationStatement creationStatement) { this.expressionInterpreterHandler = expressionInterpreterHandler; this.creationStatement = creationStatement; }
private Statement CreateObjectCreationStatement(ClassType classType) { var objectCreationStatement = new ObjectCreationStatement { Type = classType }; if (objectCreationExpressionSyntax.Initializer != null) { objectCreationStatement.Initializer = new List <Statement>(); foreach (var expression in objectCreationExpressionSyntax.Initializer.Expressions) { var statement = statementInterpreterHandler.GetStatement(expression) ; objectCreationStatement.Initializer.Add(statement); } } var methodSymbolInfo = semanticModel.GetSymbolInfo(objectCreationExpressionSyntax); var arguments = new List <Statement>(); if (methodSymbolInfo.Symbol is IMethodSymbol methodSymbol) { for (int i = 0; i < methodSymbol.Parameters.Length; i++) { var parameter = methodSymbol.Parameters[i]; if (!parameter.IsOptional) { arguments.Add(statementInterpreterHandler.GetStatement(objectCreationExpressionSyntax.ArgumentList.Arguments[i])); } else { var argumentSyntax = objectCreationExpressionSyntax.ArgumentList.Arguments.FirstOrDefault(x => x.NameColon != null && x.NameColon.Name.Identifier.ValueText == parameter.Name); if (argumentSyntax == null) { if (objectCreationExpressionSyntax.ArgumentList.Arguments.Count <= i) { //use default value arguments.Add(new ConstantStatement(parameter.ExplicitDefaultValue)); } else { arguments.Add(statementInterpreterHandler.GetStatement(objectCreationExpressionSyntax.ArgumentList.Arguments[i])); } } else { arguments.Add(statementInterpreterHandler.GetStatement(argumentSyntax)); } } } objectCreationStatement.ParametersSignature = methodSymbol.Parameters.Select(x => x.Type.GetClassType()).ToArray(); } else { throw new Exception("Cannot find constructor for type: " + classType.TypeString); } objectCreationStatement.ArgumentList.AddRange(arguments); return(objectCreationStatement); }