From 0f0acd8cf77618a3547b1f7a3b29f9762a45013a Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 14 Jun 2020 22:46:05 -0400 Subject: [PATCH] [[FIX]] Limit positions for class declarations JSHint already includes logic to disallow `let` and `const` declarations in certain statement positions. Extend the definition of `class` tokens so that it applies the same restrictions to class declarations. --- src/jshint.js | 7 ++++--- tests/test262/expectations.txt | 19 ------------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 49e7b5540c..5ae1ae3904 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -2743,8 +2743,7 @@ var JSHINT = (function() { state.syntax["new"].exps = true; - // Class statement - blockstmt("class", function(context) { + var classDeclaration = blockstmt("class", function(context) { var className, classNameToken; var inexport = context & prodParams.export; @@ -2782,7 +2781,9 @@ var JSHINT = (function() { state.funct["(scope)"].stack(); classBody(this, context); return this; - }).exps = true; + }); + classDeclaration.exps = true; + classDeclaration.declaration = true; /* Class expression diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 2aef55d545..5b6f986122 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -207,24 +207,12 @@ test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-inv test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters-expression-body.js(strict mode) test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js(default) test/language/expressions/arrow-function/syntax/early-errors/asi-restriction-invalid-parenless-parameters.js(strict mode) -test/language/statements/do-while/decl-cls.js(default) -test/language/statements/do-while/decl-cls.js(strict mode) -test/language/statements/for-in/decl-cls.js(default) -test/language/statements/for-in/decl-cls.js(strict mode) test/language/statements/for-in/head-const-bound-names-fordecl-tdz.js(default) test/language/statements/for-in/head-const-bound-names-fordecl-tdz.js(strict mode) test/language/statements/for-in/head-let-bound-names-fordecl-tdz.js(default) test/language/statements/for-in/head-let-bound-names-fordecl-tdz.js(strict mode) test/language/statements/for-in/head-lhs-let.js(default) -test/language/statements/for/decl-cls.js(default) -test/language/statements/for/decl-cls.js(strict mode) test/language/statements/for/head-lhs-let.js(default) -test/language/statements/if/if-cls-else-cls.js(default) -test/language/statements/if/if-cls-else-cls.js(strict mode) -test/language/statements/if/if-cls-else-stmt.js(default) -test/language/statements/if/if-cls-else-stmt.js(strict mode) -test/language/statements/if/if-cls-no-else.js(default) -test/language/statements/if/if-cls-no-else.js(strict mode) test/language/statements/if/if-decl-else-decl-strict.js(strict mode) test/language/statements/if/if-decl-else-stmt-strict.js(strict mode) test/language/statements/if/if-decl-no-else-strict.js(strict mode) @@ -237,8 +225,6 @@ test/language/statements/if/if-gen-else-stmt.js(default) test/language/statements/if/if-gen-else-stmt.js(strict mode) test/language/statements/if/if-gen-no-else.js(default) test/language/statements/if/if-gen-no-else.js(strict mode) -test/language/statements/if/if-stmt-else-cls.js(default) -test/language/statements/if/if-stmt-else-cls.js(strict mode) test/language/statements/if/if-stmt-else-decl-strict.js(strict mode) test/language/statements/if/if-stmt-else-fun-strict.js(strict mode) test/language/statements/if/if-stmt-else-gen.js(default) @@ -279,21 +265,16 @@ test/language/statements/return/S12.9_A1_T8.js(default) test/language/statements/return/S12.9_A1_T8.js(strict mode) test/language/statements/return/S12.9_A1_T9.js(default) test/language/statements/return/S12.9_A1_T9.js(strict mode) -test/language/statements/for-of/decl-cls.js(default) -test/language/statements/for-of/decl-cls.js(strict mode) test/language/statements/for-of/head-const-bound-names-fordecl-tdz.js(default) test/language/statements/for-of/head-const-bound-names-fordecl-tdz.js(strict mode) test/language/statements/for-of/head-let-bound-names-fordecl-tdz.js(default) test/language/statements/for-of/head-let-bound-names-fordecl-tdz.js(strict mode) test/language/statements/switch/S12.11_A2_T1.js(default) test/language/statements/switch/S12.11_A2_T1.js(strict mode) -test/language/statements/while/decl-cls.js(default) -test/language/statements/while/decl-cls.js(strict mode) test/language/statements/try/early-catch-duplicates.js(default) test/language/statements/try/early-catch-duplicates.js(strict mode) test/language/statements/try/early-catch-lex.js(default) test/language/statements/try/early-catch-lex.js(strict mode) -test/language/statements/with/decl-cls.js(default) test/language/statements/const/block-local-use-before-initialization-in-declaration-statement.js(default) test/language/statements/const/block-local-use-before-initialization-in-declaration-statement.js(strict mode) test/language/statements/const/block-local-use-before-initialization-in-prior-statement.js(default)