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 }); }
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); } }