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