コード例 #1
0
ファイル: LanguageAnalyzer.cs プロジェクト: alexrp/flare
                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);
                }
コード例 #2
0
ファイル: LanguageAnalyzer.cs プロジェクト: alexrp/flare
                public override void Visit(WhileExpressionNode node)
                {
                    Visit(node.Condition);

                    _scope.Function !.PushLoop(node);

                    Visit(node.Body);

                    _scope.Function.PopLoop();
                }