Beispiel #1
0
        AstTry ParseTryStatement(Position nodeStart)
        {
            Next();
            var      block   = ParseBlock();
            AstCatch handler = null;

            if (Type == TokenType.Catch)
            {
                var startLocation = Start;
                Next();
                Expect(TokenType.ParenL);
                var param = ParseBindingAtom();
                EnterLexicalScope();
                CheckLVal(param, true, VariableKind.Let);
                param = new AstSymbolCatch((AstSymbol)param);
                Expect(TokenType.ParenR);
                var body = ParseBlock(false);
                ExitLexicalScope();
                handler = new AstCatch(this, startLocation, _lastTokEnd, param, ref body.Body);
            }

            var startOfFinally = CurPosition();
            var finalizerBody  = Eat(TokenType.Finally) ? ParseBlock() : null;

            if (handler == null && finalizerBody == null)
            {
                Raise(nodeStart, "Missing catch or finally clause");
            }
            var finalizer = finalizerBody != null
                ? new AstFinally(this, startOfFinally, finalizerBody.End, ref finalizerBody.Body)
                : null;

            return(new AstTry(this, nodeStart, _lastTokEnd, ref block.Body, handler, finalizer));
        }
Beispiel #2
0
    public override AstNode ShallowClone()
    {
        var res = new AstCatch(Source, Start, End, Argname);

        res.Body.AddRange(Body.AsReadOnlySpan());
        return(res);
    }
Beispiel #3
0
        AstCatch[] ReadCatchBlocks()
        {
            var len    = Read7BitEncodedInt();
            var result = new AstCatch[len];

            for (var i = 0; i < len; i++)
            {
                result[i] = ReadCatch();
            }
            return(result);
        }