public void AddCatch(VariableSymbol exceptionVariable, Statement catchStatement) {
            Debug.Assert(_exceptionVariable == null);
            Debug.Assert(_catch == null);

            _exceptionVariable = exceptionVariable;
            _catch = catchStatement;
        }
예제 #2
0
        private Statement ProcessVariableDeclarationStatement(VariableDeclarationNode node)
        {
            VariableDeclarationStatement statement = new VariableDeclarationStatement();
            TypeSymbol variableType = _symbolSet.ResolveType(node.Type, _symbolTable, _memberContext);

            foreach (VariableInitializerNode initializerNode in node.Initializers) {
                string name = initializerNode.Name.Name;

                VariableSymbol symbol = new VariableSymbol(name, _memberContext, variableType);
                if (initializerNode.Value != null) {
                    Expression value = _expressionBuilder.BuildExpression(initializerNode.Value);
                    if (value is MemberExpression) {
                        value = _expressionBuilder.TransformMemberExpression((MemberExpression)value);
                    }
                    symbol.SetValue(value);
                }

                _symbolTable.AddSymbol(symbol);

                statement.AddVariable(symbol);
            }
            return statement;
        }
예제 #3
0
        private Statement ProcessTryCatchFinallyStatement(TryNode node)
        {
            Debug.Assert(node.CatchClauses.Count < 2);
            Debug.Assert((node.CatchClauses.Count == 1) || (node.FinallyClause != null));

            TryCatchFinallyStatement statement = new TryCatchFinallyStatement();

            Statement body = BuildStatement((StatementNode)node.Body);
            statement.AddBody(body);

            if (node.CatchClauses.Count == 1) {
                CatchNode catchNode = (CatchNode)node.CatchClauses[0];

                VariableSymbol exceptionVariableSymbol = null;
                if (catchNode.Name != null) {
                    TypeSymbol exceptionVariableType =
                        _symbolSet.ResolveType(catchNode.Type, _symbolTable, _memberContext);
                    Debug.Assert(exceptionVariableType != null);

                    exceptionVariableSymbol =
                        new VariableSymbol(catchNode.Name.Name, _memberContext, exceptionVariableType);
                }
                else {
                    TypeSymbol exceptionVariableType =
                        _symbolSet.ResolveIntrinsicType(IntrinsicType.Exception);
                    Debug.Assert(exceptionVariableType != null);

                    exceptionVariableSymbol =
                        new VariableSymbol(_symbolTable.CreateSymbolName("e"), _memberContext, exceptionVariableType);
                }

                _symbolTable.PushScope();
                _symbolTable.AddSymbol(exceptionVariableSymbol);

                Statement catchStatement = BuildStatement((StatementNode)catchNode.Body);
                statement.AddCatch(exceptionVariableSymbol, catchStatement);

                _symbolTable.PopScope();
            }

            if (node.FinallyClause != null) {
                Statement finallyStatement = BuildStatement((StatementNode)node.FinallyClause);
                statement.AddFinally(finallyStatement);
            }

            return statement;
        }
예제 #4
0
        private Statement ProcessForeachStatement(ForeachNode node)
        {
            TypeSymbol type = _symbolSet.ResolveType(node.Type, _symbolTable, _memberContext);
            Debug.Assert(type != null);

            bool dictionaryContainer = (type.Name == "DictionaryEntry") || (type.Name == "KeyValuePair`2");

            Expression collectionExpression = _expressionBuilder.BuildExpression(node.Container);
            if (collectionExpression is MemberExpression) {
                collectionExpression = _expressionBuilder.TransformMemberExpression((MemberExpression)collectionExpression);
            }

            ForInStatement statement;
            if (dictionaryContainer) {
                VariableSymbol dictionaryVariable = null;

                if (collectionExpression.Type != ExpressionType.Local) {
                    string dictionaryVariableName = _symbolTable.CreateSymbolName("dict");
                    dictionaryVariable = new VariableSymbol(dictionaryVariableName, _memberContext,
                                                            collectionExpression.EvaluatedType);
                }

                statement = new ForInStatement(collectionExpression, dictionaryVariable);

                string keyVariableName = _symbolTable.CreateSymbolName("key");
                VariableSymbol keyVariable = new VariableSymbol(keyVariableName, _memberContext,
                                                                _symbolSet.ResolveIntrinsicType(IntrinsicType.String));
                statement.SetLoopVariable(keyVariable);
            }
            else {
                statement = new ForInStatement(collectionExpression);

                string enumeratorVariableName = _symbolTable.CreateSymbolName("enum");
                VariableSymbol enumVariable = new VariableSymbol(enumeratorVariableName, _memberContext,
                                                                 _symbolSet.ResolveIntrinsicType(IntrinsicType.IEnumerator));
                statement.SetLoopVariable(enumVariable);
            }

            _symbolTable.PushScope();

            VariableSymbol itemVariable = new VariableSymbol(node.Name.Name, _memberContext, type);
            _symbolTable.AddSymbol(itemVariable);
            statement.SetItemVariable(itemVariable);

            Statement body = BuildStatement((StatementNode)node.Body);
            statement.AddBody(body);

            _symbolTable.PopScope();

            return statement;
        }
예제 #5
0
        public Expression TransformMemberExpression(MemberExpression expression, bool getOrAdd, bool isEventAddRemove) {
            switch (expression.Member.Type) {
                case SymbolType.EnumerationField:
                    if (((EnumerationSymbol)expression.Member.Parent).UseNamedValues) {
                        EnumerationFieldSymbol field = (EnumerationFieldSymbol)expression.Member;
                        string fieldName = ((EnumerationSymbol)expression.Member.Parent).CreateNamedValue(field);

                        return new LiteralExpression(_symbolSet.ResolveIntrinsicType(IntrinsicType.String),
                                                     fieldName);
                    }
                    else if (((TypeSymbol)expression.Member.Parent).IsApplicationType ||
                             ((EnumerationSymbol)expression.Member.Parent).UseNumericValues) {
                        // For enum types defined within the same assembly, simply use the literal value.
                        // Same goes for any enums marked as numeric values
                        return new LiteralExpression(_symbolSet.ResolveIntrinsicType(IntrinsicType.Integer),
                                                     ((EnumerationFieldSymbol)expression.Member).Value);
                    }
                    else {
                        // For enum types imported for another assembly
                        return new EnumerationFieldExpression(expression.ObjectReference,
                                                              (EnumerationFieldSymbol)expression.Member);
                    }
                case SymbolType.Field:
                    if (((FieldSymbol)expression.Member).IsConstant) {
                        return new LiteralExpression(expression.Member.AssociatedType, ((FieldSymbol)expression.Member).Value);
                    }
                    if (expression.ObjectReference is BaseExpression) {
                        // Create a this expression, because "this" works just as well as base.
                        // It is explicit, because the base was explicit.
                        return new FieldExpression(new ThisExpression(_classContext, /* explicitReference */ true),
                                                   (FieldSymbol)expression.Member);
                    }
                    if (((expression.Member.Visibility & MemberVisibility.Static) != 0) &&
                        (expression.Member.Parent != expression.ObjectReference.EvaluatedType)) {
                        // Create a new type expression because a static member
                        // of the base type is being used.
                        return new FieldExpression(new TypeExpression((ClassSymbol)expression.Member.Parent, expression.MemberMask),
                                                   (FieldSymbol)expression.Member);
                    }
                    if ((_symbolContext.Parent.Type == SymbolType.Record) &&
                        (expression.ObjectReference.Type == ExpressionType.This)) {
                        // Change "this" references inside struct ctor code to "$o"
                        VariableSymbol objectVariable = new VariableSymbol("$o", _memberContext, _classContext);
                        return new FieldExpression(new LocalExpression(objectVariable),
                                                   (FieldSymbol)expression.Member);
                    }
                    if (((expression.Member.Visibility & MemberVisibility.Static) != 0) &&
                        (expression.Member.Parent == _symbolSet.ResolveIntrinsicType(IntrinsicType.String)) &&
                        (String.CompareOrdinal(expression.Member.Name, "Empty") == 0)) {
                        // Convert String.Empty to literal expression
                        return new LiteralExpression(expression.Member.AssociatedType, String.Empty);
                    }
                    return new FieldExpression(expression.ObjectReference,
                                               (FieldSymbol)expression.Member);
                case SymbolType.Property:
                    return new PropertyExpression(expression.ObjectReference,
                                                  (PropertySymbol)expression.Member, getOrAdd);
                case SymbolType.Method:
                    Debug.Assert(getOrAdd);
                    return new DelegateExpression(expression.ObjectReference,
                                                  (MethodSymbol)expression.Member);
                case SymbolType.Event:
                    if (isEventAddRemove) {
                        return new EventExpression(expression.ObjectReference,
                                                   (EventSymbol)expression.Member, getOrAdd);
                    }
                    else {
                        Debug.Assert(((EventSymbol)expression.Member).DefaultImplementation);

                        // When the field corresponding to an event whose accessors are auto-generated is
                        // referenced, we need to hunt for a special generated field name (this is the
                        // field that is added to the class).

                        string fieldName = "__" + Utility.CreateCamelCaseName(expression.Member.Name);
                        FieldSymbol fieldSymbol = (FieldSymbol)expression.ObjectReference.EvaluatedType.GetMember(fieldName);
                        Debug.Assert(fieldSymbol != null);

                        if (expression.ObjectReference is BaseExpression) {
                            // Create a this expression, because "this" works just as well as base.
                            // It is explicit, because the base was explicit.
                            return new FieldExpression(new ThisExpression(_classContext, /* explicitReference */ true),
                                                       fieldSymbol);
                        }
                        return new FieldExpression(expression.ObjectReference, fieldSymbol);
                    }
                default:
                    Debug.Fail("Unexpected member type to transform: " + expression.Member.Type);
                    break;
            }
            return expression;
        }
예제 #6
0
 public void SetLoopVariable(VariableSymbol variable)
 {
     Debug.Assert(_loopVariable == null);
     _loopVariable = variable;
 }
 public void AddVariable(VariableSymbol variable) {
     _variables.Add(variable);
 }
예제 #8
0
 public void SetItemVariable(VariableSymbol variable)
 {
     Debug.Assert(_itemVariable == null);
     _itemVariable = variable;
 }
예제 #9
0
 public ForInStatement(Expression collectionExpression, VariableSymbol dictionaryVariable)
     : base(StatementType.ForIn)
 {
     _collectionExpression = collectionExpression;
     _dictionaryVariable = dictionaryVariable;
 }
예제 #10
0
 public void SetLoopVariable(VariableSymbol variable)
 {
     Debug.Assert(_loopVariable == null);
     _loopVariable = variable;
 }
예제 #11
0
 public void SetItemVariable(VariableSymbol variable)
 {
     Debug.Assert(_itemVariable == null);
     _itemVariable = variable;
 }
예제 #12
0
 public ForInStatement(Expression collectionExpression, VariableSymbol dictionaryVariable)
     : base(StatementType.ForIn)
 {
     _collectionExpression = collectionExpression;
     _dictionaryVariable   = dictionaryVariable;
 }