Beispiel #1
0
 public LambdaExpression(
     MetaData metaData,
     [NotNull] StatementList body,
     // FEATURE #22
     [CanBeNull] IList <VariableDeclaration> parameterList = null,
     [CanBeNull] Type returnType = null,
     [CanBeNull] ReturnLabelDeclaration endLabel = null,
     bool recur = false) : base(metaData)
 {
     Body          = body;
     DeclaredType  = returnType;
     Recur         = recur;
     ParameterList = parameterList ?? new List <VariableDeclaration>(0);
     EndLabel      = endLabel ?? new ReturnLabelDeclaration(MetaData, "");
 }
Beispiel #2
0
        public override void SurroundWith(Environment environment)
        {
            // base.SurroundWith(environment);
            Env = environment;
            Expression.SurroundWith(Env);
            if (null != ReturnLabel)
            {
                return;
            }
            var returnLabel = Env.FindReturnLabelByName(_labelName ?? "");

            if (null == returnLabel)
            {
                Errors.AddAndThrow($"{MetaData.GetErrorHeader()}cannot return outside a lambda");
            }
            else
            {
                ReturnLabel = returnLabel;
                ReturnLabel.StatementsUsingThis.Add(this);
            }
            if (Expression is AtomicExpression)
            {
                return;
            }
            var variableName = $"genRet{(ulong) GetHashCode()}";

            ConvertedVariableDeclaration =
                new VariableDeclaration(MetaData, variableName, Expression, type: Expression.GetExpressionType());
            ConvertedReturnStatement = new ReturnStatement(MetaData,
                                                           new VariableExpression(MetaData, variableName), _labelName)
            {
                ReturnLabel = ReturnLabel
            };
            ConvertedStatementList = new StatementList(MetaData,
                                                       ConvertedVariableDeclaration,
                                                       ConvertedReturnStatement);
        }