(boolean isStatement, int pos)
| 2556 | |
| 2557 | // have to pass in 'let' kwd position to compute kid offsets properly |
| 2558 | private AstNode let(boolean isStatement, int pos) throws IOException { |
| 2559 | LetNode pn = new LetNode(pos); |
| 2560 | pn.setLineColumnNumber(lineNumber(), columnNumber()); |
| 2561 | if (mustMatchToken(Token.LP, "msg.no.paren.after.let", true)) pn.setLp(ts.tokenBeg - pos); |
| 2562 | pushScope(pn); |
| 2563 | try { |
| 2564 | VariableDeclaration vars = variables(Token.LET, ts.tokenBeg, isStatement); |
| 2565 | pn.setVariables(vars); |
| 2566 | if (mustMatchToken(Token.RP, "msg.no.paren.let", true)) { |
| 2567 | pn.setRp(ts.tokenBeg - pos); |
| 2568 | } |
| 2569 | if (isStatement && peekToken() == Token.LC) { |
| 2570 | // let statement |
| 2571 | consumeToken(); |
| 2572 | int beg = ts.tokenBeg; // position stmt at LC |
| 2573 | AstNode stmt = statements(); |
| 2574 | mustMatchToken(Token.RC, "msg.no.curly.let", true); |
| 2575 | stmt.setLength(ts.tokenEnd - beg); |
| 2576 | pn.setLength(ts.tokenEnd - pos); |
| 2577 | pn.setBody(stmt); |
| 2578 | pn.setType(Token.LET); |
| 2579 | } else { |
| 2580 | // let expression |
| 2581 | AstNode expr = expr(false); |
| 2582 | pn.setLength(getNodeEnd(expr) - pos); |
| 2583 | pn.setBody(expr); |
| 2584 | if (isStatement) { |
| 2585 | // let expression in statement context |
| 2586 | ExpressionStatement es = new ExpressionStatement(pn, !insideFunctionBody()); |
| 2587 | es.setLineColumnNumber(pn.getLineno(), pn.getColumn()); |
| 2588 | return es; |
| 2589 | } |
| 2590 | } |
| 2591 | } finally { |
| 2592 | popScope(); |
| 2593 | } |
| 2594 | return pn; |
| 2595 | } |
| 2596 | |
| 2597 | void defineSymbol(int declType, String name) { |
| 2598 | defineSymbol(declType, name, false); |
no test coverage detected