public override void Visit(BreakExpressionNode node) { var kw = node.BreakKeywordToken; if (!kw.IsMissing) { var func = _scope.Function !; if (func.GetLoop() is PrimaryExpressionNode loop) { var block = loop switch { ForExpressionNode f => f.Body, WhileExpressionNode w => w.Body, _ => throw DebugAssert.Unreachable(), }; node.SetAnnotation("Target", loop); node.SetAnnotation("Uses", func.GetUses(func.GetDepth(block))); } else { Error(node, SyntaxDiagnosticKind.InvalidLoopTarget, kw.Location, "No enclosing 'while' or 'for' expression for this 'break' expression"); } } base.Visit(node); }
public override void Visit(WhileExpressionNode node) { Visit(node.Condition); _scope.Function !.PushLoop(node); Visit(node.Body); _scope.Function.PopLoop(); }