Skip to content

Commit

Permalink
[[FIX]] Report error for duplicate arrow params
Browse files Browse the repository at this point in the history
Ensure that duplicate parameters in arrow functions are always reported
as a SyntaxError (regardless of strict mode and regardless of whether
the function has a block body.
  • Loading branch information
jugglinmike authored and rwaldron committed Sep 6, 2017
1 parent 9606805 commit 506c7d5
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 14 deletions.
6 changes: 5 additions & 1 deletion src/jshint.js
Original file line number Diff line number Diff line change
Expand Up @@ -1795,7 +1795,7 @@ var JSHINT = (function() {
advance("}", t);

if (isfunc) {
state.funct["(scope)"].validateParams();
state.funct["(scope)"].validateParams(isfatarrow);
if (m) {
state.directive = m;
}
Expand All @@ -1812,6 +1812,10 @@ var JSHINT = (function() {
error("W118", state.tokens.curr, "function closure expressions");
}

if (isfatarrow) {
state.funct["(scope)"].validateParams(true);
}

expression(10);

if (state.option.strict && state.funct["(context)"]["(global)"]) {
Expand Down
4 changes: 2 additions & 2 deletions src/scope-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ var scopeManager = function(state, predefined, exported, declared) {
}
},

validateParams: function() {
validateParams: function(isArrow) {
var isStrict = state.isStrict();
var currentFunctParamScope = _currentFunctBody["(parent)"];

Expand All @@ -499,7 +499,7 @@ var scopeManager = function(state, predefined, exported, declared) {
var label = currentFunctParamScope["(labels)"][labelName];

if (label && label.duplicated) {
if (isStrict) {
if (isStrict || isArrow) {
warning("E011", label["(token)"], labelName);
} else if (state.option.shadow !== true) {
warning("W004", label["(token)"], labelName);
Expand Down
11 changes: 0 additions & 11 deletions tests/test262/expectations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -753,17 +753,6 @@ language/expressions/arrow-function/syntax/arrowparameters-cover-formalparameter
language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-futurereservedword.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-identifier-strict-futurereservedword.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-bindingidentifier-no-eval.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-1.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-2.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-array-3.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-1.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-2.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-3.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-4.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-5.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-binding-object-6.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates-rest.js
language/expressions/arrow-function/syntax/early-errors/arrowparameters-cover-no-duplicates.js
language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters-expression-body.js
language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js
language/expressions/arrow-function/syntax/early-errors/use-strict-with-non-simple-param.js
Expand Down
22 changes: 22 additions & 0 deletions tests/unit/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -1597,6 +1597,28 @@ exports.testDuplicateParamNames = function (test) {
.addError(18, 3, "Unnecessary directive \"use strict\".")
.test(src, { shadow: false });

src = [
"void ((x, x) => null);",
"void ((x, x) => {});",
"void ((x, x) => { 'use strict'; });",
"function f() {",
" 'use strict';",
" void ((x, x) => null);",
" void ((x, x) => {});",
" void ((x, x) => { 'use strict'; });",
"}"
];

TestRun(test, "Arrow functions - strict mode restriction")
.addError(1, 8, "'x' has already been declared.")
.addError(2, 8, "'x' has already been declared.")
.addError(3, 8, "'x' has already been declared.")
.addError(6, 10, "'x' has already been declared.")
.addError(7, 10, "'x' has already been declared.")
.addError(8, 10, "'x' has already been declared.")
.addError(8, 21, "Unnecessary directive \"use strict\".")
.test(src, { esversion: 6 });

test.done();
};

Expand Down

0 comments on commit 506c7d5

Please sign in to comment.