Skip to content

Commit

Permalink
[[FEAT]] Implement support for ES8 trailing commas
Browse files Browse the repository at this point in the history
  • Loading branch information
jugglinmike authored and rwaldron committed Jul 24, 2018
1 parent 7acea75 commit 94d7a7e
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 95 deletions.
14 changes: 9 additions & 5 deletions src/jshint.js
Expand Up @@ -1071,12 +1071,11 @@ var JSHINT = (function() {
case "}":
case "]":
case ",":
case ")":
if (opts.allowTrailing) {
return true;
}

/* falls through */
case ")":
error("E024", state.tokens.next, state.tokens.next.value);
return false;
}
Expand Down Expand Up @@ -3211,13 +3210,18 @@ var JSHINT = (function() {

// now we have evaluated the default expression, add the variable to the param scope
currentParams.forEach(addParam);

if (state.tokens.next.id === ",") {
if (pastRest) {
warning("W131", state.tokens.next);
}
parseComma();
} else {
parseComma({ allowTrailing: true });
}

if (state.tokens.next.id === ")") {
if (state.tokens.curr.id === "," && !state.inES8()) {
warning("W119", state.tokens.curr, "Trailing comma in function parameters", "8");
}

advance(")", next);
return {
arity: arity,
Expand Down
9 changes: 9 additions & 0 deletions src/state.js
Expand Up @@ -65,6 +65,15 @@ var state = {
return this.option.moz;
},

/**
* Determine if constructs introduced in ECMAScript 8 should be accepted.
*
* @returns {boolean}
*/
inES8: function() {
return this.esVersion >= 8;
},

/**
* Determine if constructs introduced in ECMAScript 7 should be accepted.
*
Expand Down
90 changes: 0 additions & 90 deletions tests/test262/expectations.txt
Expand Up @@ -2711,14 +2711,8 @@ test/language/expressions/generators/dflt-params-ref-later.js(default)
test/language/expressions/generators/dflt-params-ref-later.js(strict mode)
test/language/expressions/generators/dflt-params-ref-self.js(default)
test/language/expressions/generators/dflt-params-ref-self.js(strict mode)
test/language/expressions/generators/dflt-params-trailing-comma.js(default)
test/language/expressions/generators/dflt-params-trailing-comma.js(strict mode)
test/language/expressions/generators/named-yield-identifier-non-strict.js(default)
test/language/expressions/generators/named-yield-identifier-spread-non-strict.js(default)
test/language/expressions/generators/params-trailing-comma-multiple.js(default)
test/language/expressions/generators/params-trailing-comma-multiple.js(strict mode)
test/language/expressions/generators/params-trailing-comma-single.js(default)
test/language/expressions/generators/params-trailing-comma-single.js(strict mode)
test/language/expressions/generators/yield-identifier-non-strict.js(default)
test/language/expressions/generators/yield-identifier-spread-non-strict.js(default)
test/language/expressions/async-generator/args-trailing-comma-multiple.js(default)
Expand Down Expand Up @@ -3757,12 +3751,6 @@ test/language/expressions/function/dflt-params-ref-later.js(default)
test/language/expressions/function/dflt-params-ref-later.js(strict mode)
test/language/expressions/function/dflt-params-ref-self.js(default)
test/language/expressions/function/dflt-params-ref-self.js(strict mode)
test/language/expressions/function/dflt-params-trailing-comma.js(default)
test/language/expressions/function/dflt-params-trailing-comma.js(strict mode)
test/language/expressions/function/params-trailing-comma-multiple.js(default)
test/language/expressions/function/params-trailing-comma-multiple.js(strict mode)
test/language/expressions/function/params-trailing-comma-single.js(default)
test/language/expressions/function/params-trailing-comma-single.js(strict mode)
test/language/expressions/class/accessor-name-inst-computed-yield-expr.js(default)
test/language/expressions/class/accessor-name-inst-computed-yield-expr.js(strict mode)
test/language/expressions/class/accessor-name-inst-literal-string-unicode-escape.js(default)
Expand Down Expand Up @@ -4795,42 +4783,18 @@ test/language/expressions/class/gen-meth-dflt-params-ref-later.js(default)
test/language/expressions/class/gen-meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/class/gen-meth-dflt-params-ref-self.js(default)
test/language/expressions/class/gen-meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/class/gen-meth-dflt-params-trailing-comma.js(default)
test/language/expressions/class/gen-meth-dflt-params-trailing-comma.js(strict mode)
test/language/expressions/class/gen-meth-params-trailing-comma-multiple.js(default)
test/language/expressions/class/gen-meth-params-trailing-comma-multiple.js(strict mode)
test/language/expressions/class/gen-meth-params-trailing-comma-single.js(default)
test/language/expressions/class/gen-meth-params-trailing-comma-single.js(strict mode)
test/language/expressions/class/gen-meth-static-dflt-params-ref-later.js(default)
test/language/expressions/class/gen-meth-static-dflt-params-ref-later.js(strict mode)
test/language/expressions/class/gen-meth-static-dflt-params-ref-self.js(default)
test/language/expressions/class/gen-meth-static-dflt-params-ref-self.js(strict mode)
test/language/expressions/class/gen-meth-static-dflt-params-trailing-comma.js(default)
test/language/expressions/class/gen-meth-static-dflt-params-trailing-comma.js(strict mode)
test/language/expressions/class/gen-meth-static-params-trailing-comma-multiple.js(default)
test/language/expressions/class/gen-meth-static-params-trailing-comma-multiple.js(strict mode)
test/language/expressions/class/gen-meth-static-params-trailing-comma-single.js(default)
test/language/expressions/class/gen-meth-static-params-trailing-comma-single.js(strict mode)
test/language/expressions/class/meth-dflt-params-ref-later.js(default)
test/language/expressions/class/meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/class/meth-dflt-params-ref-self.js(default)
test/language/expressions/class/meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/class/meth-dflt-params-trailing-comma.js(default)
test/language/expressions/class/meth-dflt-params-trailing-comma.js(strict mode)
test/language/expressions/class/meth-params-trailing-comma-multiple.js(default)
test/language/expressions/class/meth-params-trailing-comma-multiple.js(strict mode)
test/language/expressions/class/meth-params-trailing-comma-single.js(default)
test/language/expressions/class/meth-params-trailing-comma-single.js(strict mode)
test/language/expressions/class/meth-static-dflt-params-ref-later.js(default)
test/language/expressions/class/meth-static-dflt-params-ref-later.js(strict mode)
test/language/expressions/class/meth-static-dflt-params-ref-self.js(default)
test/language/expressions/class/meth-static-dflt-params-ref-self.js(strict mode)
test/language/expressions/class/meth-static-dflt-params-trailing-comma.js(default)
test/language/expressions/class/meth-static-dflt-params-trailing-comma.js(strict mode)
test/language/expressions/class/meth-static-params-trailing-comma-multiple.js(default)
test/language/expressions/class/meth-static-params-trailing-comma-multiple.js(strict mode)
test/language/expressions/class/meth-static-params-trailing-comma-single.js(default)
test/language/expressions/class/meth-static-params-trailing-comma-single.js(strict mode)
test/language/expressions/object/accessor-name-computed-yield-expr.js(default)
test/language/expressions/object/accessor-name-computed-yield-expr.js(strict mode)
test/language/expressions/object/accessor-name-computed-yield-id.js(default)
Expand Down Expand Up @@ -5352,34 +5316,16 @@ test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-late
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-self.js(default)
test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/object/method-definition/gen-meth-dflt-params-trailing-comma.js(default)
test/language/expressions/object/method-definition/gen-meth-dflt-params-trailing-comma.js(strict mode)
test/language/expressions/object/method-definition/gen-meth-params-trailing-comma-multiple.js(default)
test/language/expressions/object/method-definition/gen-meth-params-trailing-comma-multiple.js(strict mode)
test/language/expressions/object/method-definition/gen-meth-params-trailing-comma-single.js(default)
test/language/expressions/object/method-definition/gen-meth-params-trailing-comma-single.js(strict mode)
test/language/expressions/object/method-definition/gen-yield-identifier-non-strict.js(default)
test/language/expressions/object/method-definition/gen-yield-identifier-spread-non-strict.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-ref-later.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-ref-later.js(strict mode)
test/language/expressions/object/method-definition/meth-dflt-params-ref-self.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-ref-self.js(strict mode)
test/language/expressions/object/method-definition/meth-dflt-params-trailing-comma.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-trailing-comma.js(strict mode)
test/language/expressions/object/method-definition/meth-params-trailing-comma-multiple.js(default)
test/language/expressions/object/method-definition/meth-params-trailing-comma-multiple.js(strict mode)
test/language/expressions/object/method-definition/meth-params-trailing-comma-single.js(default)
test/language/expressions/object/method-definition/meth-params-trailing-comma-single.js(strict mode)
test/language/expressions/arrow-function/dflt-params-ref-later.js(default)
test/language/expressions/arrow-function/dflt-params-ref-later.js(strict mode)
test/language/expressions/arrow-function/dflt-params-ref-self.js(default)
test/language/expressions/arrow-function/dflt-params-ref-self.js(strict mode)
test/language/expressions/arrow-function/dflt-params-trailing-comma.js(default)
test/language/expressions/arrow-function/dflt-params-trailing-comma.js(strict mode)
test/language/expressions/arrow-function/params-trailing-comma-single.js(default)
test/language/expressions/arrow-function/params-trailing-comma-single.js(strict mode)
test/language/expressions/arrow-function/params-trailing-comma-multiple.js(default)
test/language/expressions/arrow-function/params-trailing-comma-multiple.js(strict mode)

# Async iteration
test/language/statements/for-await-of/async-func-dstr-const-ary-init-iter-close.js(default)
Expand Down Expand Up @@ -6137,22 +6083,10 @@ test/language/statements/function/dflt-params-ref-later.js(default)
test/language/statements/function/dflt-params-ref-later.js(strict mode)
test/language/statements/function/dflt-params-ref-self.js(default)
test/language/statements/function/dflt-params-ref-self.js(strict mode)
test/language/statements/function/dflt-params-trailing-comma.js(default)
test/language/statements/function/dflt-params-trailing-comma.js(strict mode)
test/language/statements/function/params-trailing-comma-multiple.js(default)
test/language/statements/function/params-trailing-comma-multiple.js(strict mode)
test/language/statements/function/params-trailing-comma-single.js(default)
test/language/statements/function/params-trailing-comma-single.js(strict mode)
test/language/statements/generators/dflt-params-ref-later.js(default)
test/language/statements/generators/dflt-params-ref-later.js(strict mode)
test/language/statements/generators/dflt-params-ref-self.js(default)
test/language/statements/generators/dflt-params-ref-self.js(strict mode)
test/language/statements/generators/dflt-params-trailing-comma.js(default)
test/language/statements/generators/dflt-params-trailing-comma.js(strict mode)
test/language/statements/generators/params-trailing-comma-multiple.js(default)
test/language/statements/generators/params-trailing-comma-multiple.js(strict mode)
test/language/statements/generators/params-trailing-comma-single.js(default)
test/language/statements/generators/params-trailing-comma-single.js(strict mode)
test/language/statements/generators/yield-identifier-non-strict.js(default)
test/language/statements/generators/yield-identifier-spread-non-strict.js(default)
test/language/statements/class/accessor-name-inst-computed-yield-expr.js(default)
Expand Down Expand Up @@ -7188,42 +7122,18 @@ test/language/statements/class/gen-meth-dflt-params-ref-later.js(default)
test/language/statements/class/gen-meth-dflt-params-ref-later.js(strict mode)
test/language/statements/class/gen-meth-dflt-params-ref-self.js(default)
test/language/statements/class/gen-meth-dflt-params-ref-self.js(strict mode)
test/language/statements/class/gen-meth-dflt-params-trailing-comma.js(default)
test/language/statements/class/gen-meth-dflt-params-trailing-comma.js(strict mode)
test/language/statements/class/gen-meth-params-trailing-comma-multiple.js(default)
test/language/statements/class/gen-meth-params-trailing-comma-multiple.js(strict mode)
test/language/statements/class/gen-meth-params-trailing-comma-single.js(default)
test/language/statements/class/gen-meth-params-trailing-comma-single.js(strict mode)
test/language/statements/class/gen-meth-static-dflt-params-ref-later.js(default)
test/language/statements/class/gen-meth-static-dflt-params-ref-later.js(strict mode)
test/language/statements/class/gen-meth-static-dflt-params-ref-self.js(default)
test/language/statements/class/gen-meth-static-dflt-params-ref-self.js(strict mode)
test/language/statements/class/gen-meth-static-dflt-params-trailing-comma.js(default)
test/language/statements/class/gen-meth-static-dflt-params-trailing-comma.js(strict mode)
test/language/statements/class/gen-meth-static-params-trailing-comma-multiple.js(default)
test/language/statements/class/gen-meth-static-params-trailing-comma-multiple.js(strict mode)
test/language/statements/class/gen-meth-static-params-trailing-comma-single.js(default)
test/language/statements/class/gen-meth-static-params-trailing-comma-single.js(strict mode)
test/language/statements/class/meth-dflt-params-ref-later.js(default)
test/language/statements/class/meth-dflt-params-ref-later.js(strict mode)
test/language/statements/class/meth-dflt-params-ref-self.js(default)
test/language/statements/class/meth-dflt-params-ref-self.js(strict mode)
test/language/statements/class/meth-dflt-params-trailing-comma.js(default)
test/language/statements/class/meth-dflt-params-trailing-comma.js(strict mode)
test/language/statements/class/meth-params-trailing-comma-multiple.js(default)
test/language/statements/class/meth-params-trailing-comma-multiple.js(strict mode)
test/language/statements/class/meth-params-trailing-comma-single.js(default)
test/language/statements/class/meth-params-trailing-comma-single.js(strict mode)
test/language/statements/class/meth-static-dflt-params-ref-later.js(default)
test/language/statements/class/meth-static-dflt-params-ref-later.js(strict mode)
test/language/statements/class/meth-static-dflt-params-ref-self.js(default)
test/language/statements/class/meth-static-dflt-params-ref-self.js(strict mode)
test/language/statements/class/meth-static-dflt-params-trailing-comma.js(default)
test/language/statements/class/meth-static-dflt-params-trailing-comma.js(strict mode)
test/language/statements/class/meth-static-params-trailing-comma-multiple.js(default)
test/language/statements/class/meth-static-params-trailing-comma-multiple.js(strict mode)
test/language/statements/class/meth-static-params-trailing-comma-single.js(default)
test/language/statements/class/meth-static-params-trailing-comma-single.js(strict mode)

# JSHint currently makes no attempt to resolve module references, so it is
# incapable of detecting early errors across modules.
Expand Down
18 changes: 18 additions & 0 deletions tests/unit/parser.js
Expand Up @@ -8908,3 +8908,21 @@ exports.letAsIdentifier = function (test) {

test.done();
};

exports.trailingParameterComma = function(test) {
var code = 'function f(x,) {}';

TestRun(test, 'declaration in ES5')
.addError(1, 13, "'Trailing comma in function parameters' is only available in ES8 (use 'esversion: 8').")
.test(code, { esversion: 5 });
TestRun(test, 'declaration in ES6')
.addError(1, 13, "'Trailing comma in function parameters' is only available in ES8 (use 'esversion: 8').")
.test(code, { esversion: 6 });
TestRun(test, 'declaration in ES7')
.addError(1, 13, "'Trailing comma in function parameters' is only available in ES8 (use 'esversion: 8').")
.test(code, { esversion: 7 });
TestRun(test, 'declaration in ES8')
.test(code, { esversion: 8 });

test.done();
};

0 comments on commit 94d7a7e

Please sign in to comment.