Пример #1
0
        public ISimpleExpression ToSimpleExpression(ICSharpExpression csExpr, IList <IStatement> body)
        {
            if (csExpr == null)
            {
                return(new UnknownExpression());
            }

            IAssignableExpression expr = new UnknownExpression();

            Execute.AndSupressExceptions(
                () => { expr = csExpr.Accept(this, body) ?? new UnknownExpression(); });

            var simpleExpression = expr as ISimpleExpression;

            if (simpleExpression != null)
            {
                return(simpleExpression);
            }

            var newRef = new VariableReference {
                Identifier = _nameGen.GetNextVariableName()
            };
            var exprIType = csExpr.GetExpressionType().ToIType();
            // TODO write test for this null check
            var exprType = exprIType == null ? Names.UnknownType : exprIType.GetName();

            body.Add(
                new VariableDeclaration
            {
                Reference = newRef,
                Type      = exprType
            });
            body.Add(
                new Assignment
            {
                Reference  = newRef,
                Expression = expr
            });
            return(new ReferenceExpression {
                Reference = newRef
            });
        }
Пример #2
0
        public override void VisitThrowStatement(IThrowStatement stmt, IList <IStatement> body)
        {
            if (IsTargetMatch(stmt, CompletionCase.EmptyCompletionBefore))
            {
                body.Add(EmptyCompletionExpression);
            }

            IVariableReference varRef = new VariableReference();

            if (stmt.Semicolon == null && IsTargetMatch(stmt, CompletionCase.EmptyCompletionAfter))
            {
                varRef = new VariableReference {
                    Identifier = _nameGen.GetNextVariableName()
                };
                body.Add(
                    new VariableDeclaration
                {
                    Type      = Names.Type("System.Exception, mscorlib, 4.0.0.0"),
                    Reference = varRef
                });
                body.Add(new Assignment {
                    Reference = varRef, Expression = new CompletionExpression()
                });
            }
            else if (stmt.Exception != null)
            {
                varRef = _exprVisitor.ToVariableRef(stmt.Exception, body);
            }

            body.Add(new ThrowStatement {
                Reference = varRef
            });

            if (IsTargetMatch(stmt, CompletionCase.EmptyCompletionAfter))
            {
                body.Add(EmptyCompletionExpression);
            }
        }