Skip to content

Commit

Permalink
[[FIX]] Don't throw W080 when the initializer starts with undefined
Browse files Browse the repository at this point in the history
Example:
   var a = undefined === 0; // a is 'false', not 'undefined'

Fixes gh-2699
  • Loading branch information
nicolo-ribaudo authored and jugglinmike committed Oct 25, 2015
1 parent 84a9145 commit 0d87919
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 13 deletions.
31 changes: 18 additions & 13 deletions src/jshint.js
Original file line number Diff line number Diff line change
Expand Up @@ -3452,6 +3452,8 @@ var JSHINT = (function() {
}
}
};

var id, value;
if (checkPunctuator(firstToken, "[")) {
if (!openingParsed) {
advance("[");
Expand All @@ -3472,10 +3474,11 @@ var JSHINT = (function() {
} else {
advance("=");
}
if (state.tokens.next.id === "undefined") {
warning("W080", state.tokens.prev, state.tokens.prev.value);
id = state.tokens.prev;
value = expression(10);
if (value && value.type === "undefined") {
warning("W080", id, id.value);
}
expression(10);
}
if (!checkPunctuator(state.tokens.next, "]")) {
advance(",");
Expand All @@ -3494,10 +3497,11 @@ var JSHINT = (function() {
assignmentProperty();
if (checkPunctuator(state.tokens.next, "=")) {
advance("=");
if (state.tokens.next.id === "undefined") {
warning("W080", state.tokens.prev, state.tokens.prev.value);
id = state.tokens.prev;
value = expression(10);
if (value && value.type === "undefined") {
warning("W080", id, id.value);
}
expression(10);
}
if (!checkPunctuator(state.tokens.next, "}")) {
advance(",");
Expand Down Expand Up @@ -3592,14 +3596,15 @@ var JSHINT = (function() {

if (state.tokens.next.id === "=") {
advance("=");
if (!prefix && state.tokens.next.id === "undefined") {
warning("W080", state.tokens.prev, state.tokens.prev.value);
}
if (!prefix && peek(0).id === "=" && state.tokens.next.identifier) {
warning("W120", state.tokens.next, state.tokens.next.value);
}
var id = state.tokens.prev;
// don't accept `in` in expression if prefix is used for ForIn/Of loop.
value = expression(prefix ? 120 : 10);
if (!prefix && value && value.type === "undefined") {
warning("W080", id, id.value);
}
if (lone) {
tokens[0].first = value;
} else {
Expand Down Expand Up @@ -3698,19 +3703,19 @@ var JSHINT = (function() {
state.nameStack.set(state.tokens.curr);

advance("=");
if (!prefix && report && !state.funct["(loopage)"] &&
state.tokens.next.id === "undefined") {
warning("W080", state.tokens.prev, state.tokens.prev.value);
}
if (peek(0).id === "=" && state.tokens.next.identifier) {
if (!prefix && report &&
!state.funct["(params)"] ||
state.funct["(params)"].indexOf(state.tokens.next.value) === -1) {
warning("W120", state.tokens.next, state.tokens.next.value);
}
}
var id = state.tokens.prev;
// don't accept `in` in expression if prefix is used for ForIn/Of loop.
value = expression(prefix ? 120 : 10);
if (value && !prefix && report && !state.funct["(loopage)"] && value.type === "undefined") {
warning("W080", id, id.value);
}
if (lone) {
tokens[0].first = value;
} else {
Expand Down
8 changes: 8 additions & 0 deletions tests/unit/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -771,6 +771,14 @@ exports.testUndefinedAssignment = function (test) {
"var i = undefined;",
"const j = undefined;",
"let k = undefined;",
"// jshint +W080",
"var l = undefined === 0;",
"const m = undefined === 0;",
"let n = undefined === 0;",
"let [ o = undefined === 0 ] = [];",
"[ o = undefined === 0] = [];",
"let { p = undefined === 0, x: q = undefined === 0 } = {};",
"({ p = undefined === 0, x: q = undefined === 0 } = {});"
];

TestRun(test)
Expand Down

0 comments on commit 0d87919

Please sign in to comment.