Skip to content

Commit

Permalink
[[FIX]] Correct restrictions on class method names
Browse files Browse the repository at this point in the history
  • Loading branch information
jugglinmike authored and rwaldron committed Apr 9, 2019
1 parent c0e9a5b commit f670aeb
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
8 changes: 5 additions & 3 deletions src/jshint.js
Expand Up @@ -2879,8 +2879,10 @@ var JSHINT = (function() {
doMethod(classToken, context, name, false);
} else {
name = propertyName(context);
if (name === "prototype" || name === "constructor") {
if (!isStatic && name === "constructor") {
error("E049", state.tokens.curr, "class " + accessorType + "ter method", name);
} else if (isStatic && name === "prototype") {
error("E049", state.tokens.curr, "static class " + accessorType + "ter method", name);
}
saveAccessor(accessorType, props, name, state.tokens.curr, true, isStatic);
doMethod(classToken, context, state.nameStack.infer(), false);
Expand All @@ -2899,8 +2901,8 @@ var JSHINT = (function() {
advance();
break;
}
if (name === "prototype") {
error("E049", token, "class method", name);
if (isStatic && name === "prototype") {
error("E049", token, "static class method", name);
}
saveProperty(props, name, token, true, isStatic);
doMethod(classToken, context, name, inGenerator);
Expand Down
4 changes: 0 additions & 4 deletions tests/test262/expectations.txt
Expand Up @@ -10808,8 +10808,6 @@ test/language/expressions/class/elements/syntax/valid/grammar-privatename-no-ini
test/language/expressions/class/elements/syntax/valid/grammar-privatename-no-initializer-with-method.js(strict mode)
test/language/expressions/class/elements/syntax/valid/grammar-privatenames-multi-line.js(default)
test/language/expressions/class/elements/syntax/valid/grammar-privatenames-multi-line.js(strict mode)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js(default)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js(strict mode)
test/language/expressions/class/elements/syntax/valid/grammar-static-private-async-gen-meth-prototype.js(default)
test/language/expressions/class/elements/syntax/valid/grammar-static-private-async-gen-meth-prototype.js(strict mode)
test/language/expressions/class/elements/syntax/valid/grammar-static-private-async-meth-prototype.js(default)
Expand Down Expand Up @@ -10842,8 +10840,6 @@ test/language/statements/class/elements/syntax/valid/grammar-privatename-no-init
test/language/statements/class/elements/syntax/valid/grammar-privatename-no-initializer-with-method.js(strict mode)
test/language/statements/class/elements/syntax/valid/grammar-privatenames-multi-line.js(default)
test/language/statements/class/elements/syntax/valid/grammar-privatenames-multi-line.js(strict mode)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js(default)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js(strict mode)
test/language/statements/class/elements/syntax/valid/grammar-static-private-async-gen-meth-prototype.js(default)
test/language/statements/class/elements/syntax/valid/grammar-static-private-async-gen-meth-prototype.js(strict mode)
test/language/statements/class/elements/syntax/valid/grammar-static-private-async-meth-prototype.js(default)
Expand Down
41 changes: 40 additions & 1 deletion tests/unit/parser.js
Expand Up @@ -6661,7 +6661,6 @@ exports["class and method naming"] = function (test) {
.addError(2, 7, "Strict violation.")
.addError(4, 7, "A class getter method cannot be named 'constructor'.")
.addError(5, 7, "A class setter method cannot be named 'constructor'.")
.addError(6, 3, "A class method cannot be named 'prototype'.")
.addError(7, 6, "Class properties must be methods. Expected '(' but instead saw 'extra'.")
.addError(8, 11, "Class properties must be methods. Expected '(' but instead saw 'extraIdent1'.")
.addError(9, 11, "Class properties must be methods. Expected '(' but instead saw 'extraIdent2'.")
Expand All @@ -6681,6 +6680,46 @@ exports["class and method naming"] = function (test) {

run.test(code, {esnext: true});

TestRun(test, "valid uses of name `constructor`")
.test([
"void class {",
" constructor() {}",
"};",
"void class {",
" static constructor() {}",
"};",
"void class {",
" static get constructor() {}",
"};"
], {esversion: 6});

TestRun(test, "valid uses of name `prototype`")
.test([
"void class {",
" get prototype() {}",
"};",
"void class {",
" get prototype() {}",
" set prototype(x) {}",
"};"
], {esversion: 6});

TestRun(test, "invalid use of name `prototype`: static method")
.addError(2, 10, "A static class method cannot be named 'prototype'.")
.test([
"void class {",
" static prototype() {}",
"};"
], {esversion: 6});

TestRun(test, "invalid use of name `prototype`: static accessor method")
.addError(2, 14, "A static class getter method cannot be named 'prototype'.")
.test([
"void class {",
" static get prototype() {}",
"};"
], {esversion: 6});

TestRun(test, "hazardous method names (see gh-3358)")
.addError(3, 17, "'hasOwnProperty' is a really bad name.")
.test([
Expand Down

0 comments on commit f670aeb

Please sign in to comment.