LNode TryStmt(int startIndex)
{
TokenType la0, la1;
LNode handler = default(LNode);
var trykw = MatchAny();
var header = Stmt();
// line 2039
var parts = new VList<LNode> {
header
};
LNode varExpr;
LNode whenExpr;
// Line 2042: greedy(TT.Catch (TT.LParen TT.RParen / ) (&{Is($LI, _when)} TT.ContextualKeyword TT.LParen TT.RParen / ) Stmt)*
for (;;) {
la0 = LA0;
if (la0 == TT.Catch) {
var kw = MatchAny();
// Line 2043: (TT.LParen TT.RParen / )
la0 = LA0;
if (la0 == TT.LParen) {
la1 = LA(1);
if (la1 == TT.RParen) {
var p = MatchAny();
Skip();
// line 2043
varExpr = SingleExprInside(p, "catch (...)", true);
} else
// line 2044
varExpr = MissingHere();
} else
// line 2044
varExpr = MissingHere();
// Line 2045: (&{Is($LI, _when)} TT.ContextualKeyword TT.LParen TT.RParen / )
la0 = LA0;
if (la0 == TT.ContextualKeyword) {
if (Is(0, _when)) {
la1 = LA(1);
if (la1 == TT.LParen) {
Skip();
var c = MatchAny();
Match((int) TT.RParen);
// line 2046
whenExpr = SingleExprInside(c, "when (...)");
} else
// line 2047
whenExpr = MissingHere();
} else
// line 2047
whenExpr = MissingHere();
} else
// line 2047
whenExpr = MissingHere();
handler = Stmt();
// line 2049
parts.Add(F.Call(kw, LNode.List(varExpr, whenExpr, handler), kw.StartIndex, handler.Range.EndIndex));
} else
break;
}
// Line 2052: greedy(TT.Finally Stmt)*
for (;;) {
la0 = LA0;
if (la0 == TT.Finally) {
var kw = MatchAny();
handler = Stmt();
// line 2053
parts.Add(F.Call(kw, handler, kw.StartIndex, handler.Range.EndIndex));
} else
break;
}
// line 2056
var result = F.Call(trykw, parts, startIndex, parts.Last.Range.EndIndex);
if (parts.Count == 1) {
Error(result, "'try': At least one 'catch' or 'finally' clause is required");
}
return result;
}