示例#1
0
        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;
 }
示例#3
0
        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);
        }