Beispiel #1
0
    public override AstNode ShallowClone()
    {
        var res = new AstCase(Source, Start, End, Expression);

        res.Body.AddRange(Body.AsReadOnlySpan());
        return(res);
    }
    AstCase ProcessSwitchCaseNode(AstCase astCase)
    {
        var safeLastCaseExpression = _lastCaseExpression;
        var safeIsAfterLoopControl = IsAfterJump;

        _lastCaseExpression = astCase.Expression;
        Descend();
        _lastCaseExpression = safeLastCaseExpression;
        IsAfterJump         = safeIsAfterLoopControl;
        return(astCase);
    }
Beispiel #3
0
        AstSwitch ParseSwitchStatement(Position nodeStart)
        {
            Next();
            var discriminant = ParseParenExpression();
            var cases        = new StructList <AstNode>();

            Expect(TokenType.BraceL);
            EnterLexicalScope();

            var             startLoc         = Start;
            AstSwitchBranch consequent       = null;
            var             backupAllowBreak = _allowBreak;

            for (var sawDefault = false; Type != TokenType.BraceR;)
            {
                if (Type == TokenType.Case || Type == TokenType.Default)
                {
                    var isCase = Type == TokenType.Case;
                    if (consequent != null)
                    {
                        consequent.End = _lastTokEnd;
                    }

                    startLoc = Start;
                    Next();
                    _allowBreak = true;
                    if (isCase)
                    {
                        var test = ParseExpression();
                        consequent = new AstCase(this, startLoc, startLoc, test);
                    }
                    else
                    {
                        if (sawDefault)
                        {
                            RaiseRecoverable(_lastTokStart, "Multiple default clauses");
                        }
                        sawDefault = true;
                        consequent = new AstDefault(this, startLoc, startLoc);
                    }

                    cases.Add(consequent);
                    Expect(TokenType.Colon);
                }
                else
                {
                    if (consequent == null)
                    {
                        Raise(Start, "Unexpected token");
                    }

                    consequent.Body.Add(ParseStatement(true));
                }
            }

            ExitLexicalScope();
            if (consequent != null)
            {
                consequent.End = _lastTokEnd;
            }

            Next(); // Closing brace
            _allowBreak = backupAllowBreak;
            return(new AstSwitch(this, nodeStart, _lastTokEnd, discriminant, ref cases));
        }