public override IAssignableExpression VisitLambdaExpression(ILambdaExpression expr, IList <IStatement> body) { if (expr.DeclaredElement == null) { return(new UnknownExpression()); } var lambdaName = expr.GetName(); var lambdaBody = new KaVEList <IStatement>(); var bodyVisitor = new BodyVisitor(_nameGen, _marker); if (expr.BodyBlock != null) { expr.BodyBlock.Accept(bodyVisitor, lambdaBody); } else if (expr.BodyExpression != null) { var varRef = ToVariableRef(expr.BodyExpression, lambdaBody); lambdaBody.Add( new ReturnStatement { IsVoid = false, Expression = new ReferenceExpression { Reference = varRef } }); } return(new LambdaExpression { Name = lambdaName, Body = lambdaBody }); }
public override IAssignableExpression VisitLambdaExpression(ILambdaExpression expr, IList <IStatement> body) { if (expr.DeclaredElement == null) { return(new UnknownExpression()); } var lambdaName = expr.GetName(); var lambdaBody = new KaVEList <IStatement>(); var isCompletionTarget = expr == _marker.HandlingNode && CompletionCase.InBody == _marker.Case; if (isCompletionTarget) { var stmt = new ExpressionStatement { Expression = new CompletionExpression() }; lambdaBody.Add(stmt); } var bodyVisitor = new StatementVisitor(_nameGen, _marker); if (expr.BodyBlock != null) { expr.BodyBlock.Accept(bodyVisitor, lambdaBody); } else if (expr.BodyExpression != null) { var varRef = ToVariableRef(expr.BodyExpression, lambdaBody); lambdaBody.Add( new ReturnStatement { IsVoid = false, Expression = new ReferenceExpression { Reference = varRef } }); } return(new LambdaExpression { Name = lambdaName, Body = lambdaBody }); }