Re-apply r5790 to improve accuracy of JsParser's SourceInfo objects. git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5802 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/js/JsParser.java b/dev/core/src/com/google/gwt/dev/js/JsParser.java index 4f6e463..d8b9d1b 100644 --- a/dev/core/src/com/google/gwt/dev/js/JsParser.java +++ b/dev/core/src/com/google/gwt/dev/js/JsParser.java
@@ -29,6 +29,7 @@ import com.google.gwt.dev.js.ast.JsContinue; import com.google.gwt.dev.js.ast.JsDefault; import com.google.gwt.dev.js.ast.JsDoWhile; +import com.google.gwt.dev.js.ast.JsExprStmt; import com.google.gwt.dev.js.ast.JsExpression; import com.google.gwt.dev.js.ast.JsFor; import com.google.gwt.dev.js.ast.JsForIn; @@ -150,8 +151,12 @@ private SourceInfo makeSourceInfo(Node node) { SourceInfo parent = sourceInfoStack.peek(); - SourceInfo toReturn = program.createSourceInfo(node.getLineno(), - parent.getFileName()); + int lineno = node.getLineno(); + if (lineno == -1) { + // Rhino only reports line numbers for statement nodes, not expressions + return parent; + } + SourceInfo toReturn = program.createSourceInfo(lineno, parent.getFileName()); toReturn.copyMissingCorrelationsFrom(parent); return toReturn; } @@ -173,7 +178,7 @@ return null; case TokenStream.EXPRSTMT: - return mapExpression(node.getFirstChild()).makeStmt(); + return mapExprStmt(node); case TokenStream.REGEXP: return mapRegExp(node); @@ -418,8 +423,11 @@ } private JsBlock mapBlock(Node nodeStmts) throws JsParserException { - JsBlock block = new JsBlock(makeSourceInfo(nodeStmts)); + SourceInfo info = makeSourceInfo(nodeStmts); + JsBlock block = new JsBlock(info); + pushSourceInfo(info); mapStatements(block.getStatements(), nodeStmts); + popSourceInfo(); return block; } @@ -515,6 +523,9 @@ fromTestExpr = ifNode.getFirstChild().getNext(); } + SourceInfo info = makeSourceInfo(ifNode); + pushSourceInfo(info); + // Map the test expression. // JsExpression toTestExpr = mapExpression(fromTestExpr); @@ -523,12 +534,14 @@ // JsStatement toBody = mapStatement(fromBody); + popSourceInfo(); + // Create and attach the "while" or "do" statement we're mapping to. // if (isWhile) { - return new JsWhile(makeSourceInfo(ifNode), toTestExpr, toBody); + return new JsWhile(info, toTestExpr, toBody); } else { - return new JsDoWhile(makeSourceInfo(ifNode), toTestExpr, toBody); + return new JsDoWhile(info, toTestExpr, toBody); } } @@ -575,6 +588,13 @@ } } + private JsExprStmt mapExprStmt(Node node) throws JsParserException { + pushSourceInfo(makeSourceInfo(node)); + JsExpression expr = mapExpression(node.getFirstChild()); + popSourceInfo(); + return expr.makeStmt(); + } + private JsStatement mapForStatement(Node forNode) throws JsParserException { Node fromInit = forNode.getFirstChild(); Node fromTest = fromInit.getNext(); @@ -935,13 +955,16 @@ } private JsReturn mapReturn(Node returnNode) throws JsParserException { - JsReturn toReturn = new JsReturn(makeSourceInfo(returnNode)); + SourceInfo info = makeSourceInfo(returnNode); + JsReturn toReturn = new JsReturn(info); + pushSourceInfo(info); Node from = returnNode.getFirstChild(); if (from != null) { JsExpression to = mapExpression(from); toReturn.setExpr(to); } + popSourceInfo(); return toReturn; } @@ -1032,7 +1055,9 @@ } private JsSwitch mapSwitchStatement(Node switchNode) throws JsParserException { - JsSwitch toSwitch = new JsSwitch(makeSourceInfo(switchNode)); + SourceInfo info = makeSourceInfo(switchNode); + JsSwitch toSwitch = new JsSwitch(info); + pushSourceInfo(info); // The switch expression. // @@ -1078,15 +1103,20 @@ fromMember = fromMember.getNext(); } + popSourceInfo(); return toSwitch; } private JsThrow mapThrowStatement(Node throwNode) throws JsParserException { + SourceInfo info = makeSourceInfo(throwNode); + pushSourceInfo(info); + // Create, map, and attach. // Node fromExpr = throwNode.getFirstChild(); - JsThrow toThrow = new JsThrow(makeSourceInfo(throwNode), - mapExpression(fromExpr)); + JsThrow toThrow = new JsThrow(info, mapExpression(fromExpr)); + + popSourceInfo(); return toThrow; } @@ -1180,7 +1210,9 @@ } private JsVars mapVar(Node varNode) throws JsParserException { - JsVars toVars = new JsVars(makeSourceInfo(varNode)); + SourceInfo info = makeSourceInfo(varNode); + pushSourceInfo(info); + JsVars toVars = new JsVars(info); Node fromVar = varNode.getFirstChild(); while (fromVar != null) { // Use a conservative name allocation strategy that allocates all names @@ -1201,6 +1233,7 @@ fromVar = fromVar.getNext(); } + popSourceInfo(); return toVars; } @@ -1220,8 +1253,24 @@ sourceInfoStack.pop(); } + private void popSourceInfo() { + sourceInfoStack.pop(); + } + private void pushScope(JsScope scope, SourceInfo sourceInfo) { scopeStack.push(scope); sourceInfoStack.push(sourceInfo); } + + /** + * This should be called when processing any Rhino statement Node that has + * line number data so that enclosed expressions will have a useful source + * location. + * + * @see Node#hasLineno + */ + private void pushSourceInfo(SourceInfo sourceInfo) { + assert sourceInfo.getStartLine() >= 0 : "Bad SourceInfo line number"; + sourceInfoStack.push(sourceInfo); + } }