| Code with Finding: |
class Parser {
/**
* Parse a 'var' or 'const' statement, or a 'var' init list in a for
* statement.
* @param context A token value: either VAR, CONST or FOR depending on
* context.
* @return The parsed statement
* @throws IOException
* @throws ParserException
*/
private Node variables(int context)
throws IOException, ParserException
{
Node pn;
boolean first = true;
JSDocInfo varInfo = null;
if (context == Token.CONST){
pn = nf.createVariables(Token.CONST, ts.getLineno(),
ts.getCharno());
decompiler.addToken(Token.CONST);
} else {
pn = nf.createVariables(Token.VAR, ts.getLineno(), ts.getCharno());
varInfo = ts.getAndResetJSDocInfo();
if (varInfo != null) {
pn.setJSDocInfo(varInfo);
}
decompiler.addToken(Token.VAR);
}
for (;;) {
Node name;
Node init;
mustMatchToken(Token.NAME, "msg.bad.var");
String s = ts.getString();
int lineno = ts.getLineno();
int charno = ts.getCharno();
JSDocInfo info = ts.getAndResetJSDocInfo();
if (!first)
decompiler.addToken(Token.COMMA);
first = false;
decompiler.addName(s);
if (context == Token.CONST) {
if (!currentScriptOrFn.addConst(s)) {
// We know it's already defined, since addConst passes if
// it's not defined at all. The addVar call just confirms
// what it is.
if (currentScriptOrFn.addVar(s) !=
ScriptOrFnNode.DUPLICATE_CONST)
addError("msg.var.redecl", s);
else
addError("msg.const.redecl", s);
}
} else {
int dupState = currentScriptOrFn.addVar(s);
if (dupState == ScriptOrFnNode.DUPLICATE_CONST)
addError("msg.const.redecl", s);
else if (dupState == ScriptOrFnNode.DUPLICATE_PARAMETER)
addStrictWarning("msg.var.hides.arg", s);
else if (dupState == ScriptOrFnNode.DUPLICATE_VAR)
addStrictWarning("msg.var.redecl", s);
}
name = nf.createTaggedName(s, info, lineno, charno);
// omitted check for argument hiding
if (matchToken(Token.ASSIGN)) {
decompiler.addToken(Token.ASSIGN);
init = assignExpr(context == Token.FOR);
nf.addChildToBack(name, init);
}
nf.addChildToBack(pn, name);
if (!matchToken(Token.COMMA))
break;
}
return pn;
}
}
|