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)); }
public override AstNode ShallowClone() { var res = new AstCatch(Source, Start, End, Argname); res.Body.AddRange(Body.AsReadOnlySpan()); return(res); }
AstCatch[] ReadCatchBlocks() { var len = Read7BitEncodedInt(); var result = new AstCatch[len]; for (var i = 0; i < len; i++) { result[i] = ReadCatch(); } return(result); }