예제 #1
0
        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
            });
        }
예제 #2
0
        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
            });
        }