From a6500d7baac47f701ef5afecc528170b045b2753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 29 Sep 2015 21:41:34 +0200 Subject: [PATCH] [[FIX]] Don't throw W080 when the initializer starts with `undefined` Example: var a = undefined === 0; // a is 'false', not 'undefined' Fixes gh-2699 --- src/jshint.js | 31 ++++++++++++++++++------------- tests/unit/core.js | 8 ++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index bbf9942143..3dfb8fd0db 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -3451,6 +3451,8 @@ var JSHINT = (function() { } } }; + + var id, value; if (checkPunctuator(firstToken, "[")) { if (!openingParsed) { advance("["); @@ -3471,10 +3473,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(","); @@ -3493,10 +3496,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(","); @@ -3591,14 +3595,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 { @@ -3697,10 +3702,6 @@ 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)"] || @@ -3708,8 +3709,12 @@ var JSHINT = (function() { 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 { diff --git a/tests/unit/core.js b/tests/unit/core.js index 5bda9a4989..d96720f9ad 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -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)