public override void SurroundWith(Environment environment) { base.SurroundWith(environment); var jmp = new JumpLabelDeclaration(MetaData, ""); jmp.SurroundWith(Env); EndLabel.SurroundWith(Env); // FEATURE #16 var conditionType = Condition.GetExpressionType().ToString(); if (!string.Equals(conditionType, PrimaryType.BoolType, StringComparison.Ordinal)) { Errors.Add( $"{MetaData.GetErrorHeader()}expected a bool as the \"while\" statement\'s condition, " + $"found {conditionType}"); } OkStatementList.Statements.Add(jmp); var bodyEnv = new Environment(Env); bodyEnv.Declarations.Add(EndLabel); OkStatementList.SurroundWith(bodyEnv); // FEATURE #17 if (Pragma.KeepAll || !(Condition is BoolLiteralExpression boolean) || boolean.Value) { return; } OptimizedStatementList = new StatementList(MetaData); Optimized = 1; }
public WhileExpression( MetaData metaData, [NotNull] Expression condition, [NotNull] StatementList okStatementList, [CanBeNull] JumpLabelDeclaration endLabel = null) : base(metaData, condition) { OkStatementList = okStatementList; EndLabel = endLabel ?? new JumpLabelDeclaration(MetaData, ""); }
public override void SurroundWith(Environment environment) { base.SurroundWith(environment); var jumpLabel = Env.FindJumpLabelByName(_labelName ?? ""); if (null == jumpLabel) { Errors.AddAndThrow($"{MetaData.GetErrorHeader()}cannot return outside a lambda"); } else { JumpLabel = jumpLabel; JumpLabel.StatementsUsingThis.Add(this); } }