Beispiel #1
0
        public StatementBuilder(ILocalSymbolTable symbolTable, CodeMemberSymbol memberContext, IErrorHandler errorHandler, CompilerOptions options) {
            _symbolTable = symbolTable;
            _memberContext = memberContext;
            _symbolSet = memberContext.SymbolSet;
            _errorHandler = errorHandler;

            _expressionBuilder = new ExpressionBuilder(symbolTable, memberContext, errorHandler, options);
        }
        private SymbolImplementation BuildImplementation(ISymbolTable symbolTable, CodeMemberSymbol symbolContext, BlockStatementNode implementationNode, bool addAllParameters) {
            _rootScope = new SymbolScope(symbolTable);
            _currentScope = _rootScope;

            List<Statement> statements = new List<Statement>();
            StatementBuilder statementBuilder = new StatementBuilder(this, symbolContext, _errorHandler, _options);

            if (symbolContext.Parameters != null) {
                int parameterCount = symbolContext.Parameters.Count;
                if (addAllParameters == false) {
                    // For property getters (including indexers), we don't add the last parameter,
                    // which happens to be the "value" parameter, which only makes sense
                    // for the setter.

                    parameterCount--;
                }
                for (int paramIndex = 0; paramIndex < parameterCount; paramIndex++) {
                    _currentScope.AddSymbol(symbolContext.Parameters[paramIndex]);
                }
            }

            if ((symbolContext.Type == SymbolType.Constructor) &&
                ((((ConstructorSymbol)symbolContext).Visibility & MemberVisibility.Static) == 0)) {
                Debug.Assert(symbolContext.Parent is ClassSymbol);
                if (((ClassSymbol)symbolContext.Parent).BaseClass != null) {
                    BaseInitializerExpression baseExpr = new BaseInitializerExpression();

                    ConstructorDeclarationNode ctorNode = (ConstructorDeclarationNode)symbolContext.ParseContext;
                    if (ctorNode.BaseArguments != null) {
                        ExpressionBuilder expressionBuilder =
                            new ExpressionBuilder(this, symbolContext, _errorHandler, _options);

                        Debug.Assert(ctorNode.BaseArguments is ExpressionListNode);
                        ICollection<Expression> args =
                            expressionBuilder.BuildExpressionList((ExpressionListNode)ctorNode.BaseArguments);

                        foreach (Expression paramExpr in args) {
                            baseExpr.AddParameterValue(paramExpr);
                        }
                    }

                    statements.Add(new ExpressionStatement(baseExpr));
                }
            }

            foreach (StatementNode statementNode in implementationNode.Statements) {
                Statement statement = statementBuilder.BuildStatement(statementNode);
                if (statement != null) {
                    statements.Add(statement);
                }
            }

            return new SymbolImplementation(statements, _rootScope);
        }
        public SymbolImplementation BuildField(FieldSymbol fieldSymbol)
        {
            _rootScope = new SymbolScope((ISymbolTable)fieldSymbol.Parent);
            _currentScope = _rootScope;

            Expression initializerExpression;

            FieldDeclarationNode fieldDeclarationNode = (FieldDeclarationNode)fieldSymbol.ParseContext;
            Debug.Assert(fieldDeclarationNode != null);

            VariableInitializerNode initializerNode = (VariableInitializerNode)fieldDeclarationNode.Initializers[0];
            if (initializerNode.Value != null) {
                ExpressionBuilder expressionBuilder = new ExpressionBuilder(this, fieldSymbol, _errorHandler, _options);
                initializerExpression = expressionBuilder.BuildExpression(initializerNode.Value);
                if (initializerExpression is MemberExpression) {
                    initializerExpression =
                        expressionBuilder.TransformMemberExpression((MemberExpression)initializerExpression);
                }
            }
            else {
                object defaultValue = null;

                TypeSymbol fieldType = fieldSymbol.AssociatedType;
                SymbolSet symbolSet = fieldSymbol.SymbolSet;

                if (fieldType.Type == SymbolType.Enumeration) {
                    // The default for named values is null, so this only applies to
                    // regular enum types

                    EnumerationSymbol enumType = (EnumerationSymbol)fieldType;
                    if (enumType.UseNamedValues == false) {
                        defaultValue = 0;
                    }
                }
                else if ((fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Integer)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.UnsignedInteger)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Long)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.UnsignedLong)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Short)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.UnsignedShort)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Byte)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.SignedByte)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Double)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Single)) ||
                    (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Decimal))) {
                    defaultValue = 0;
                }
                else if (fieldType == symbolSet.ResolveIntrinsicType(IntrinsicType.Boolean)) {
                    defaultValue = false;
                }

                initializerExpression =
                    new LiteralExpression(symbolSet.ResolveIntrinsicType(IntrinsicType.Object),
                                          defaultValue);
            }

            List<Statement> statements = new List<Statement>();
            statements.Add(new ExpressionStatement(initializerExpression, /* isFragment */ true));

            return new SymbolImplementation(statements, null);
        }