From a345b96258051ee6de0c5a46fc26091929cba2bb Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 20 Jun 2020 19:28:36 -0400 Subject: [PATCH 01/20] [[CHORE]] Recognize 'esversion: 11' This commit extends the options parsing system to tolerate the values "11" and "2020" for the `esversion` linting option. It does not introduce support for any features introduced by the new edition of the language. --- src/jshint.js | 2 ++ src/options.js | 1 + src/state.js | 9 +++++++++ tests/test262/test.js | 2 +- tests/unit/options.js | 8 +++++--- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index aac08fa7c8..fe4caa1174 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -709,6 +709,7 @@ var JSHINT = (function() { case "8": case "9": case "10": + case "11": state.option.moz = false; state.option.esversion = +val; break; @@ -717,6 +718,7 @@ var JSHINT = (function() { case "2017": case "2018": case "2019": + case "2020": state.option.moz = false; // Translate specification publication year to version number. state.option.esversion = +val - 2009; diff --git a/src/options.js b/src/options.js index 43a5754e33..29267d9d2c 100644 --- a/src/options.js +++ b/src/options.js @@ -1051,6 +1051,7 @@ exports.val = { * - `10` - To enable language features introduced by [ECMAScript * 10](https://www.ecma-international.org/ecma-262/10.0/index.html). * Notable additions: optional catch bindings. + * - `11` - To enable language features introduced by ECMAScript 11. */ esversion: 5 }; diff --git a/src/state.js b/src/state.js index cd5b247ac3..0788b30f5b 100644 --- a/src/state.js +++ b/src/state.js @@ -65,6 +65,15 @@ var state = { return this.option.moz; }, + /** + * Determine if constructs introduced in ECMAScript 11 should be accepted. + * + * @returns {boolean} + */ + inES11: function() { + return this.esVersion >= 11; + }, + /** * Determine if constructs introduced in ECMAScript 10 should be accepted. * diff --git a/tests/test262/test.js b/tests/test262/test.js index fd8ae58b6b..003a017752 100644 --- a/tests/test262/test.js +++ b/tests/test262/test.js @@ -51,7 +51,7 @@ module.exports = function(test) { try { JSHint(test.contents, { - esversion: 10, + esversion: 11, maxerr: Infinity, module: isModule, unstable: { diff --git a/tests/unit/options.js b/tests/unit/options.js index e3dcdd0921..4bd69f66a3 100644 --- a/tests/unit/options.js +++ b/tests/unit/options.js @@ -4251,13 +4251,15 @@ exports.esversion = function(test) { "// jshint esversion: 10", "// jshint esversion: 2019", "// jshint esversion: 11", - "// jshint esversion: 2020" + "// jshint esversion: 2020", + "// jshint esversion: 12", + "// jshint esversion: 2021" ]; TestRun(test, "Value") .addError(2, 1, "Bad option value.") - .addError(14, 1, "Bad option value.") - .addError(15, 1, "Bad option value.") + .addError(16, 1, "Bad option value.") + .addError(17, 1, "Bad option value.") .test(code); var es5code = [ From 553f816dce7e57c4d8d535e33db63c4b219b7e63 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 20 Jun 2020 19:31:38 -0400 Subject: [PATCH 02/20] [[FIX]] Graduate BigInt support to `esversion: 11` --- package.json | 4 ++-- src/jshint.js | 5 +++-- src/lex.js | 24 ++++++++++---------- src/options.js | 11 ---------- tests/test262/test.js | 5 +---- tests/unit/{unstable => }/bigint.js | 34 ++++++++++++++--------------- tests/unit/options.js | 6 ++--- 7 files changed, 37 insertions(+), 52 deletions(-) rename tests/unit/{unstable => }/bigint.js (73%) diff --git a/package.json b/package.json index 262410eda0..e8fb506021 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "scripts": { "browser-test-server": "node tests/helpers/browser/server", "build": "node bin/build", - "coverage": "istanbul -- cover ./node_modules/nodeunit/bin/nodeunit tests/unit tests/unit/unstable", + "coverage": "istanbul -- cover ./node_modules/nodeunit/bin/nodeunit tests/unit", "coverage-report": "npm run coverage && istanbul report html", "data": "node scripts/generate-identifier-data", "fetch-test262": "git submodule init && git submodule update", @@ -34,7 +34,7 @@ "test-cli": "nodeunit tests/cli.js", "test-node": "npm run test-unit && npm run test-cli && npm run test-regression", "test-regression": "nodeunit tests/regression", - "test-unit": "nodeunit tests/unit tests/unit/unstable", + "test-unit": "nodeunit tests/unit", "test-website": "node tests/website.js", "test": "npm run test-node && npm run test-browser" }, diff --git a/src/jshint.js b/src/jshint.js index fe4caa1174..767b3fe8d6 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -749,6 +749,7 @@ var JSHINT = (function() { state.option[tn] = !state.option[tn]; } } else if (directiveToken.type === "jshint.unstable") { + /* istanbul ignore next */ state.option.unstable[key] = (val === "true"); } else { state.option[key] = (val === "true"); @@ -1472,8 +1473,8 @@ var JSHINT = (function() { if (right.type === "(identifier)" && right.value === "typeof" && left.type === "(string)") { if (left.value === "bigint") { - if (!state.option.unstable.bigint) { - warning("W144", left, "BigInt", "bigint"); + if (!state.inES11()) { + warning("W119", left, "BigInt", "11"); } return false; diff --git a/src/lex.js b/src/lex.js index 05ba48f475..e21d479167 100644 --- a/src/lex.js +++ b/src/lex.js @@ -874,19 +874,17 @@ Lexer.prototype = { if (isAllowedDigit !== isDecimalDigit || isBigInt) { if (isBigInt) { - if (!state.option.unstable.bigint) { - this.triggerAsync( - "warning", - { - code: "W144", - line: this.line, - character: this.char, - data: [ "BigInt", "bigint" ] - }, - checks, - function() { return true; } - ); - } + this.triggerAsync( + "warning", + { + code: "W119", + line: this.line, + character: this.char, + data: [ "BigInt", "11" ] + }, + checks, + function() { return !state.inES11(); } + ); if (isLegacy || isNonOctal) { this.triggerAsync( diff --git a/src/options.js b/src/options.js index 29267d9d2c..d8bc66b176 100644 --- a/src/options.js +++ b/src/options.js @@ -1063,17 +1063,6 @@ exports.val = { * right to remove or modify them between major version releases. */ exports.unstable = { - /** - * [The BigInt proposal](https://github.com/tc39/proposal-bigint) extends the - * language's grammer for numeric literals to support integer values of - * arbitrary precision. It also introduces a new value of the `typeof` - * operator, "bigint". - * - * Mathematical operations which use both BigInt and traditional ECMAScript - * Number values may not have the intended effect. Due to the weakly-typed - * nature of the language, JSHint is unable to identify such cases. - */ - bigint: true }; // These are JSHint boolean options which are shared with JSLint diff --git a/tests/test262/test.js b/tests/test262/test.js index 003a017752..d18dc7bda7 100644 --- a/tests/test262/test.js +++ b/tests/test262/test.js @@ -53,10 +53,7 @@ module.exports = function(test) { JSHint(test.contents, { esversion: 11, maxerr: Infinity, - module: isModule, - unstable: { - bigint: true - } + module: isModule }); } catch (e) { return false; diff --git a/tests/unit/unstable/bigint.js b/tests/unit/bigint.js similarity index 73% rename from tests/unit/unstable/bigint.js rename to tests/unit/bigint.js index 3db2720ad6..26c6fae59b 100644 --- a/tests/unit/unstable/bigint.js +++ b/tests/unit/bigint.js @@ -1,22 +1,22 @@ "use strict"; -var TestRun = require("../../helpers/testhelper").setup.testRun; +var TestRun = require("../helpers/testhelper").setup.testRun; exports.enabling = function (test) { TestRun(test, "Not enabled") - .addError(1, 6, "'BigInt' is a non-standard language feature. Enable it using the 'bigint' unstable option.") - .test("void 1n;", {esversion: 9}); + .addError(1, 6, "'BigInt' is only available in ES11 (use 'esversion: 11').") + .test("void 1n;", {esversion: 10}); TestRun(test, "Enabled via inline directive") .test([ - "// jshint.unstable bigint: true", + "// jshint esversion: 11", "void 1n;" - ], {esversion: 9}); + ], {esversion: 10}); TestRun(test, "Enabled via configuration object") .test([ "void 1n;" - ], {esversion: 9, unstable: {bigint: true}}); + ], {esversion: 11}); test.done(); }; @@ -34,7 +34,7 @@ exports.validUsage = function(test) { "void 0b1n;", "void 0b01n;", "void 0b10n;", - ], {esversion: 6, unstable: {bigint: true}}); + ], {esversion: 11}); TestRun(test, 'No warnings for values that would otherwise coerce to Infinity') .test([ @@ -44,7 +44,7 @@ exports.validUsage = function(test) { "0000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000n;" - ], {esversion: 9, unstable: {bigint: true}}); + ], {esversion: 11}); test.done(); }; @@ -54,51 +54,51 @@ exports.invalid = function (test) { .addError(1, 10, "A leading decimal point can be confused with a dot: '.1'.") .addError(1, 8, "Missing semicolon.") .addError(1, 8, "Expected an assignment or function call and instead saw an expression.") - .test("void 1n.1;", {esversion: 6, unstable: {bigint: true}}); + .test("void 1n.1;", {esversion: 11}); TestRun(test, "following decimal point") .addError(1, 6, "Unexpected '1'.") .addError(1, 1, "Unexpected early end of program.") .addError(1, 6, "Unrecoverable syntax error. (100% scanned).") - .test("void 1.1n;", {esversion: 6, unstable: {bigint: true}}); + .test("void 1.1n;", {esversion: 11}); TestRun(test, "preceding exponent") .addError(1, 6, "Unexpected '1'.") .addError(1, 1, "Unexpected early end of program.") .addError(1, 6, "Unrecoverable syntax error. (100% scanned).") - .test("void 1ne3;", {esversion: 6, unstable: {bigint: true}}); + .test("void 1ne3;", {esversion: 11}); TestRun(test, "following exponent") .addError(1, 6, "Unexpected '1'.") .addError(1, 1, "Unexpected early end of program.") .addError(1, 6, "Unrecoverable syntax error. (100% scanned).") - .test("void 1e3n;", {esversion: 6, unstable: {bigint: true}}); + .test("void 1e3n;", {esversion: 11}); TestRun(test, "invalid legacy octal") .addError(1, 6, "Malformed numeric literal: '01n'.") - .test("void 01n;", {esversion: 6, unstable: {bigint: true}}); + .test("void 01n;", {esversion: 11}); TestRun(test, "invalid leading 0") .addError(1, 6, "Malformed numeric literal: '08n'.") - .test("void 08n;", {esversion: 6, unstable: {bigint: true}}); + .test("void 08n;", {esversion: 11}); TestRun(test, "invalid hex digit") .addError(1, 8, "Malformed numeric literal: '0x'.") .addError(1, 8, "Missing semicolon.") .addError(1, 8, "Expected an assignment or function call and instead saw an expression.") - .test("void 0xgn;", {esversion: 6, unstable: {bigint: true}}); + .test("void 0xgn;", {esversion: 11}); TestRun(test, "invalid binary digit") .addError(1, 8, "Malformed numeric literal: '0b'.") .addError(1, 8, "Missing semicolon.") .addError(1, 8, "Expected an assignment or function call and instead saw an expression.") - .test("void 0b2n;", {esversion: 6, unstable: {bigint: true}}); + .test("void 0b2n;", {esversion: 11}); TestRun(test, "invalid octal digit") .addError(1, 8, "Malformed numeric literal: '0o'.") .addError(1, 8, "Missing semicolon.") .addError(1, 8, "Expected an assignment or function call and instead saw an expression.") - .test("void 0o8n;", {esversion: 6, unstable: {bigint: true}}); + .test("void 0o8n;", {esversion: 11}); test.done(); }; diff --git a/tests/unit/options.js b/tests/unit/options.js index 4bd69f66a3..f8f8aa17f9 100644 --- a/tests/unit/options.js +++ b/tests/unit/options.js @@ -311,7 +311,7 @@ exports.notypeof = function (test) { .addError(3, 17, "Invalid typeof value 'bool'") .addError(4, 11, "Invalid typeof value 'obj'") .addError(13, 17, "Invalid typeof value 'symbol'") - .addError(14, 21, "'BigInt' is a non-standard language feature. Enable it using the 'bigint' unstable option.") + .addError(14, 21, "'BigInt' is only available in ES11 (use 'esversion: 11').") .test(src); TestRun(test) @@ -319,7 +319,7 @@ exports.notypeof = function (test) { .addError(2, 14, "Invalid typeof value 'double'") .addError(3, 17, "Invalid typeof value 'bool'") .addError(4, 11, "Invalid typeof value 'obj'") - .addError(14, 21, "'BigInt' is a non-standard language feature. Enable it using the 'bigint' unstable option.") + .addError(14, 21, "'BigInt' is only available in ES11 (use 'esversion: 11').") .test(src, { esnext: true }); TestRun(test) @@ -327,7 +327,7 @@ exports.notypeof = function (test) { .addError(2, 14, "Invalid typeof value 'double'") .addError(3, 17, "Invalid typeof value 'bool'") .addError(4, 11, "Invalid typeof value 'obj'") - .test(src, { esnext: true, unstable: { bigint: true } }); + .test(src, { esversion: 11 }); TestRun(test) .test(src, { notypeof: true }); From 482b10677029d4f1734c5e601b7bb308f77c2493 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 18 Sep 2020 21:26:32 -0400 Subject: [PATCH 03/20] [[DOCS]] Correct description of internal function --- src/jshint.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 767b3fe8d6..52e39a1044 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -1738,8 +1738,8 @@ var JSHINT = (function() { } /** - * Retrieve the value of the current token if it is an identifier and - * optionally advance the parser. + * Retrieve the value of the next token if it is an identifier and optionally + * advance the parser. * * @param {number} context - the parsing context; see `prod-params.js` for * more information From dc600e5f9df4df26e2536bea5a3647ad6c009fa1 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 18 Sep 2020 21:27:27 -0400 Subject: [PATCH 04/20] [[CHORE]] Remove unreachable code No call site for `propertyName` specifies an object value for the second argument. The `optionalidentifier` function returns only string values or undefined. These two invariants make the untested code paths unreachable. Remove them both. --- src/jshint.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 52e39a1044..a10653d574 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -3458,16 +3458,8 @@ var JSHINT = (function() { return !!state.funct["(method)"]; } - function propertyName(context, preserveOrToken) { - var id; - var preserve = true; - if (typeof preserveOrToken === "object") { - /* istanbul ignore next */ - id = preserveOrToken; - } else { - preserve = preserveOrToken; - id = optionalidentifier(context, true, preserve); - } + function propertyName(context, preserve) { + var id = optionalidentifier(context, true, preserve); if (!id) { if (state.tokens.next.id === "(string)") { @@ -3481,10 +3473,6 @@ var JSHINT = (function() { advance(); } } - /* istanbul ignore next */ - } else if (typeof id === "object") { - if (id.id === "(string)" || id.id === "(identifier)") id = id.value; - else if (id.id === "(number)") id = id.value.toString(); } if (id === "hasOwnProperty") { From 565070ece4ff6cb964811dc96327ad9b3d67d3d3 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 18 Sep 2020 21:29:43 -0400 Subject: [PATCH 05/20] [[DOCS]] Document internal function --- src/jshint.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/jshint.js b/src/jshint.js index a10653d574..47f13758a3 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -3458,6 +3458,16 @@ var JSHINT = (function() { return !!state.funct["(method)"]; } + /** + * Retrieve the value of the next token if it is a valid LiteralPropertyName + * and optionally advance the parser. + * + * @param {number} context - the parsing context; see `prod-params.js` for + * more information + * @param {boolean} [preserve] - `true` if the token should not be consumed + * + * @returns {string|undefined} - the value of the identifier, if present + */ function propertyName(context, preserve) { var id = optionalidentifier(context, true, preserve); From b614775793f27fce89deaa64029e1aa5217aa91b Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 18 Sep 2020 21:32:15 -0400 Subject: [PATCH 06/20] [[CHORE]] Improve name of internal variable --- src/jshint.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 47f13758a3..d2a0561f02 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -1743,13 +1743,13 @@ var JSHINT = (function() { * * @param {number} context - the parsing context; see `prod-params.js` for * more information - * @param {boolean} [prop] -`true` if this identifier is that of an object - * property + * @param {boolean} [isName] - `true` if an IdentifierName should be consumed + * (e.g. object properties) * @param {boolean} [preserve] - `true` if the token should not be consumed * * @returns {string|undefined} - the value of the identifier, if present */ - function optionalidentifier(context, prop, preserve) { + function optionalidentifier(context, isName, preserve) { if (!state.tokens.next.identifier) { return; } @@ -1765,7 +1765,7 @@ var JSHINT = (function() { return val; } - if (prop) { + if (isName) { if (state.inES5()) { return val; } @@ -1810,13 +1810,13 @@ var JSHINT = (function() { * * @param {number} context - the parsing context; see `prod-params.js` for * more information - * @param {boolean} [prop] -`true` if this identifier is that of an object - * property + * @param {boolean} [isName] - `true` if an IdentifierName should be consumed + * (e.g. object properties) * * @returns {string|undefined} - the value of the identifier, if present */ - function identifier(context, prop) { - var i = optionalidentifier(context, prop, false); + function identifier(context, isName) { + var i = optionalidentifier(context, isName, false); if (i) { return i; } From 265ba687cdb28605d2b477470fce4e3143f77ef7 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 18 Sep 2020 21:35:21 -0400 Subject: [PATCH 07/20] [[CHORE]] Simplify internal function --- src/jshint.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index d2a0561f02..2d817f5c48 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -1759,20 +1759,12 @@ var JSHINT = (function() { } var curr = state.tokens.curr; - var val = state.tokens.curr.value; - if (!isReserved(context, curr)) { - return val; + if (isReserved(context, curr) && !(isName && state.inES5())) { + warning("W024", state.tokens.curr, state.tokens.curr.id); } - if (isName) { - if (state.inES5()) { - return val; - } - } - - warning("W024", state.tokens.curr, state.tokens.curr.id); - return val; + return curr.value; } /** From 3a9fa87e9d08f9e13519f4aca3298b23a18337ea Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 18 Sep 2020 21:47:25 -0400 Subject: [PATCH 08/20] [[CHORE]] Simplify internal function In so-called "object short notation," an IdentifierName is interpreted as both a LiteralPropertyName and an IdentifierReference. The second is a more restrictive goal than the first, so it is not necessary to apply the LiteralPropertyName validation rules. Removing that validation logic allows for an otherwise-unused parameter of the internal `propertyName` function to be removed. --- src/jshint.js | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 2d817f5c48..b9570c41ff 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -3456,24 +3456,19 @@ var JSHINT = (function() { * * @param {number} context - the parsing context; see `prod-params.js` for * more information - * @param {boolean} [preserve] - `true` if the token should not be consumed * * @returns {string|undefined} - the value of the identifier, if present */ - function propertyName(context, preserve) { - var id = optionalidentifier(context, true, preserve); + function propertyName(context) { + var id = optionalidentifier(context, true); if (!id) { if (state.tokens.next.id === "(string)") { id = state.tokens.next.value; - if (!preserve) { - advance(); - } + advance(); } else if (state.tokens.next.id === "(number)") { id = state.tokens.next.value.toString(); - if (!preserve) { - advance(); - } + advance(); } } @@ -4002,10 +3997,9 @@ var JSHINT = (function() { if (!state.inES6()) { warning("W104", state.tokens.next, "object short notation", "6"); } - i = propertyName(context, true); - saveProperty(props, i, state.tokens.next); - - expression(context, 10); + t = expression(context, 10); + i = t.value; + saveProperty(props, i, t); } else if (peek().id !== ":" && (nextVal === "get" || nextVal === "set")) { advance(nextVal); From 72a81021e1ceba38f95a19548fe7c91ff93abf55 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 19 Sep 2020 19:07:44 -0400 Subject: [PATCH 09/20] [[FIX]] Correct interpretation of ImportSpecifier --- src/jshint.js | 11 ++++------- tests/test262/expectations.txt | 2 -- tests/unit/core.js | 6 ++++++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index b9570c41ff..bbcedb4f4a 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -5581,15 +5581,12 @@ var JSHINT = (function() { break; } var importName; - if (state.tokens.next.type === "default") { - importName = "default"; - advance("default"); - } else { - importName = identifier(context); - } - if (state.tokens.next.value === "as") { + if (peek().value === "as") { + identifier(context, true); advance("as"); importName = identifier(context); + } else { + importName = identifier(context); } // Import bindings are immutable (see ES6 8.1.1.5.5) diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 1a4ea5b7d9..958ca9e4f7 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -161,8 +161,6 @@ test/language/module-code/early-export-global.js(default) test/language/module-code/early-export-global.js(strict mode) test/language/module-code/early-export-unresolvable.js(default) test/language/module-code/early-export-unresolvable.js(strict mode) -test/language/module-code/instn-named-id-name.js(default) -test/language/module-code/instn-named-id-name.js(strict mode) test/language/module-code/parse-err-hoist-lex-fun.js(default) test/language/module-code/parse-err-hoist-lex-fun.js(strict mode) test/language/module-code/parse-err-hoist-lex-gen.js(default) diff --git a/tests/unit/core.js b/tests/unit/core.js index fe7e305cc9..2bc5f8f40d 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -990,6 +990,12 @@ exports.testES6Modules = function (test) { "export default async function * () { yield 0; await 0; }", ], { esversion: 9, module: true }); + TestRun(test, "IdentifierName in renamed import/export") + .test([ + "import { if as x } from '.';", + "export { x as if } from '.';" + ], { esversion: 6, module: true }); + test.done(); }; From 90228b76e61c80bbfe4075c0ab1679864b63fd39 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 20 Sep 2020 18:13:13 -0400 Subject: [PATCH 10/20] [[FIX]] Consider all exported bindings "used" Extend consideration to include bindings created using DestructuringBindingPattern. --- src/jshint.js | 4 ++-- tests/unit/core.js | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index bbcedb4f4a..0300816e40 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -4424,7 +4424,7 @@ var JSHINT = (function() { t = tokens[t]; state.funct["(scope)"].initialize(t.id); - if (lone && inexport) { + if (inexport) { state.funct["(scope)"].setExported(t.token.value, t.token); } } @@ -4571,7 +4571,7 @@ var JSHINT = (function() { type: "var", token: t.token }); - if (lone && inexport) { + if (inexport) { state.funct["(scope)"].setExported(t.id, t.token); } names.push(t.token); diff --git a/tests/unit/core.js b/tests/unit/core.js index 2bc5f8f40d..f59aef54cf 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -1021,7 +1021,10 @@ exports.testES6ModulesNamedExportsAffectUnused = function (test) { "export var v1u, v2u;", "export let l1u, l2u;", "export const c1u, c2u;", - "export function* gen() { yield 1; }" + "export function* gen() { yield 1; }", + "export var { varX } = 0;", + "export let { letX } = 0;", + "export const { constX } = 0;" ]; TestRun(test) From bd346cfdf226fc2ce6f6f4367899cc660faf9568 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 20 Sep 2020 21:06:56 -0400 Subject: [PATCH 11/20] [[CHORE]] Remove unnecessary branch Currently, the `setExported` method only makes the specified binding as "used." This is unnecessary in this context because when `expression` processes an IdentifierReference, it does the same. Remove the branch. --- src/jshint.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 0300816e40..e2b2acb537 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -5624,8 +5624,6 @@ var JSHINT = (function() { stmt("export", function(context) { var ok = true; - var token; - var identifier; var moduleSpecifier; context = context | prodParams.export; @@ -5673,11 +5671,7 @@ var JSHINT = (function() { advance("class"); state.syntax["class"].fud(context); } else { - token = expression(context, 10); - if (token.identifier) { - identifier = token.value; - state.funct["(scope)"].setExported(identifier, token); - } + expression(context, 10); } return this; } From 916c230da7677b207632cec8ee2d71186b440f7a Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 20 Sep 2020 13:23:06 -0400 Subject: [PATCH 12/20] [[FIX]] Detect duplicate exported bindings --- src/jshint.js | 101 ++++++++------- src/messages.js | 3 +- src/scope-manager.js | 15 ++- tests/test262/expectations.txt | 8 -- tests/unit/core.js | 153 +++++++++++++++++++++-- tests/unit/fixtures/es6-import-export.js | 15 +-- 6 files changed, 220 insertions(+), 75 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index e2b2acb537..d85ab3560c 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -2753,7 +2753,6 @@ var JSHINT = (function() { var classDeclaration = blockstmt("class", function(context) { var className, classNameToken; - var inexport = context & prodParams.export; if (!state.inES6()) { warning("W104", state.tokens.curr, "class", "6"); @@ -2780,12 +2779,12 @@ var JSHINT = (function() { } if (classNameToken) { - this.name = className; + this.name = classNameToken; state.funct["(scope)"].initialize(className); - if (inexport) { - state.funct["(scope)"].setExported(className, classNameToken); - } + } else { + this.name = null; } + state.funct["(scope)"].stack(); classBody(this, context); return this; @@ -2822,13 +2821,15 @@ var JSHINT = (function() { state.funct["(scope)"].stack(); if (classNameToken) { - this.name = className; + this.name = classNameToken; state.funct["(scope)"].addbinding(className, { type: "class", initialized: true, token: classNameToken }); state.funct["(scope)"].block.use(className, classNameToken); + } else { + this.name = null; } classBody(this, context); @@ -4333,7 +4334,6 @@ var JSHINT = (function() { // used for both let and const statements var noin = context & prodParams.noin; - var inexport = context & prodParams.export; var isLet = type === "let"; var isConst = type === "const"; var tokens, lone, value, letblock; @@ -4423,10 +4423,6 @@ var JSHINT = (function() { if (tokens.hasOwnProperty(t)) { t = tokens[t]; state.funct["(scope)"].initialize(t.id); - - if (inexport) { - state.funct["(scope)"].setExported(t.token.value, t.token); - } } } } @@ -4528,7 +4524,6 @@ var JSHINT = (function() { var varstatement = stmt("var", function(context) { var noin = context & prodParams.noin; - var inexport = context & prodParams.export; var tokens, lone, value, id; this.first = []; @@ -4571,9 +4566,6 @@ var JSHINT = (function() { type: "var", token: t.token }); - if (inexport) { - state.funct["(scope)"].setExported(t.id, t.token); - } names.push(t.token); } } @@ -4646,25 +4638,21 @@ var JSHINT = (function() { if (inblock) { warning("W082", state.tokens.curr); } - var nameToken = optionalidentifier(context) ? state.tokens.curr : null; + this.name = optionalidentifier(context) ? state.tokens.curr : null; - if (!nameToken) { + if (!this.name) { if (!inexport) { warning("W025"); } } else { - state.funct["(scope)"].addbinding(nameToken.value, { + state.funct["(scope)"].addbinding(this.name.value, { type: labelType, token: state.tokens.curr, initialized: true }); - - if (inexport) { - state.funct["(scope)"].setExported(nameToken.value, state.tokens.prev); - } } var f = doFunction(context, { - name: nameToken && nameToken.value, + name: this.name && this.name.value, statement: this, type: generator ? "generator" : null, ignoreLoopFunc: inblock // a declaration may already have warned @@ -4677,9 +4665,9 @@ var JSHINT = (function() { // mode (the scope manager will not report an error because a declaration // does not introduce a binding into the function's environment record). var enablesStrictMode = f["(isStrict)"] && !state.isStrict(); - if (nameToken && (f["(name)"] === "arguments" || f["(name)"] === "eval") && + if (this.name && (f["(name)"] === "arguments" || f["(name)"] === "eval") && enablesStrictMode) { - error("E008", nameToken); + error("E008", this.name); } if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) { @@ -4706,21 +4694,21 @@ var JSHINT = (function() { // This context modification restricts the use of `await` as the optional // BindingIdentifier in async function expressions. - var nameToken = optionalidentifier(isAsync ? context | prodParams.async : context) ? + this.name = optionalidentifier(isAsync ? context | prodParams.async : context) ? state.tokens.curr : null; var f = doFunction(context, { - name: nameToken && nameToken.value, + name: this.name && this.name.value, type: generator ? "generator" : null }); - if (generator && nameToken && nameToken.value === "yield") { - error("E024", nameToken, "yield"); + if (generator && this.name && this.name.value === "yield") { + error("E024", this.name, "yield"); } - if (nameToken && (f["(name)"] === "arguments" || f["(name)"] === "eval") && + if (this.name && (f["(name)"] === "arguments" || f["(name)"] === "eval") && f["(isStrict)"]) { - error("E008", nameToken); + error("E008", this.name); } return this; @@ -5624,6 +5612,7 @@ var JSHINT = (function() { stmt("export", function(context) { var ok = true; + var token; var moduleSpecifier; context = context | prodParams.export; @@ -5656,22 +5645,27 @@ var JSHINT = (function() { state.nameStack.set(state.tokens.next); advance("default"); + var def = state.tokens.curr; var exportType = state.tokens.next.id; if (exportType === "function") { this.block = true; advance("function"); - state.syntax["function"].fud(context); + token = state.syntax["function"].fud(context); + state.funct["(scope)"].setExported(token.name, def); } else if (exportType === "async" && peek().id === "function") { this.block = true; advance("async"); advance("function"); - state.syntax["function"].fud(context | prodParams.preAsync); + token = state.syntax["function"].fud(context | prodParams.preAsync); + state.funct["(scope)"].setExported(token.name, def); } else if (exportType === "class") { this.block = true; advance("class"); - state.syntax["class"].fud(context); + token = state.syntax["class"].fud(context); + state.funct["(scope)"].setExported(token.name, def); } else { expression(context, 10); + state.funct["(scope)"].setExported(null, def); } return this; } @@ -5686,15 +5680,22 @@ var JSHINT = (function() { } advance(); - exportedTokens.push(state.tokens.curr); - if (state.tokens.next.value === "as") { advance("as"); if (!state.tokens.next.identifier) { /* istanbul ignore next */ error("E030", state.tokens.next, state.tokens.next.value); } + exportedTokens.push({ + local: state.tokens.prev, + export: state.tokens.next + }); advance(); + } else { + exportedTokens.push({ + local: state.tokens.curr, + export: state.tokens.curr + }); } if (!checkPunctuator(state.tokens.next, "}")) { @@ -5708,8 +5709,8 @@ var JSHINT = (function() { moduleSpecifier = state.tokens.next; advance("(string)"); } else if (ok) { - exportedTokens.forEach(function(token) { - state.funct["(scope)"].setExported(token.value, token); + exportedTokens.forEach(function(x) { + state.funct["(scope)"].setExported(x.local, x.export); }); } @@ -5725,31 +5726,43 @@ var JSHINT = (function() { } else if (state.tokens.next.id === "var") { // ExportDeclaration :: export VariableStatement advance("var"); - state.tokens.curr.fud(context); + token = state.tokens.curr.fud(context); + token.first.forEach(function(binding) { + state.funct["(scope)"].setExported(binding, binding); + }); } else if (state.tokens.next.id === "let") { // ExportDeclaration :: export VariableStatement advance("let"); - state.tokens.curr.fud(context); + token = state.tokens.curr.fud(context); + token.first.forEach(function(binding) { + state.funct["(scope)"].setExported(binding, binding); + }); } else if (state.tokens.next.id === "const") { // ExportDeclaration :: export VariableStatement advance("const"); - state.tokens.curr.fud(context); + token = state.tokens.curr.fud(context); + token.first.forEach(function(binding) { + state.funct["(scope)"].setExported(binding, binding); + }); } else if (state.tokens.next.id === "function") { // ExportDeclaration :: export Declaration this.block = true; advance("function"); - state.syntax["function"].fud(context); + token = state.syntax["function"].fud(context); + state.funct["(scope)"].setExported(token.name, token.name); } else if (state.tokens.next.id === "async" && peek().id === "function") { // ExportDeclaration :: export Declaration this.block = true; advance("async"); advance("function"); - state.syntax["function"].fud(context | prodParams.preAsync); + token = state.syntax["function"].fud(context | prodParams.preAsync); + state.funct["(scope)"].setExported(token.name, token.name); } else if (state.tokens.next.id === "class") { // ExportDeclaration :: export Declaration this.block = true; advance("class"); - state.syntax["class"].fud(context); + token = state.syntax["class"].fud(context); + state.funct["(scope)"].setExported(token.name, token.name); } else { /* istanbul ignore next */ error("E024", state.tokens.next, state.tokens.next.value); diff --git a/src/messages.js b/src/messages.js index 6c4bd053e2..d01ee4c5b0 100644 --- a/src/messages.js +++ b/src/messages.js @@ -84,7 +84,8 @@ var errors = { "enable strict mode.", E066: "Asynchronous iteration is only available with for-of loops.", E067: "Malformed numeric literal: '{a}'.", - E068: "Decimals with leading zeros are not allowed in strict mode." + E068: "Decimals with leading zeros are not allowed in strict mode.", + E069: "Duplicate exported binding: '{a}'." }; var warnings = { diff --git a/src/scope-manager.js b/src/scope-manager.js index ee6f8a528e..4613819024 100644 --- a/src/scope-manager.js +++ b/src/scope-manager.js @@ -64,6 +64,7 @@ var scopeManager = function(state, predefined, exported, declared) { var usedPredefinedAndGlobals = Object.create(null); var impliedGlobals = Object.create(null); var unuseds = []; + var esModuleExports = []; var emitter = new events.EventEmitter(); function warning(code, token) { @@ -694,8 +695,18 @@ var scopeManager = function(state, predefined, exported, declared) { * @param {string} bindingName - the value of the identifier * @param {object} token */ - setExported: function(bindingName, token) { - this.block.use(bindingName, token); + setExported: function(localName, exportName) { + if (exportName) { + if (esModuleExports.indexOf(exportName.value) > -1) { + error("E069", exportName, exportName.value); + } + + esModuleExports.push(exportName.value); + } + + if (localName) { + this.block.use(localName.value, localName); + } }, /** diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 958ca9e4f7..e41016a938 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -149,14 +149,6 @@ test/language/block-scope/syntax/function-declarations/in-statement-position-if- test/language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement.js(strict mode) test/language/destructuring/binding/syntax/array-elements-with-initializer.js(default) test/language/destructuring/binding/syntax/array-elements-with-initializer.js(strict mode) -test/language/module-code/early-dup-export-decl.js(default) -test/language/module-code/early-dup-export-decl.js(strict mode) -test/language/module-code/early-dup-export-dflt-id.js(default) -test/language/module-code/early-dup-export-dflt-id.js(strict mode) -test/language/module-code/early-dup-export-id-as.js(default) -test/language/module-code/early-dup-export-id-as.js(strict mode) -test/language/module-code/early-dup-export-id.js(default) -test/language/module-code/early-dup-export-id.js(strict mode) test/language/module-code/early-export-global.js(default) test/language/module-code/early-export-global.js(strict mode) test/language/module-code/early-export-unresolvable.js(default) diff --git a/tests/unit/core.js b/tests/unit/core.js index f59aef54cf..7147a8b14b 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -875,8 +875,8 @@ exports.testES6Modules = function (test) { ]; var testRun = TestRun(test) - .addError(74, 1, "Empty export: this is unnecessary and can be removed.") - .addError(75, 1, "Empty export: consider replacing with `import 'source';`."); + .addError(75, 1, "Empty export: this is unnecessary and can be removed.") + .addError(76, 1, "Empty export: consider replacing with `import 'source';`."); importConstErrors.forEach(function(error) { testRun.addError.apply(testRun, error); }); testRun.test(src, {esnext: true}); @@ -891,7 +891,6 @@ exports.testES6Modules = function (test) { .addError(10, 1, "'import' is only available in ES6 (use 'esversion: 6').") .addError(11, 1, "'import' is only available in ES6 (use 'esversion: 6').") .addError(22, 1, "'export' is only available in ES6 (use 'esversion: 6').") - .addError(26, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(30, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(31, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(32, 1, "'export' is only available in ES6 (use 'esversion: 6').") @@ -900,8 +899,6 @@ exports.testES6Modules = function (test) { .addError(44, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(46, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(47, 8, "'class' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz).") - .addError(48, 1, "'export' is only available in ES6 (use 'esversion: 6').") - .addError(48, 16, "'class' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz).") .addError(47, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(46, 8, "'class' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz).") .addError(57, 1, "'import' is only available in ES6 (use 'esversion: 6').") @@ -912,11 +909,11 @@ exports.testES6Modules = function (test) { .addError(67, 1, "'export' is only available in ES6 (use 'esversion: 6').") .addError(67, 16, "'function*' is only available in ES6 (use 'esversion: 6').") .addError(67, 26, "'yield' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz).") - .addError(70, 1, "'export' is only available in ES6 (use 'esversion: 6').") - .addError(71, 1, "'import' is only available in ES6 (use 'esversion: 6').") - .addError(74, 1, "'export' is only available in ES6 (use 'esversion: 6').") + .addError(71, 1, "'export' is only available in ES6 (use 'esversion: 6').") + .addError(72, 1, "'import' is only available in ES6 (use 'esversion: 6').") .addError(75, 1, "'export' is only available in ES6 (use 'esversion: 6').") - .addError(76, 1, "'import' is only available in ES6 (use 'esversion: 6').") + .addError(76, 1, "'export' is only available in ES6 (use 'esversion: 6').") + .addError(77, 1, "'import' is only available in ES6 (use 'esversion: 6').") .test(src); var src2 = [ @@ -929,6 +926,18 @@ exports.testES6Modules = function (test) { TestRun(test) .test(src2, {}); + TestRun(test) + .test([ + "export default function() {", + " return 'foobar';", + "}" + ], {esversion: 6}); + + TestRun(test) + .test([ + "export default class Bar {}" + ], {esversion: 6}); + // See gh-3055 "Labels Break JSHint" TestRun(test, "following labeled block") .test([ @@ -999,6 +1008,105 @@ exports.testES6Modules = function (test) { test.done(); }; +exports.testES6ModuleDuplicateExport = function (test) { + TestRun(test, "Same declaration, adjacent") + .addError(2, 13, "Duplicate exported binding: 'x'.") + .test([ + "var x;", + "export { x, x };" + ], { esversion: 6, module: true }); + + TestRun(test, "Same declaration, removed") + .addError(2, 16, "Duplicate exported binding: 'y'.") + .test([ + "var y, z;", + "export { y, z, y };" + ], { esversion: 6, module: true }); + + TestRun(test, "Same declaration, renamed") + .addError(2, 18, "Duplicate exported binding: 'y'.") + .test([ + "var y, z;", + "export { y, z as y };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by reference") + .addError(3, 10, "Duplicate exported binding: 'z'.") + .test([ + "var z;", + "export { z };", + "export { z };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by reference, renamed") + .addError(3, 15, "Duplicate exported binding: 'y'.") + .test([ + "var y, z;", + "export { y };", + "export { z as y };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, default") + .addError(2, 8, "Duplicate exported binding: 'default'.") + .test([ + "export default 0;", + "export default 0;" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by reference, default/renamed") + .addError(3, 15, "Duplicate exported binding: 'default'.") + .test([ + "var x;", + "export default 0;", + "export { x as default };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by reference, renamed/default") + .addError(3, 8, "Duplicate exported binding: 'default'.") + .test([ + "var x;", + "export { x as default };", + "export default 0;" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by statement - var") + .addError(2, 10, "Duplicate exported binding: 'a'.") + .test([ + "export var a;", + "export { a };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by statement - let") + .addError(2, 10, "Duplicate exported binding: 'b'.") + .test([ + "export let b;", + "export { b };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by statement - const") + .addError(2, 10, "Duplicate exported binding: 'c'.") + .test([ + "export const c = null;", + "export { c };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by statement - function") + .addError(2, 10, "Duplicate exported binding: 'd'.") + .test([ + "export function d() {}", + "export { d };" + ], { esversion: 6, module: true }); + + TestRun(test, "Distinct declarations, by statement - class") + .addError(2, 10, "Duplicate exported binding: 'e'.") + .test([ + "export class e {}", + "export { e };" + ], { esversion: 6, module: true }); + + test.done(); +}; + exports.testES6ModulesNamedExportsAffectUnused = function (test) { // Named Exports should count as used var src1 = [ @@ -1301,10 +1409,7 @@ exports.testES6ModulesDefaultExportsAffectUnused = function (test) { " bar: 'bar'", "};", "var x = 23;", - "var z = 42;", - "export default { a: a, x: x };", - "export default function boo() { return x + z; }", - "export default class MyClass { }" + "export default { a: a, x: x };" ]; TestRun(test) @@ -1313,6 +1418,28 @@ exports.testES6ModulesDefaultExportsAffectUnused = function (test) { unused: true }); + TestRun(test) + .test([ + "var x = 23;", + "var z = 42;", + "export default function boo() { return x + z; }" + ], { + esnext: true, + unused: true + }); + + TestRun(test) + .test("export default class MyClass { }", { + esnext: true, + unused: true + }); + + TestRun(test) + .test("export default class {}", { + esnext: true, + unused: true + }); + test.done(); }; diff --git a/tests/unit/fixtures/es6-import-export.js b/tests/unit/fixtures/es6-import-export.js index fe0088a7ce..cb5a21ac90 100644 --- a/tests/unit/fixtures/es6-import-export.js +++ b/tests/unit/fixtures/es6-import-export.js @@ -21,11 +21,11 @@ function foobar() {} export default foobar; -// at some point doing a double export default should error, but for now, -// makes testing a hell of a lot easier -export default function() { - return "foobar"; -} + + + + + export { foo }; export { foo, bar } from "source"; @@ -45,7 +45,7 @@ export var c = "c"; export class Foo {} export class List extends Array {} -export default class Bar {} + // imports are const's and cannot be re-assigned $ = null; @@ -67,7 +67,8 @@ import newImport from 'newImport'; export function* gen() { yield 1; } // Trailing comma -export { a, }; +var w; +export { w, }; import { x, } from "source"; // Empty From e831188ffbc07d12b5a1baa52e63fc3a23debdfa Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 4 Oct 2020 23:02:02 -0400 Subject: [PATCH 13/20] [[FIX]] Correct location for error --- src/jshint.js | 2 +- tests/unit/core.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/jshint.js b/src/jshint.js index d85ab3560c..d85b12caa3 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -4772,7 +4772,7 @@ var JSHINT = (function() { var tokens = destructuringPattern(context); _.each(tokens, function(token) { if (token.id) { - state.funct["(scope)"].addParam(token.id, token, "exception"); + state.funct["(scope)"].addParam(token.id, token.token, "exception"); } }); } else if (state.tokens.next.type !== "(identifier)") { diff --git a/tests/unit/core.js b/tests/unit/core.js index 7147a8b14b..7c5ee5f1d9 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -1784,6 +1784,18 @@ exports.testDefaultArguments = function (test) { test.done(); }; +exports.testEarlyCatchParam = function (test) { + TestRun(test) + .addError(2, 18, "'y' was used before it was declared, which is illegal for 'exception' variables.") + .test([ + "try {", + "} catch ([x = y, y]) {", + "}" + ], { esversion: 6 }); + + test.done(); +}; + exports.testDuplicateParamNames = function (test) { var src = [ "(function() {", From 2c1a5f8fd9986dad7c921af9bc58a1e5901bb9fc Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 4 Oct 2020 23:06:26 -0400 Subject: [PATCH 14/20] [[FIX]] Report early reference with warning The situation described by this condition does not constitute syntactically invalid code, so it should be reported with a warning. --- src/scope-manager.js | 5 +- tests/test262/expectations.txt | 130 --------------------------------- tests/unit/core.js | 20 ++--- 3 files changed, 13 insertions(+), 142 deletions(-) diff --git a/src/scope-manager.js b/src/scope-manager.js index 4613819024..27178ed7a4 100644 --- a/src/scope-manager.js +++ b/src/scope-manager.js @@ -538,8 +538,9 @@ var scopeManager = function(state, predefined, exported, declared) { if (usage["(onlyUsedSubFunction)"]) { _latedefWarning(type, bindingName, token); } else { - // this is a clear illegal usage for block scoped variables - warning("E056", token, bindingName, type); + // this is a clear illegal usage, but not a syntax error, so emit a + // warning and not an error + warning("W003", token, bindingName); } } }, diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index e41016a938..b335f679fa 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -147,8 +147,6 @@ test/language/arguments-object/10.6-13-c-1-s.js(strict mode) test/language/arguments-object/10.6-2gs.js(strict mode) test/language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement-else-statement.js(strict mode) test/language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement.js(strict mode) -test/language/destructuring/binding/syntax/array-elements-with-initializer.js(default) -test/language/destructuring/binding/syntax/array-elements-with-initializer.js(strict mode) test/language/module-code/early-export-global.js(default) test/language/module-code/early-export-global.js(strict mode) test/language/module-code/early-export-unresolvable.js(default) @@ -1061,78 +1059,14 @@ test/annexB/built-ins/escape/escape-above-astral.js(strict mode) # Async functions -test/language/expressions/async-arrow-function/dflt-params-ref-later.js(default) -test/language/expressions/async-arrow-function/dflt-params-ref-later.js(strict mode) -test/language/expressions/async-arrow-function/dflt-params-ref-self.js(default) -test/language/expressions/async-arrow-function/dflt-params-ref-self.js(strict mode) -test/language/expressions/async-function/named-dflt-params-ref-later.js(default) -test/language/expressions/async-function/named-dflt-params-ref-later.js(strict mode) -test/language/expressions/async-function/named-dflt-params-ref-self.js(default) -test/language/expressions/async-function/named-dflt-params-ref-self.js(strict mode) -test/language/expressions/async-function/nameless-dflt-params-ref-later.js(default) -test/language/expressions/async-function/nameless-dflt-params-ref-later.js(strict mode) -test/language/expressions/async-function/nameless-dflt-params-ref-self.js(default) -test/language/expressions/async-function/nameless-dflt-params-ref-self.js(strict mode) -test/language/statements/async-function/dflt-params-ref-later.js(default) -test/language/statements/async-function/dflt-params-ref-later.js(strict mode) -test/language/statements/async-function/dflt-params-ref-self.js(default) -test/language/statements/async-function/dflt-params-ref-self.js(strict mode) -test/language/statements/async-generator/dflt-params-ref-later.js(default) -test/language/statements/async-generator/dflt-params-ref-later.js(strict mode) -test/language/statements/async-generator/dflt-params-ref-self.js(default) -test/language/statements/async-generator/dflt-params-ref-self.js(strict mode) -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/async-generator/dflt-params-ref-later.js(default) -test/language/expressions/async-generator/dflt-params-ref-later.js(strict mode) -test/language/expressions/async-generator/dflt-params-ref-self.js(default) -test/language/expressions/async-generator/dflt-params-ref-self.js(strict mode) -test/language/expressions/async-generator/named-dflt-params-ref-later.js(default) -test/language/expressions/async-generator/named-dflt-params-ref-later.js(strict mode) -test/language/expressions/async-generator/named-dflt-params-ref-self.js(default) -test/language/expressions/async-generator/named-dflt-params-ref-self.js(strict mode) -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/object/accessor-name-literal-string-unicode-escape.js(default) test/language/expressions/object/accessor-name-literal-string-unicode-escape.js(strict mode) -test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-later.js(default) -test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-later.js(strict mode) -test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-self.js(default) -test/language/expressions/object/method-definition/async-gen-meth-dflt-params-ref-self.js(strict mode) -test/language/expressions/object/method-definition/async-meth-dflt-params-ref-later.js(default) -test/language/expressions/object/method-definition/async-meth-dflt-params-ref-later.js(strict mode) -test/language/expressions/object/method-definition/async-meth-dflt-params-ref-self.js(default) -test/language/expressions/object/method-definition/async-meth-dflt-params-ref-self.js(strict mode) -test/language/expressions/object/method-definition/gen-meth-dflt-params-ref-later.js(default) -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/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/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) # Async iteration test/language/expressions/async-generator/early-errors-expression-yield-star-after-newline.js(default) test/language/expressions/async-generator/early-errors-expression-yield-star-after-newline.js(strict mode) -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/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/export/escaped-as-export-specifier.js(default) test/language/export/escaped-as-export-specifier.js(strict mode) @@ -1672,22 +1606,6 @@ test/language/expressions/class/accessor-name-inst/literal-string-unicode-escape test/language/expressions/class/accessor-name-inst/literal-string-unicode-escape.js(strict mode) test/language/expressions/class/accessor-name-static/literal-string-unicode-escape.js(default) test/language/expressions/class/accessor-name-static/literal-string-unicode-escape.js(strict mode) -test/language/expressions/class/async-gen-method/dflt-params-ref-later.js(default) -test/language/expressions/class/async-gen-method/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/async-gen-method/dflt-params-ref-self.js(default) -test/language/expressions/class/async-gen-method/dflt-params-ref-self.js(strict mode) -test/language/expressions/class/async-gen-method-static/dflt-params-ref-later.js(default) -test/language/expressions/class/async-gen-method-static/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/async-gen-method-static/dflt-params-ref-self.js(default) -test/language/expressions/class/async-gen-method-static/dflt-params-ref-self.js(strict mode) -test/language/expressions/class/async-method/dflt-params-ref-later.js(default) -test/language/expressions/class/async-method/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/async-method/dflt-params-ref-self.js(default) -test/language/expressions/class/async-method/dflt-params-ref-self.js(strict mode) -test/language/expressions/class/async-method-static/dflt-params-ref-later.js(default) -test/language/expressions/class/async-method-static/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/async-method-static/dflt-params-ref-self.js(default) -test/language/expressions/class/async-method-static/dflt-params-ref-self.js(strict mode) test/language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-close.js(default) test/language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-close.js(strict mode) test/language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-no-close.js(default) @@ -4554,22 +4472,6 @@ test/language/expressions/class/elements/wrapped-in-sc-static-private-methods.js test/language/expressions/class/elements/wrapped-in-sc-static-private-methods.js(strict mode) test/language/expressions/class/elements/wrapped-in-sc-string-literal-names.js(default) test/language/expressions/class/elements/wrapped-in-sc-string-literal-names.js(strict mode) -test/language/expressions/class/gen-method/dflt-params-ref-later.js(default) -test/language/expressions/class/gen-method/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/gen-method/dflt-params-ref-self.js(default) -test/language/expressions/class/gen-method/dflt-params-ref-self.js(strict mode) -test/language/expressions/class/gen-method-static/dflt-params-ref-later.js(default) -test/language/expressions/class/gen-method-static/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/gen-method-static/dflt-params-ref-self.js(default) -test/language/expressions/class/gen-method-static/dflt-params-ref-self.js(strict mode) -test/language/expressions/class/method/dflt-params-ref-later.js(default) -test/language/expressions/class/method/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/method/dflt-params-ref-self.js(default) -test/language/expressions/class/method/dflt-params-ref-self.js(strict mode) -test/language/expressions/class/method-static/dflt-params-ref-later.js(default) -test/language/expressions/class/method-static/dflt-params-ref-later.js(strict mode) -test/language/expressions/class/method-static/dflt-params-ref-self.js(default) -test/language/expressions/class/method-static/dflt-params-ref-self.js(strict mode) test/language/expressions/dynamic-import/assignment-expression/additive-expr.js(default) test/language/expressions/dynamic-import/assignment-expression/additive-expr.js(strict mode) test/language/expressions/dynamic-import/assignment-expression/array-literal.js(default) @@ -5190,22 +5092,6 @@ test/language/statements/class/accessor-name-inst/literal-string-unicode-escape. test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.js(strict mode) test/language/statements/class/accessor-name-static/literal-string-unicode-escape.js(default) test/language/statements/class/accessor-name-static/literal-string-unicode-escape.js(strict mode) -test/language/statements/class/async-gen-method/dflt-params-ref-later.js(default) -test/language/statements/class/async-gen-method/dflt-params-ref-later.js(strict mode) -test/language/statements/class/async-gen-method/dflt-params-ref-self.js(default) -test/language/statements/class/async-gen-method/dflt-params-ref-self.js(strict mode) -test/language/statements/class/async-gen-method-static/dflt-params-ref-later.js(default) -test/language/statements/class/async-gen-method-static/dflt-params-ref-later.js(strict mode) -test/language/statements/class/async-gen-method-static/dflt-params-ref-self.js(default) -test/language/statements/class/async-gen-method-static/dflt-params-ref-self.js(strict mode) -test/language/statements/class/async-method/dflt-params-ref-later.js(default) -test/language/statements/class/async-method/dflt-params-ref-later.js(strict mode) -test/language/statements/class/async-method/dflt-params-ref-self.js(default) -test/language/statements/class/async-method/dflt-params-ref-self.js(strict mode) -test/language/statements/class/async-method-static/dflt-params-ref-later.js(default) -test/language/statements/class/async-method-static/dflt-params-ref-later.js(strict mode) -test/language/statements/class/async-method-static/dflt-params-ref-self.js(default) -test/language/statements/class/async-method-static/dflt-params-ref-self.js(strict mode) test/language/statements/class/dstr/async-private-gen-meth-ary-init-iter-close.js(default) test/language/statements/class/dstr/async-private-gen-meth-ary-init-iter-close.js(strict mode) test/language/statements/class/dstr/async-private-gen-meth-ary-init-iter-no-close.js(default) @@ -8112,22 +7998,6 @@ test/language/statements/class/elements/wrapped-in-sc-static-private-methods.js( test/language/statements/class/elements/wrapped-in-sc-static-private-methods.js(strict mode) test/language/statements/class/elements/wrapped-in-sc-string-literal-names.js(default) test/language/statements/class/elements/wrapped-in-sc-string-literal-names.js(strict mode) -test/language/statements/class/gen-method/dflt-params-ref-later.js(default) -test/language/statements/class/gen-method/dflt-params-ref-later.js(strict mode) -test/language/statements/class/gen-method/dflt-params-ref-self.js(default) -test/language/statements/class/gen-method/dflt-params-ref-self.js(strict mode) -test/language/statements/class/gen-method-static/dflt-params-ref-later.js(default) -test/language/statements/class/gen-method-static/dflt-params-ref-later.js(strict mode) -test/language/statements/class/gen-method-static/dflt-params-ref-self.js(default) -test/language/statements/class/gen-method-static/dflt-params-ref-self.js(strict mode) -test/language/statements/class/method/dflt-params-ref-later.js(default) -test/language/statements/class/method/dflt-params-ref-later.js(strict mode) -test/language/statements/class/method/dflt-params-ref-self.js(default) -test/language/statements/class/method/dflt-params-ref-self.js(strict mode) -test/language/statements/class/method-static/dflt-params-ref-later.js(default) -test/language/statements/class/method-static/dflt-params-ref-later.js(strict mode) -test/language/statements/class/method-static/dflt-params-ref-self.js(default) -test/language/statements/class/method-static/dflt-params-ref-self.js(strict mode) test/language/statements/for-of/dstr/array-elem-iter-rtrn-close-err.js(default) test/language/statements/for-of/dstr/array-elem-iter-rtrn-close-err.js(strict mode) test/language/statements/for-of/dstr/array-elem-iter-thrw-close-err.js(default) diff --git a/tests/unit/core.js b/tests/unit/core.js index 7c5ee5f1d9..60b82d77ac 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -1746,19 +1746,19 @@ exports.testDefaultArguments = function (test) { var src = fs.readFileSync(__dirname + "/fixtures/default-arguments.js", "utf8"); TestRun(test) .addError(14, 39, "'bar' is not defined.") - .addError(14, 32, "'num3' was used before it was declared, which is illegal for 'param' variables.") - .addError(15, 32, "'num4' was used before it was declared, which is illegal for 'param' variables.") + .addError(14, 32, "'num3' was used before it was defined.") + .addError(15, 32, "'num4' was used before it was defined.") .addError(18, 41, "Regular parameters should not come after default parameters.") .addError(27, 10, "'c' is not defined.") .addError(33, 4, "'d' was used before it was defined.") - .addError(36, 16, "'e' was used before it was declared, which is illegal for 'param' variables.") + .addError(36, 16, "'e' was used before it was defined.") .test(src, { esnext: true, undef: true, latedef: true }); TestRun(test) - .addError(14, 32, "'num3' was used before it was declared, which is illegal for 'param' variables.") - .addError(15, 32, "'num4' was used before it was declared, which is illegal for 'param' variables.") + .addError(14, 32, "'num3' was used before it was defined.") + .addError(15, 32, "'num4' was used before it was defined.") .addError(18, 41, "Regular parameters should not come after default parameters.") - .addError(36, 16, "'e' was used before it was declared, which is illegal for 'param' variables.") + .addError(36, 16, "'e' was used before it was defined.") .test(src, { moz: true }); TestRun(test) @@ -1768,9 +1768,9 @@ exports.testDefaultArguments = function (test) { .addError(12, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').") .addError(13, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').") .addError(14, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').") - .addError(14, 32, "'num3' was used before it was declared, which is illegal for 'param' variables.") + .addError(14, 32, "'num3' was used before it was defined.") .addError(15, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').") - .addError(15, 32, "'num4' was used before it was declared, which is illegal for 'param' variables.") + .addError(15, 32, "'num4' was used before it was defined.") .addError(18, 37, "'default parameters' is only available in ES6 (use 'esversion: 6').") .addError(18, 41, "Regular parameters should not come after default parameters.") .addError(26, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').") @@ -1778,7 +1778,7 @@ exports.testDefaultArguments = function (test) { .addError(33, 6, "'default parameters' is only available in ES6 (use 'esversion: 6').") .addError(35, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').") .addError(36, 18, "'default parameters' is only available in ES6 (use 'esversion: 6').") - .addError(36, 16, "'e' was used before it was declared, which is illegal for 'param' variables.") + .addError(36, 16, "'e' was used before it was defined.") .test(src, { }); test.done(); @@ -1786,7 +1786,7 @@ exports.testDefaultArguments = function (test) { exports.testEarlyCatchParam = function (test) { TestRun(test) - .addError(2, 18, "'y' was used before it was declared, which is illegal for 'exception' variables.") + .addError(2, 18, "'y' was used before it was defined.") .test([ "try {", "} catch ([x = y, y]) {", From a9bdc933dc6f3dc6c55427ca79a0052b2c8ca1ff Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 25 Oct 2020 14:18:37 -0400 Subject: [PATCH 15/20] [[FIX]] Improve declaration parsing Add an internal test so the coverage analysis tool recognizes that the modified branch is verified. --- src/jshint.js | 7 +++++-- tests/test262/expectations.txt | 6 ------ tests/unit/parser.js | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index d85b12caa3..edf820f330 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -4670,8 +4670,11 @@ var JSHINT = (function() { error("E008", this.name); } - if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) { - /* istanbul ignore next */ + // Although the parser correctly recognizes the statement boundary in this + // condition, it's support for the invalid "empty grouping" expression + // makes it tolerant of productions such as `function f() {}();`. + if (state.tokens.next.id === "(" && peek().id === ")" && peek(1).id !== "=>" && + state.tokens.next.line === state.tokens.curr.line) { error("E039"); } return this; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index b335f679fa..db4b5936f8 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -9028,12 +9028,6 @@ test/language/statementList/class-regexp-literal-flags.js(default) test/language/statementList/class-regexp-literal-flags.js(strict mode) test/language/statementList/class-regexp-literal.js(default) test/language/statementList/class-regexp-literal.js(strict mode) -test/language/statementList/fn-arrow-function-assignment-expr.js(default) -test/language/statementList/fn-arrow-function-assignment-expr.js(strict mode) -test/language/statementList/fn-arrow-function-functionbody.js(default) -test/language/statementList/fn-arrow-function-functionbody.js(strict mode) -test/language/statementList/fn-expr-arrow-function-boolean-literal.js(default) -test/language/statementList/fn-expr-arrow-function-boolean-literal.js(strict mode) test/language/statementList/fn-regexp-literal-flags.js(default) test/language/statementList/fn-regexp-literal-flags.js(strict mode) test/language/statementList/fn-regexp-literal.js(default) diff --git a/tests/unit/parser.js b/tests/unit/parser.js index f58b73a93a..5f90297b9f 100644 --- a/tests/unit/parser.js +++ b/tests/unit/parser.js @@ -10263,3 +10263,20 @@ exports.asyncIteration = function (test) { test.done(); }; + +exports.parensAfterDeclaration = function (test) { + TestRun(test) + .addError(1, 17, "Function declarations are not invocable. Wrap the whole function invocation in parens.") + .addError(1, 18, "Expected an assignment or function call and instead saw an expression.") + .test("function f () {}();"); + + TestRun(test) + .addError(1, 19, "Expected an assignment or function call and instead saw an expression.") + .test("function f () {}(0);"); + + TestRun(test) + .addError(1, 24, "Expected an assignment or function call and instead saw an expression.") + .test("function f () {}() => {};", {esversion: 6}); + + test.done(); +}; From c46f46492bcf8ffcf14ef90225ad75b2199348d0 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 20 Sep 2020 12:44:32 -0400 Subject: [PATCH 16/20] [[FEAT]] Add support for "export * as ns from" --- src/jshint.js | 11 +++++++++++ src/options.js | 3 ++- tests/test262/expectations.txt | 10 ---------- tests/unit/core.js | 27 +++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index edf820f330..33c8817341 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -5631,7 +5631,18 @@ var JSHINT = (function() { if (state.tokens.next.value === "*") { // ExportDeclaration :: export * FromClause + // ExportDeclaration :: export * as IdentifierName FromClause advance("*"); + + if (state.tokens.next.value === "as") { + if (!state.inES11()) { + warning("W119", state.tokens.curr, "export * as ns from", "11"); + } + advance("as"); + identifier(context, true); + state.funct["(scope)"].setExported(null, state.tokens.curr); + } + advance("from"); advance("(string)"); return this; diff --git a/src/options.js b/src/options.js index d8bc66b176..533934a208 100644 --- a/src/options.js +++ b/src/options.js @@ -1051,7 +1051,8 @@ exports.val = { * - `10` - To enable language features introduced by [ECMAScript * 10](https://www.ecma-international.org/ecma-262/10.0/index.html). * Notable additions: optional catch bindings. - * - `11` - To enable language features introduced by ECMAScript 11. + * - `11` - To enable language features introduced by ECMAScript 11. Notable + * additions: "export * as ns from 'module'". */ esversion: 5 }; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index db4b5936f8..66b7cb2f8e 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -1382,14 +1382,6 @@ test/language/comments/multi-line-asi-line-separator.js(default) test/language/comments/multi-line-asi-line-separator.js(strict mode) test/language/comments/multi-line-asi-paragraph-separator.js(default) test/language/comments/multi-line-asi-paragraph-separator.js(strict mode) -test/language/module-code/eval-rqstd-once.js(default) -test/language/module-code/eval-rqstd-once.js(strict mode) -test/language/module-code/eval-rqstd-order.js(default) -test/language/module-code/eval-rqstd-order.js(strict mode) -test/language/module-code/eval-self-once.js(default) -test/language/module-code/eval-self-once.js(strict mode) -test/language/module-code/instn-once.js(default) -test/language/module-code/instn-once.js(strict mode) test/language/module-code/privatename-valid-no-earlyerr.js(default) test/language/module-code/privatename-valid-no-earlyerr.js(strict mode) test/annexB/language/comments/single-line-html-close-unicode-separators.js(default) @@ -8998,8 +8990,6 @@ test/language/identifiers/start-unicode-9.0.0-escaped.js(default) test/language/identifiers/start-unicode-9.0.0-escaped.js(strict mode) test/language/identifiers/start-unicode-9.0.0.js(default) test/language/identifiers/start-unicode-9.0.0.js(strict mode) -test/language/module-code/export-star-as-dflt.js(default) -test/language/module-code/export-star-as-dflt.js(strict mode) test/language/statementList/block-array-literal-with-item.js(default) test/language/statementList/block-array-literal.js(default) test/language/statementList/block-arrow-function-assignment-expr.js(default) diff --git a/tests/unit/core.js b/tests/unit/core.js index 60b82d77ac..0d989788f1 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -1107,6 +1107,33 @@ exports.testES6ModuleDuplicateExport = function (test) { test.done(); }; +exports.testExportStar = function (test) { + TestRun(test, "rejects earlier language editions") + .addError(1, 8, "'export * as ns from' is only available in ES11 (use 'esversion: 11').") + .test([ + "export * as x from '.';" + ], { esversion: 10, module: true }); + + TestRun(test, "minimal esversion") + .test([ + "export * as x from '.';" + ], { esversion: 11, module: true }); + + TestRun(test, "tolerates any IdentifierName") + .test([ + "export * as if from '.';" + ], { esversion: 11, module: true }); + + TestRun(test, "detects duplicate bindings") + .addError(2, 13, "Duplicate exported binding: 'x'.") + .test([ + "export * as x from '.';", + "export * as x from '.';" + ], { esversion: 11, module: true }); + + test.done(); +}; + exports.testES6ModulesNamedExportsAffectUnused = function (test) { // Named Exports should count as used var src1 = [ From 73d7e0d0440a725fd5c76eb03e14f02f97547ba1 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Wed, 1 Jul 2020 22:47:39 -0400 Subject: [PATCH 17/20] [[FEAT]] Add support for `import.meta` Tolerate parsing errors regarding escape sequences in IdentifierNames as these reflect a pre-existing deficiency which will require a dedicated patch to correct. --- src/jshint.js | 27 ++++++++++++++-- src/messages.js | 3 +- src/options.js | 2 +- tests/test262/expectations.txt | 16 +++------- tests/unit/parser.js | 58 ++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 16 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 33c8817341..af0d863660 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -5512,7 +5512,23 @@ var JSHINT = (function() { return this; }).exps = true; - stmt("import", function(context) { + prefix("import", function(context) { + var mp = metaProperty(context, "meta", function() { + if (!state.inES11(true)) { + warning("W119", state.tokens.prev, "import.meta", "11"); + } + if (!state.option.module) { + error("E070", state.tokens.prev); + } + }); + + if (!mp) { + return state.syntax["(identifier)"].nud.call(this, context); + } + return mp; + }); + + var importSymbol = stmt("import", function(context) { if (!state.funct["(scope)"].block.isGlobal()) { error("E053", state.tokens.curr, "Import"); } @@ -5611,7 +5627,13 @@ var JSHINT = (function() { // } return this; - }).exps = true; + }); + importSymbol.exps = true; + importSymbol.reserved = true; + importSymbol.meta = { isFutureReservedWord: true, es5: true }; + importSymbol.useFud = function() { + return !(checkPunctuator(state.tokens.next, ".") && peek().identifier); + }; stmt("export", function(context) { var ok = true; @@ -5848,7 +5870,6 @@ var JSHINT = (function() { FutureReservedWord("float"); FutureReservedWord("goto"); FutureReservedWord("implements", { es5: true, strictOnly: true }); - FutureReservedWord("import", { es5: true }); FutureReservedWord("int"); FutureReservedWord("interface", { es5: true, strictOnly: true }); FutureReservedWord("long"); diff --git a/src/messages.js b/src/messages.js index d01ee4c5b0..113586b092 100644 --- a/src/messages.js +++ b/src/messages.js @@ -85,7 +85,8 @@ var errors = { E066: "Asynchronous iteration is only available with for-of loops.", E067: "Malformed numeric literal: '{a}'.", E068: "Decimals with leading zeros are not allowed in strict mode.", - E069: "Duplicate exported binding: '{a}'." + E069: "Duplicate exported binding: '{a}'.", + E070: "import.meta may only be used in module code." }; var warnings = { diff --git a/src/options.js b/src/options.js index 533934a208..c9a637a64c 100644 --- a/src/options.js +++ b/src/options.js @@ -1052,7 +1052,7 @@ exports.val = { * 10](https://www.ecma-international.org/ecma-262/10.0/index.html). * Notable additions: optional catch bindings. * - `11` - To enable language features introduced by ECMAScript 11. Notable - * additions: "export * as ns from 'module'". + * additions: "export * as ns from 'module'" and `import.meta`. */ esversion: 5 }; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 66b7cb2f8e..fd6bbe18b5 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -1447,12 +1447,6 @@ test/language/expressions/dynamic-import/reuse-namespace-object.js(default) test/language/expressions/dynamic-import/reuse-namespace-object.js(strict mode) test/language/expressions/dynamic-import/update-to-dynamic-import.js(default) test/language/expressions/dynamic-import/update-to-dynamic-import.js(strict mode) -test/language/expressions/import.meta/distinct-for-each-module.js(default) -test/language/expressions/import.meta/distinct-for-each-module.js(strict mode) -test/language/expressions/import.meta/import-meta-is-an-ordinary-object.js(default) -test/language/expressions/import.meta/import-meta-is-an-ordinary-object.js(strict mode) -test/language/expressions/import.meta/same-object-returned.js(default) -test/language/expressions/import.meta/same-object-returned.js(strict mode) test/language/statements/class/classelementname-abrupt-completion.js(default) test/language/statements/class/classelementname-abrupt-completion.js(strict mode) test/language/statements/class/static-classelementname-abrupt-completion.js(default) @@ -5076,10 +5070,6 @@ test/language/expressions/dynamic-import/usage/top-level-import-then-returns-the test/language/expressions/dynamic-import/usage/top-level-import-then-returns-thenable.js(strict mode) test/language/expressions/dynamic-import/usage/top-level-import-then-specifier-tostring.js(default) test/language/expressions/dynamic-import/usage/top-level-import-then-specifier-tostring.js(strict mode) -test/language/expressions/import.meta/syntax/goal-module-nested-function.js(default) -test/language/expressions/import.meta/syntax/goal-module-nested-function.js(strict mode) -test/language/expressions/import.meta/syntax/goal-module.js(default) -test/language/expressions/import.meta/syntax/goal-module.js(strict mode) test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.js(default) test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.js(strict mode) test/language/statements/class/accessor-name-static/literal-string-unicode-escape.js(default) @@ -10370,4 +10360,8 @@ test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref-i test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref-init.js(default) test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref-init.js(strict mode) test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref.js(default) -test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref.js(strict mode) \ No newline at end of file +test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref.js(strict mode) +test/language/expressions/import.meta/syntax/escape-sequence-import.js(default) +test/language/expressions/import.meta/syntax/escape-sequence-import.js(strict mode) +test/language/expressions/import.meta/syntax/escape-sequence-meta.js(default) +test/language/expressions/import.meta/syntax/escape-sequence-meta.js(strict mode) \ No newline at end of file diff --git a/tests/unit/parser.js b/tests/unit/parser.js index 5f90297b9f..90cc56051a 100644 --- a/tests/unit/parser.js +++ b/tests/unit/parser.js @@ -10280,3 +10280,61 @@ exports.parensAfterDeclaration = function (test) { test.done(); }; + +exports.importMeta = function (test) { + TestRun(test) + .addError(1, 6, "Expected an identifier and instead saw 'import' (a reserved word).") + .test("void import;"); + + TestRun(test) + .addError(1, 6, "Expected an identifier and instead saw 'import' (a reserved word).") + .test( + "void import;", + { esversion: 11 } + ); + + TestRun(test) + .addError(1, 12, "'import.meta' is only available in ES11 (use 'esversion: 11').") + .addError(1, 12, "import.meta may only be used in module code.") + .test( + "void import.meta;", + { esversion: 10 } + ); + + TestRun(test) + .addError(1, 12, "import.meta may only be used in module code.") + .test( + "void import.meta;", + { esversion: 11 } + ); + + TestRun(test, "valid usage (expression position)") + .test( + "void import.meta;", + { esversion: 11, module: true } + ); + + TestRun(test, "valid usage (statement position)") + .addError(1, 8, "Expected an assignment or function call and instead saw an expression.") + .test( + "import.meta;", + { esversion: 11, module: true } + ); + + TestRun(test, "Other property name (expression position)") + .addError(1, 12, "Invalid meta property: 'import.target'.") + .test( + "void import.target;", + { esversion: 11, module: true } + ); + + TestRun(test, "Other property name (statement position)") + .addError(1, 7, "Invalid meta property: 'import.target'.") + .addError(1, 8, "Expected an assignment or function call and instead saw an expression.") + .test( + "import.target;", + { esversion: 11, module: true } + ); + + test.done(); +}; From f50b14d11489ac2eae811f50e0e9e85334c2f8f6 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 28 Feb 2021 19:12:40 -0500 Subject: [PATCH 18/20] [[FEAT]] Implement support for nullish coalescing --- src/jshint.js | 23 +++++++++++ src/lex.js | 9 ++++- src/options.js | 3 +- tests/test262/expectations.txt | 40 ------------------- tests/unit/options.js | 26 ++++++++++++ tests/unit/parser.js | 73 ++++++++++++++++++++++++++++++++++ 6 files changed, 132 insertions(+), 42 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index af0d863660..07e0671f88 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -2437,6 +2437,26 @@ var JSHINT = (function() { return that; }, andPrecedence); + infix("??", function(context, left, that) { + if (!left.paren && (left.id === "||" || left.id === "&&")) { + error("E024", that, "??"); + } + + if (!state.inES11()) { + warning("W119", that, "nullish coalescing", "11"); + } + + increaseComplexityCount(); + that.left = left; + var right = that.right = expression(context, 39); + + if (!right.paren && (right.id === "||" || right.id === "&&")) { + error("E024", that.right, that.right.id); + } + + return that; + }, 39); + // The Exponentiation operator, introduced in ECMAScript 2016 // // ExponentiationExpression[Yield] : @@ -3246,6 +3266,9 @@ var JSHINT = (function() { // Used to cover a unary expression as the left-hand side of the // exponentiation operator (beginsUnaryExpression(ret) && state.tokens.next.id === "**") || + // Used to cover a logical operator as the right-hand side of the + // nullish coalescing operator + (preceeding.id === "??" && (ret.id === "&&" || ret.id === "||")) || // Used to delineate an integer number literal from a dereferencing // punctuator (otherwise interpreted as a decimal point) (ret.type === "(number)" && diff --git a/src/lex.js b/src/lex.js index e21d479167..4748833fd6 100644 --- a/src/lex.js +++ b/src/lex.js @@ -249,7 +249,6 @@ Lexer.prototype = { case "]": case ":": case "~": - case "?": return { type: Token.Punctuator, value: ch1 @@ -288,6 +287,14 @@ Lexer.prototype = { // Peek more characters ch2 = this.peek(1); + + if (ch1 === "?") { + return { + type: Token.Punctuator, + value: ch2 === "?" ? "??" : "?" + }; + } + ch3 = this.peek(2); ch4 = this.peek(3); diff --git a/src/options.js b/src/options.js index c9a637a64c..394a8c8187 100644 --- a/src/options.js +++ b/src/options.js @@ -1052,7 +1052,8 @@ exports.val = { * 10](https://www.ecma-international.org/ecma-262/10.0/index.html). * Notable additions: optional catch bindings. * - `11` - To enable language features introduced by ECMAScript 11. Notable - * additions: "export * as ns from 'module'" and `import.meta`. + * additions: "export * as ns from 'module'", `import.meta` and the nullish + * coalescing operator. */ esversion: 5 }; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index fd6bbe18b5..6b4a25f303 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -9050,46 +9050,6 @@ test/language/expressions/class/private-static-method-brand-check-multiple-evalu test/language/expressions/class/private-static-method-brand-check-multiple-evaluations-of-class-factory.js(strict mode) test/language/expressions/class/private-static-setter-multiple-evaluations-of-class-factory.js(default) test/language/expressions/class/private-static-setter-multiple-evaluations-of-class-factory.js(strict mode) -test/language/expressions/coalesce/abrupt-is-a-short-circuit.js(default) -test/language/expressions/coalesce/abrupt-is-a-short-circuit.js(strict mode) -test/language/expressions/coalesce/chainable-if-parenthesis-covered-logical-and.js(default) -test/language/expressions/coalesce/chainable-if-parenthesis-covered-logical-and.js(strict mode) -test/language/expressions/coalesce/chainable-if-parenthesis-covered-logical-or.js(default) -test/language/expressions/coalesce/chainable-if-parenthesis-covered-logical-or.js(strict mode) -test/language/expressions/coalesce/chainable-with-bitwise-and.js(default) -test/language/expressions/coalesce/chainable-with-bitwise-and.js(strict mode) -test/language/expressions/coalesce/chainable-with-bitwise-or.js(default) -test/language/expressions/coalesce/chainable-with-bitwise-or.js(strict mode) -test/language/expressions/coalesce/chainable-with-bitwise-xor.js(default) -test/language/expressions/coalesce/chainable-with-bitwise-xor.js(strict mode) -test/language/expressions/coalesce/chainable.js(default) -test/language/expressions/coalesce/chainable.js(strict mode) -test/language/expressions/coalesce/follows-null.js(default) -test/language/expressions/coalesce/follows-null.js(strict mode) -test/language/expressions/coalesce/follows-undefined.js(default) -test/language/expressions/coalesce/follows-undefined.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-0.js(default) -test/language/expressions/coalesce/short-circuit-number-0.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-42.js(default) -test/language/expressions/coalesce/short-circuit-number-42.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-empty-string.js(default) -test/language/expressions/coalesce/short-circuit-number-empty-string.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-false.js(default) -test/language/expressions/coalesce/short-circuit-number-false.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-object.js(default) -test/language/expressions/coalesce/short-circuit-number-object.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-string.js(default) -test/language/expressions/coalesce/short-circuit-number-string.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-symbol.js(default) -test/language/expressions/coalesce/short-circuit-number-symbol.js(strict mode) -test/language/expressions/coalesce/short-circuit-number-true.js(default) -test/language/expressions/coalesce/short-circuit-number-true.js(strict mode) -test/language/expressions/coalesce/short-circuit-prevents-evaluation.js(default) -test/language/expressions/coalesce/short-circuit-prevents-evaluation.js(strict mode) -test/language/expressions/coalesce/tco-pos-null.js(strict mode) -test/language/expressions/coalesce/tco-pos-undefined.js(strict mode) -test/language/expressions/conditional/coalesce-expr-ternary.js(default) -test/language/expressions/conditional/coalesce-expr-ternary.js(strict mode) test/language/expressions/logical-assignment/lgcl-and-assignment-operator-bigint.js(default) test/language/expressions/logical-assignment/lgcl-and-assignment-operator-bigint.js(strict mode) test/language/expressions/logical-assignment/lgcl-and-assignment-operator-lhs-before-rhs.js(default) diff --git a/tests/unit/options.js b/tests/unit/options.js index f8f8aa17f9..e18f8d4127 100644 --- a/tests/unit/options.js +++ b/tests/unit/options.js @@ -2748,6 +2748,12 @@ exports.maxcomplexity = function (test) { TestRun(test) .test(src, { es3: true }); + TestRun(test, "nullish coalescing operator") + .addError(1, 11, "This function's cyclomatic complexity is too high. (2)") + .test([ + "function f() { 0 ?? 0; }" + ], { esversion: 11, expr: true, maxcomplexity: 1 }); + test.done(); }; @@ -3682,6 +3688,26 @@ singleGroups.destructuringAssign = function (test) { test.done(); }; +singleGroups.nullishCoalescing = function (test) { + TestRun(test) + .addError(1, 1, "Unnecessary grouping operator.") + .addError(2, 6, "Unnecessary grouping operator.") + .test([ + "(0) ?? 0;", + "0 ?? (0);" + ], { singleGroups: true, expr: true, esversion: 11 }); + + TestRun(test) + .test([ + "0 ?? (0 || 0);", + "(0 ?? 0) || 0;", + "0 ?? (0 && 0);", + "(0 ?? 0) && 0;" + ], { singleGroups: true, expr: true, esversion: 11 }); + + test.done(); +}; + exports.elision = function (test) { var code = [ "var a = [1,,2];", diff --git a/tests/unit/parser.js b/tests/unit/parser.js index 90cc56051a..b0f1af4e97 100644 --- a/tests/unit/parser.js +++ b/tests/unit/parser.js @@ -10338,3 +10338,76 @@ exports.importMeta = function (test) { test.done(); }; + +exports.nullishCoalescing = {}; + +exports.nullishCoalescing.positive = function(test) { + TestRun(test, "requires esversion: 11") + .addError(1, 3, "'nullish coalescing' is only available in ES11 (use 'esversion: 11').") + .test([ + "0 ?? 0;" + ], { esversion: 10, expr: true }); + + TestRun(test, "does not stand alone") + .addError(1, 6, "Expected an assignment or function call and instead saw an expression.") + .test([ + "0 ?? 0;" + ], { esversion: 11 }); + + TestRun(test, "precedence with bitwise OR") + .test([ + "0 | 0 ?? 0;" + ], { esversion: 11, expr: true }); + + TestRun(test, "precedence with conditional expression") + .test([ + "0 ?? 0 ? 0 ?? 0 : 0 ?? 0;" + ], { esversion: 11, expr: true }); + + TestRun(test, "precedence with expression") + .test([ + "0 ?? 0, 0 ?? 0;" + ], { esversion: 11, expr: true }); + + TestRun(test, "covered") + .test([ + "0 || (0 ?? 0);", + "(0 || 0) ?? 0;", + "(0 ?? 0) || 0;", + "0 ?? (0 || 0);", + "0 && (0 ?? 0);", + "(0 && 0) ?? 0;", + "(0 ?? 0) && 0;", + "0 ?? (0 && 0);" + ], { esversion: 11, expr: true }); + + test.done(); +}; + +exports.nullishCoalescing.negative = function(test) { + TestRun(test, "precedence with logical OR") + .addError(1, 8, "Unexpected '??'.") + .test([ + "0 || 0 ?? 0;" + ], { esversion: 11, expr: true }); + + TestRun(test, "precedence with logical OR") + .addError(1, 8, "Unexpected '||'.") + .test([ + "0 ?? 0 || 0;" + ], { esversion: 11, expr: true }); + + TestRun(test, "precedence with logical AND") + .addError(1, 8, "Unexpected '??'.") + .test([ + "0 && 0 ?? 0;" + ], { esversion: 11, expr: true }); + + TestRun(test, "precedence with logical AND") + .addError(1, 8, "Unexpected '&&'.") + .test([ + "0 ?? 0 && 0;" + ], { esversion: 11, expr: true }); + + test.done(); +}; From b125dbea75c237cfd4553305f14d9d30fdd3a22c Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 13 Feb 2021 16:26:40 -0500 Subject: [PATCH 19/20] [[FEAT]] Add support for optional chaining --- src/jshint.js | 35 +++++++++++++- src/lex.js | 10 +++- src/options.js | 4 +- tests/test262/expectations.txt | 46 ++---------------- tests/unit/options.js | 24 ++++++++++ tests/unit/parser.js | 85 ++++++++++++++++++++++++++++++++++ 6 files changed, 156 insertions(+), 48 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index 07e0671f88..ccaf3d5171 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -2753,7 +2753,9 @@ var JSHINT = (function() { } } } else { - if (c.id !== "." && c.id !== "[" && c.id !== "(") { + if (c.id === "?." && !c.paren) { + error("E024", c, "?."); + } else if (c.id !== "." && c.id !== "[" && c.id !== "(") { /* istanbul ignore next */ warning("W056", state.tokens.curr); } @@ -3054,6 +3056,31 @@ var JSHINT = (function() { return that; }, 160, true); + infix("?.", function(context, left, that) { + if (!state.inES11()) { + warning("W119", state.tokens.curr, "Optional chaining", "11"); + } + + + if (checkPunctuator(state.tokens.next, "[")) { + that.left = left; + advance(); + that.right = state.tokens.curr.led(context, left); + } else if (checkPunctuator(state.tokens.next, "(")) { + that.left = left; + advance(); + that.right = state.tokens.curr.led(context, left); + } else { + state.syntax["."].led.call(that, context, left); + } + + if (state.tokens.next.type === "(template)") { + error("E024", state.tokens.next, "`"); + } + + return that; + }, 160, true); + infix("(", function(context, left, that) { if (state.option.immed && left && !left.immed && left.id === "function") { warning("W062"); @@ -3274,7 +3301,11 @@ var JSHINT = (function() { (ret.type === "(number)" && checkPunctuator(pn, ".") && /^\d+$/.test(ret.value)) || // Used to wrap object destructuring assignment - (opening.beginsStmt && ret.id === "=" && ret.left.id === "{"); + (opening.beginsStmt && ret.id === "=" && ret.left.id === "{") || + // Used to allow optional chaining with other language features which + // are otherwise restricted. + (ret.id === "?." && + (preceeding.id === "new" || state.tokens.next.type === "(template)")); } } diff --git a/src/lex.js b/src/lex.js index 4748833fd6..f6858f69b8 100644 --- a/src/lex.js +++ b/src/lex.js @@ -287,15 +287,23 @@ Lexer.prototype = { // Peek more characters ch2 = this.peek(1); + ch3 = this.peek(2); if (ch1 === "?") { + // Optional chaining + if (ch2 === "." && !reg.decimalDigit.test(ch3)) { + return { + type: Token.Punctuator, + value: "?." + }; + } + return { type: Token.Punctuator, value: ch2 === "?" ? "??" : "?" }; } - ch3 = this.peek(2); ch4 = this.peek(3); // 4-character punctuator: >>>= diff --git a/src/options.js b/src/options.js index 394a8c8187..b3ab40a6f9 100644 --- a/src/options.js +++ b/src/options.js @@ -1052,8 +1052,8 @@ exports.val = { * 10](https://www.ecma-international.org/ecma-262/10.0/index.html). * Notable additions: optional catch bindings. * - `11` - To enable language features introduced by ECMAScript 11. Notable - * additions: "export * as ns from 'module'", `import.meta` and the nullish - * coalescing operator. + * additions: "export * as ns from 'module'", `import.meta`, the nullish + * coalescing operator, and optional chaining. */ esversion: 5 }; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 6b4a25f303..72fb298852 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -9136,48 +9136,6 @@ test/language/expressions/object/ident-name-prop-name-literal-default-escaped-ex test/language/expressions/object/ident-name-prop-name-literal-default-escaped-ext.js(strict mode) test/language/expressions/object/ident-name-prop-name-literal-extends-escaped-ext.js(default) test/language/expressions/object/ident-name-prop-name-literal-extends-escaped-ext.js(strict mode) -test/language/expressions/optional-chaining/call-expression.js(default) -test/language/expressions/optional-chaining/call-expression.js(strict mode) -test/language/expressions/optional-chaining/iteration-statement-do.js(default) -test/language/expressions/optional-chaining/iteration-statement-do.js(strict mode) -test/language/expressions/optional-chaining/iteration-statement-for-await-of.js(default) -test/language/expressions/optional-chaining/iteration-statement-for-await-of.js(strict mode) -test/language/expressions/optional-chaining/iteration-statement-for-in.js(default) -test/language/expressions/optional-chaining/iteration-statement-for-in.js(strict mode) -test/language/expressions/optional-chaining/iteration-statement-for-of-type-error.js(default) -test/language/expressions/optional-chaining/iteration-statement-for-of-type-error.js(strict mode) -test/language/expressions/optional-chaining/iteration-statement-for.js(default) -test/language/expressions/optional-chaining/iteration-statement-for.js(strict mode) -test/language/expressions/optional-chaining/iteration-statement-while.js(default) -test/language/expressions/optional-chaining/iteration-statement-while.js(strict mode) -test/language/expressions/optional-chaining/member-expression-async-identifier.js(default) -test/language/expressions/optional-chaining/member-expression-async-identifier.js(strict mode) -test/language/expressions/optional-chaining/member-expression-async-literal.js(default) -test/language/expressions/optional-chaining/member-expression-async-literal.js(strict mode) -test/language/expressions/optional-chaining/member-expression-async-this.js(default) -test/language/expressions/optional-chaining/member-expression-async-this.js(strict mode) -test/language/expressions/optional-chaining/member-expression.js(default) -test/language/expressions/optional-chaining/member-expression.js(strict mode) -test/language/expressions/optional-chaining/new-target-optional-call.js(default) -test/language/expressions/optional-chaining/new-target-optional-call.js(strict mode) -test/language/expressions/optional-chaining/optional-call-preserves-this.js(default) -test/language/expressions/optional-chaining/optional-call-preserves-this.js(strict mode) -test/language/expressions/optional-chaining/optional-chain-async-optional-chain-square-brackets.js(default) -test/language/expressions/optional-chaining/optional-chain-async-optional-chain-square-brackets.js(strict mode) -test/language/expressions/optional-chaining/optional-chain-async-square-brackets.js(default) -test/language/expressions/optional-chaining/optional-chain-async-square-brackets.js(strict mode) -test/language/expressions/optional-chaining/optional-chain-expression-optional-expression.js(default) -test/language/expressions/optional-chaining/optional-chain-expression-optional-expression.js(strict mode) -test/language/expressions/optional-chaining/optional-chain.js(default) -test/language/expressions/optional-chaining/optional-chain.js(strict mode) -test/language/expressions/optional-chaining/optional-expression.js(default) -test/language/expressions/optional-chaining/optional-expression.js(strict mode) -test/language/expressions/optional-chaining/runtime-semantics-evaluation.js(default) -test/language/expressions/optional-chaining/runtime-semantics-evaluation.js(strict mode) -test/language/expressions/optional-chaining/short-circuiting.js(default) -test/language/expressions/optional-chaining/short-circuiting.js(strict mode) -test/language/expressions/optional-chaining/super-property-optional-call.js(default) -test/language/expressions/optional-chaining/super-property-optional-call.js(strict mode) test/language/module-code/top-level-await/await-awaits-thenable-not-callable.js(default) test/language/module-code/top-level-await/await-awaits-thenable-not-callable.js(strict mode) test/language/module-code/top-level-await/await-awaits-thenables-that-throw.js(default) @@ -10324,4 +10282,6 @@ test/language/statements/for-of/dstr/obj-prop-elem-target-obj-literal-prop-ref.j test/language/expressions/import.meta/syntax/escape-sequence-import.js(default) test/language/expressions/import.meta/syntax/escape-sequence-import.js(strict mode) test/language/expressions/import.meta/syntax/escape-sequence-meta.js(default) -test/language/expressions/import.meta/syntax/escape-sequence-meta.js(strict mode) \ No newline at end of file +test/language/expressions/import.meta/syntax/escape-sequence-meta.js(strict mode) +test/language/expressions/optional-chaining/call-expression-super-no-base.js(default) +test/language/expressions/optional-chaining/call-expression-super-no-base.js(strict mode) \ No newline at end of file diff --git a/tests/unit/options.js b/tests/unit/options.js index e18f8d4127..ca0d54324f 100644 --- a/tests/unit/options.js +++ b/tests/unit/options.js @@ -3708,6 +3708,30 @@ singleGroups.nullishCoalescing = function (test) { test.done(); }; +singleGroups.optionalChaining = function (test) { + var code = [ + "new ({}?.constructor)();", + "({}?.toString)``;", + // Invalid forms: + "([])?.x;", + "([]?.x).x;", + "([]?.x)?.x;" + ]; + + TestRun(test) + .addError(1, 21, "Bad constructor.") + .addError(2, 15, "Expected an assignment or function call and instead saw an expression.") + .addError(3, 1, "Unnecessary grouping operator.") + .addError(3, 7, "Expected an assignment or function call and instead saw an expression.") + .addError(4, 1, "Unnecessary grouping operator.") + .addError(4, 9, "Expected an assignment or function call and instead saw an expression.") + .addError(5, 1, "Unnecessary grouping operator.") + .addError(5, 10, "Expected an assignment or function call and instead saw an expression.") + .test(code, { singleGroups: true, esversion: 11 }); + + test.done(); +}; + exports.elision = function (test) { var code = [ "var a = [1,,2];", diff --git a/tests/unit/parser.js b/tests/unit/parser.js index b0f1af4e97..70bab6999a 100644 --- a/tests/unit/parser.js +++ b/tests/unit/parser.js @@ -10411,3 +10411,88 @@ exports.nullishCoalescing.negative = function(test) { test.done(); }; + +exports.optionalChaining = function (test) { + TestRun(test, "prior language editions") + .addError(1, 5, "'Optional chaining' is only available in ES11 (use 'esversion: 11').") + .addError(1, 7, "Expected an assignment or function call and instead saw an expression.") + .test( + "true?.x;", + { esversion: 10 } + ); + + TestRun(test, "literal property name") + .addError(1, 7, "Expected an assignment or function call and instead saw an expression.") + .addError(2, 5, "Expected an assignment or function call and instead saw an expression.") + .addError(3, 7, "Expected an assignment or function call and instead saw an expression.") + .test([ + "true?.x;", + "[]?.x;", + "({}?.x);" + ], { esversion: 11 } + ); + + TestRun(test, "literal property name restriction") + .addError(1, 40, "Expected an assignment or function call and instead saw an expression.") + .addError(1, 46, "Strict violation.") + .test( + "(function() { 'use strict'; arguments?.callee; })();", + { esversion: 11 } + ); + + TestRun(test, "dynamic property name") + .addError(1, 14, "Expected an assignment or function call and instead saw an expression.") + .addError(2, 11, "Expected an assignment or function call and instead saw an expression.") + .addError(2, 7, "['x'] is better written in dot notation.") + .test([ + "true?.[void 0];", + "true?.['x'];" + ], { esversion: 11 } + ); + + TestRun(test, "arguments") + .addError(1, 10, "Expected an assignment or function call and instead saw an expression.") + .addError(2, 14, "Expected an assignment or function call and instead saw an expression.") + .addError(3, 20, "Expected an assignment or function call and instead saw an expression.") + .addError(4, 15, "Expected an assignment or function call and instead saw an expression.") + .test([ + "true.x?.();", + "true.x?.(true);", + "true.x?.(true, true);", + "true.x?.(...[]);" + ], { esversion: 11 } + ); + + TestRun(test, "new") + .addError(1, 7, "Unexpected '?.'.") + .test( + "new {}?.constructor();", + { esversion: 11 } + ); + + TestRun(test, "template invocation - literal property name") + .addError(1, 15, "Expected an assignment or function call and instead saw an expression.") + .addError(1, 15, "Unexpected '`'.") + .test( + "true?.toString``;", + { esversion: 11 } + ); + + TestRun(test, "template invocation - dynamic property name") + .addError(1, 15, "Expected an assignment or function call and instead saw an expression.") + .addError(1, 15, "Unexpected '`'.") + .test( + "true?.[void 0]``;", + { esversion: 11 } + ); + + TestRun(test, "ternary") + .addError(1, 8, "A leading decimal point can be confused with a dot: '.1'.") + .addError(1, 11, "Expected an assignment or function call and instead saw an expression.") + .test( + "true?.1 : null;", + { esversion: 11 } + ); + + test.done(); +}; From 6bfcaed3520d05686b4dde002208e5757c713b64 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 20 Feb 2021 22:21:15 -0500 Subject: [PATCH 20/20] [[FEAT]] Add support for dynamic import --- src/jshint.js | 19 +- src/options.js | 2 +- tests/test262/expectations.txt | 802 +-------------------------------- tests/unit/dynamic-import.js | 62 +++ 4 files changed, 82 insertions(+), 803 deletions(-) create mode 100644 tests/unit/dynamic-import.js diff --git a/src/jshint.js b/src/jshint.js index ccaf3d5171..3ffbee968c 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -5576,10 +5576,22 @@ var JSHINT = (function() { } }); - if (!mp) { + if (mp) { + return mp; + } + + if (!checkPunctuator(state.tokens.next, "(")) { return state.syntax["(identifier)"].nud.call(this, context); } - return mp; + + if (!state.inES11()) { + warning("W119", state.tokens.curr, "dynamic import", "11"); + } + + advance("("); + expression(context, 10); + advance(")"); + return this; }); var importSymbol = stmt("import", function(context) { @@ -5686,8 +5698,9 @@ var JSHINT = (function() { importSymbol.reserved = true; importSymbol.meta = { isFutureReservedWord: true, es5: true }; importSymbol.useFud = function() { - return !(checkPunctuator(state.tokens.next, ".") && peek().identifier); + return !(checkPunctuators(state.tokens.next, [".", "("])); }; + importSymbol.rbp = 161; stmt("export", function(context) { var ok = true; diff --git a/src/options.js b/src/options.js index b3ab40a6f9..482575eaa1 100644 --- a/src/options.js +++ b/src/options.js @@ -1053,7 +1053,7 @@ exports.val = { * Notable additions: optional catch bindings. * - `11` - To enable language features introduced by ECMAScript 11. Notable * additions: "export * as ns from 'module'", `import.meta`, the nullish - * coalescing operator, and optional chaining. + * coalescing operator, and optional chaining, and dynamic import. */ esversion: 5 }; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index 72fb298852..7863ce36f0 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -1391,62 +1391,6 @@ test/intl402/Intl/getCanonicalLocales/non-iana-canon.js(default) test/intl402/Intl/getCanonicalLocales/non-iana-canon.js(strict mode) test/language/expressions/class/constructor-this-tdz-during-initializers.js(default) test/language/expressions/class/constructor-this-tdz-during-initializers.js(strict mode) -test/language/expressions/dynamic-import/always-create-new-promise.js(default) -test/language/expressions/dynamic-import/always-create-new-promise.js(strict mode) -test/language/expressions/dynamic-import/assign-expr-get-value-abrupt-throws.js(default) -test/language/expressions/dynamic-import/assign-expr-get-value-abrupt-throws.js(strict mode) -test/language/expressions/dynamic-import/await-import-evaluation.js(default) -test/language/expressions/dynamic-import/await-import-evaluation.js(strict mode) -test/language/expressions/dynamic-import/custom-primitive.js(default) -test/language/expressions/dynamic-import/custom-primitive.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-cls-anon.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-cls-anon.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-cls-name-meth.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-cls-name-meth.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-cls-named.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-cls-named.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-cls-anon.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-cls-anon.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-cls-name-meth.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-cls-name-meth.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-cls-named.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-cls-named.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-fn-anon.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-fn-anon.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-fn-named.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-fn-named.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-gen-anon.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-gen-anon.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-gen-named.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-gen-named.js(strict mode) -test/language/expressions/dynamic-import/eval-export-dflt-expr-in.js(default) -test/language/expressions/dynamic-import/eval-export-dflt-expr-in.js(strict mode) -test/language/expressions/dynamic-import/eval-rqstd-once.js(default) -test/language/expressions/dynamic-import/eval-rqstd-once.js(strict mode) -test/language/expressions/dynamic-import/eval-self-once-module.js(default) -test/language/expressions/dynamic-import/eval-self-once-module.js(strict mode) -test/language/expressions/dynamic-import/eval-self-once-script.js(default) -test/language/expressions/dynamic-import/eval-self-once-script.js(strict mode) -test/language/expressions/dynamic-import/for-await-resolution-and-error-agen-yield.js(default) -test/language/expressions/dynamic-import/for-await-resolution-and-error-agen-yield.js(strict mode) -test/language/expressions/dynamic-import/for-await-resolution-and-error-agen.js(default) -test/language/expressions/dynamic-import/for-await-resolution-and-error-agen.js(strict mode) -test/language/expressions/dynamic-import/for-await-resolution-and-error.js(default) -test/language/expressions/dynamic-import/for-await-resolution-and-error.js(strict mode) -test/language/expressions/dynamic-import/imported-self-update.js(default) -test/language/expressions/dynamic-import/imported-self-update.js(strict mode) -test/language/expressions/dynamic-import/indirect-resolution.js(default) -test/language/expressions/dynamic-import/indirect-resolution.js(strict mode) -test/language/expressions/dynamic-import/returns-promise.js(default) -test/language/expressions/dynamic-import/returns-promise.js(strict mode) -test/language/expressions/dynamic-import/reuse-namespace-object-from-import.js(default) -test/language/expressions/dynamic-import/reuse-namespace-object-from-import.js(strict mode) -test/language/expressions/dynamic-import/reuse-namespace-object-from-script.js(default) -test/language/expressions/dynamic-import/reuse-namespace-object-from-script.js(strict mode) -test/language/expressions/dynamic-import/reuse-namespace-object.js(default) -test/language/expressions/dynamic-import/reuse-namespace-object.js(strict mode) -test/language/expressions/dynamic-import/update-to-dynamic-import.js(default) -test/language/expressions/dynamic-import/update-to-dynamic-import.js(strict mode) test/language/statements/class/classelementname-abrupt-completion.js(default) test/language/statements/class/classelementname-abrupt-completion.js(strict mode) test/language/statements/class/static-classelementname-abrupt-completion.js(default) @@ -4458,618 +4402,6 @@ test/language/expressions/class/elements/wrapped-in-sc-static-private-methods.js test/language/expressions/class/elements/wrapped-in-sc-static-private-methods.js(strict mode) test/language/expressions/class/elements/wrapped-in-sc-string-literal-names.js(default) test/language/expressions/class/elements/wrapped-in-sc-string-literal-names.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/additive-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/additive-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/array-literal.js(default) -test/language/expressions/dynamic-import/assignment-expression/array-literal.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/arrow-function.js(default) -test/language/expressions/dynamic-import/assignment-expression/arrow-function.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/await-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/await-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/await-identifier.js(default) -test/language/expressions/dynamic-import/assignment-expression/await-identifier.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/call-expr-arguments.js(default) -test/language/expressions/dynamic-import/assignment-expression/call-expr-arguments.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/call-expr-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/call-expr-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/call-expr-identifier.js(default) -test/language/expressions/dynamic-import/assignment-expression/call-expr-identifier.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/cover-call-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/cover-call-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/cover-parenthesized-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/cover-parenthesized-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/identifier.js(default) -test/language/expressions/dynamic-import/assignment-expression/identifier.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/import-meta.js(default) -test/language/expressions/dynamic-import/assignment-expression/import-meta.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/lhs-assign-operator-assign-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/lhs-assign-operator-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/lhs-eq-assign-expr-nostrict.js(default) -test/language/expressions/dynamic-import/assignment-expression/logical-and-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/logical-and-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/lhs-eq-assign-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/lhs-eq-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/logical-or-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/logical-or-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/member-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/member-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/new-target.js(default) -test/language/expressions/dynamic-import/assignment-expression/new-target.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/object-literal.js(default) -test/language/expressions/dynamic-import/assignment-expression/object-literal.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/ternary.js(default) -test/language/expressions/dynamic-import/assignment-expression/ternary.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/tagged-function-call.js(default) -test/language/expressions/dynamic-import/assignment-expression/tagged-function-call.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/this.js(default) -test/language/expressions/dynamic-import/assignment-expression/this.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/unary-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/unary-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/yield-assign-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/yield-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/yield-expr.js(default) -test/language/expressions/dynamic-import/assignment-expression/yield-expr.js(strict mode) -test/language/expressions/dynamic-import/assignment-expression/yield-identifier.js(default) -test/language/expressions/dynamic-import/assignment-expression/yield-star.js(default) -test/language/expressions/dynamic-import/assignment-expression/yield-star.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-await-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-await-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-return-await-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-function-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-function-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-await-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-block-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-block-labeled-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-block-labeled-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-do-while-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-do-while-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-else-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-function-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-if-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/nested-while-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-eval-rqstd-abrupt-typeerror.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-eval-rqstd-abrupt-typeerror.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-eval-rqstd-abrupt-urierror.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-eval-rqstd-abrupt-urierror.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-eval-script-code-target.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-eval-script-code-target.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-file-does-not-exist.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-file-does-not-exist.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-instn-iee-err-ambiguous-import.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-instn-iee-err-ambiguous-import.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-instn-iee-err-circular.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-instn-iee-err-circular.js(strict mode) -test/language/expressions/dynamic-import/catch/top-level-import-catch-specifier-tostring-abrupt-rejects.js(default) -test/language/expressions/dynamic-import/catch/top-level-import-catch-specifier-tostring-abrupt-rejects.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-Symbol-toStringTag.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-Symbol-toStringTag.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-define-own-property.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-define-own-property.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-delete-exported-init-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-delete-exported-init-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-delete-non-exported-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-delete-non-exported-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-extensible.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-extensible.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-nested-namespace-dflt-direct.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-nested-namespace-dflt-direct.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-nested-namespace-dflt-indirect.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-nested-namespace-dflt-indirect.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-nested-namespace-props-nrml.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-nested-namespace-props-nrml.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-own-property-str-found-init.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-own-property-str-found-init.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-own-property-str-not-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-own-property-str-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-own-property-sym.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-own-property-sym.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-str-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-str-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-str-not-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-str-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-sym-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-sym-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-get-sym-not-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-get-sym-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-str-found-init.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-str-found-init.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-str-not-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-str-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-sym-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-sym-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-sym-not-found.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-has-property-sym-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-no-iterator.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-no-iterator.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-own-property-keys-sort.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-own-property-keys-sort.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-prevent-extensions-object.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-prevent-extensions-object.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-prevent-extensions-reflect.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-prevent-extensions-reflect.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-prop-descs.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-prop-descs.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-prototype.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-prototype.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-set-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-set-prototype-of-null.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-set-prototype-of-null.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-set-prototype-of.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-set-prototype-of.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-set-same-values-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/await-ns-set-same-values-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/await-ns-set-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/default-property-not-set-own.js(default) -test/language/expressions/dynamic-import/namespace/default-property-not-set-own.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-Symbol-toStringTag.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-Symbol-toStringTag.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-define-own-property.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-define-own-property.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-delete-exported-init-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-delete-exported-init-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-delete-non-exported-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-delete-non-exported-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-extensible.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-extensible.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-nested-namespace-dflt-direct.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-nested-namespace-dflt-direct.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-nested-namespace-dflt-indirect.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-nested-namespace-dflt-indirect.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-nested-namespace-props-nrml.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-nested-namespace-props-nrml.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-own-property-str-found-init.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-own-property-str-found-init.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-own-property-str-not-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-own-property-str-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-own-property-sym.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-own-property-sym.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-str-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-str-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-str-not-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-str-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-sym-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-sym-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-sym-not-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-get-sym-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-str-found-init.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-str-found-init.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-str-not-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-str-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-sym-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-sym-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-sym-not-found.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-has-property-sym-not-found.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-no-iterator.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-no-iterator.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-own-property-keys-sort.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-own-property-keys-sort.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prevent-extensions-object.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prevent-extensions-object.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prevent-extensions-reflect.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prevent-extensions-reflect.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prop-descs.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prop-descs.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prototype.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-prototype.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-prototype-of-null.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-prototype-of-null.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-prototype-of.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-prototype-of.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-same-values-no-strict.js(default) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-same-values-strict.js(strict mode) -test/language/expressions/dynamic-import/namespace/promise-then-ns-set-strict.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-assignment-expression-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-arrow-import-then-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-await-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-arrow-function-return-await-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-await-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-await-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-await-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-await-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-await-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-await-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-await-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-await-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-await-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-await-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-await-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-await-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-return-await-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-function-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-function-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-await-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-async-gen-return-await-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-block-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-block-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-block-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-block-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-block-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-block-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-block-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-block-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-block-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-block-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-block-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-block-import-then-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-do-while-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-do-while-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-do-while-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-do-while-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-do-while-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-do-while-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-do-while-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-do-while-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-do-while-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-do-while-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-do-while-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-do-while-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-else-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-else-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-else-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-else-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-else-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-else-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-else-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-else-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-else-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-else-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-else-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-else-import-then-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-function-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-function-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-function-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-function-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-function-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-function-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-function-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-function-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-function-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-function-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-function-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-function-import-then-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-braceless-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-if-braceless-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-braceless-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-if-braceless-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-braceless-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-if-braceless-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-braceless-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-if-braceless-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-braceless-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-if-braceless-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-braceless-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-if-braceless-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-if-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-if-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-if-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-if-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-if-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-if-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-if-import-then-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-while-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/nested-while-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-while-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/nested-while-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-while-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/nested-while-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-while-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/nested-while-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-while-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/nested-while-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/nested-while-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/nested-while-import-then-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/syntax-nested-block-labeled-specifier-tostring.js(strict mode) -test/language/expressions/dynamic-import/usage/top-level-import-then-eval-gtbndng-indirect-update-dflt.js(default) -test/language/expressions/dynamic-import/usage/top-level-import-then-eval-gtbndng-indirect-update-dflt.js(strict mode) -test/language/expressions/dynamic-import/usage/top-level-import-then-eval-gtbndng-indirect-update.js(default) -test/language/expressions/dynamic-import/usage/top-level-import-then-eval-gtbndng-indirect-update.js(strict mode) -test/language/expressions/dynamic-import/usage/top-level-import-then-eval-script-code-host-resolves-module-code.js(default) -test/language/expressions/dynamic-import/usage/top-level-import-then-eval-script-code-host-resolves-module-code.js(strict mode) -test/language/expressions/dynamic-import/usage/top-level-import-then-is-call-expression-square-brackets.js(default) -test/language/expressions/dynamic-import/usage/top-level-import-then-is-call-expression-square-brackets.js(strict mode) -test/language/expressions/dynamic-import/usage/top-level-import-then-returns-thenable.js(default) -test/language/expressions/dynamic-import/usage/top-level-import-then-returns-thenable.js(strict mode) -test/language/expressions/dynamic-import/usage/top-level-import-then-specifier-tostring.js(default) -test/language/expressions/dynamic-import/usage/top-level-import-then-specifier-tostring.js(strict mode) test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.js(default) test/language/statements/class/accessor-name-inst/literal-string-unicode-escape.js(strict mode) test/language/statements/class/accessor-name-static/literal-string-unicode-escape.js(default) @@ -8363,132 +7695,6 @@ test/language/expressions/class/elements/private-methods/prod-private-method-ini test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js(strict mode) test/language/expressions/class/elements/private-methods/prod-private-method.js(default) test/language/expressions/class/elements/private-methods/prod-private-method.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/callexpression-arguments.js(default) -test/language/expressions/dynamic-import/syntax/valid/callexpression-arguments.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/callexpression-templateliteral.js(default) -test/language/expressions/dynamic-import/syntax/valid/callexpression-templateliteral.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-arrow-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-function-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-block-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-block-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-block-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-block-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-block-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-block-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-do-while-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-do-while-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-do-while-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-do-while-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-do-while-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-do-while-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-else-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-else-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-else-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-else-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-else-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-else-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-function-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-function-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-function-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-function-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-function-return-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-function-return-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-function-return-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-function-return-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-function-return-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-function-return-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-function-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-function-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-if-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-if-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-if-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-if-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-if-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-if-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-while-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-while-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-while-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-while-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-while-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-while-script-code-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/nested-with-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-with-expression-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-with-expression-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-with-expression-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-with-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/nested-with-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/new-covered-expression-is-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/new-covered-expression-is-valid.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/top-level-empty-str-is-valid-assign-expr.js(default) -test/language/expressions/dynamic-import/syntax/valid/top-level-empty-str-is-valid-assign-expr.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/top-level-nested-imports.js(default) -test/language/expressions/dynamic-import/syntax/valid/top-level-nested-imports.js(strict mode) -test/language/expressions/dynamic-import/syntax/valid/top-level-script-code-valid.js(default) -test/language/expressions/dynamic-import/syntax/valid/top-level-script-code-valid.js(strict mode) test/language/statements/class/elements/async-gen-private-method/yield-promise-reject-next-catch.js(default) test/language/statements/class/elements/async-gen-private-method/yield-promise-reject-next-catch.js(strict mode) test/language/statements/class/elements/async-gen-private-method/yield-promise-reject-next-for-await-of-async-iterator.js(default) @@ -9160,10 +8366,6 @@ test/language/module-code/top-level-await/await-expr-resolution.js(default) test/language/module-code/top-level-await/await-expr-resolution.js(strict mode) test/language/module-code/top-level-await/await-void-expr.js(default) test/language/module-code/top-level-await/await-void-expr.js(strict mode) -test/language/module-code/top-level-await/dynamic-import-rejection.js(default) -test/language/module-code/top-level-await/dynamic-import-rejection.js(strict mode) -test/language/module-code/top-level-await/dynamic-import-resolution.js(default) -test/language/module-code/top-level-await/dynamic-import-resolution.js(strict mode) test/language/module-code/top-level-await/if-await-expr.js(default) test/language/module-code/top-level-await/if-await-expr.js(strict mode) test/language/module-code/top-level-await/module-async-import-async-resolution-ticks.js(default) @@ -10284,4 +9486,6 @@ test/language/expressions/import.meta/syntax/escape-sequence-import.js(strict mo test/language/expressions/import.meta/syntax/escape-sequence-meta.js(default) test/language/expressions/import.meta/syntax/escape-sequence-meta.js(strict mode) test/language/expressions/optional-chaining/call-expression-super-no-base.js(default) -test/language/expressions/optional-chaining/call-expression-super-no-base.js(strict mode) \ No newline at end of file +test/language/expressions/optional-chaining/call-expression-super-no-base.js(strict mode) +test/language/expressions/dynamic-import/escape-sequence-import.js(default) +test/language/expressions/dynamic-import/escape-sequence-import.js(strict mode) diff --git a/tests/unit/dynamic-import.js b/tests/unit/dynamic-import.js new file mode 100644 index 0000000000..151768d582 --- /dev/null +++ b/tests/unit/dynamic-import.js @@ -0,0 +1,62 @@ +/** + * Tests for the parser/tokenizer + */ + +"use strict"; + +var JSHINT = require("../..").JSHINT; +var fs = require('fs'); +var TestRun = require("../helpers/testhelper").setup.testRun; +var path = require("path"); + +exports.dynamicImport = {}; + +exports.dynamicImport.valid = function (test) { + TestRun(test) + .test([ + "import(0);", + "import(0 ? 0 : 0);", + "(function * () { ", + " import(yield);", + "})();", + "import(() => {});", + "import(async () => {});", + "import(x = 0);", + "new (import(0))();", + "import(import(0));", + ], {esversion: 11}); + + test.done(); +}; + +exports.dynamicImport.invalidvalid = function (test) { + TestRun(test, "empty") + .addError(1, 8, "Expected an identifier and instead saw ')'.") + .addError(1, 9, "Expected ')' and instead saw ';'.") + .addError(1, 10, "Missing semicolon.") + .test("import();", {esversion: 11}); + + TestRun(test, "expression") + .addError(1, 11, "Expected ')' and instead saw ','.") + .addError(1, 12, "Missing semicolon.") + .addError(1, 13, "Expected an assignment or function call and instead saw an expression.") + .addError(1, 16, "Missing semicolon.") + .addError(1, 16, "Expected an identifier and instead saw ')'.") + .addError(1, 16, "Expected an assignment or function call and instead saw an expression.") + .test("import('a', 'b');", {esversion: 11}); + + TestRun(test, "NewExpression") + .addError(1, 5, "Unexpected 'import'.") + .addError(1, 13, "Missing '()' invoking a constructor.") + .test("new import(0);", {esversion: 11}); + + test.done(); +}; + +exports.dynamicImport.esversion = function (test) { + TestRun(test) + .addError(1, 1, "'dynamic import' is only available in ES11 (use 'esversion: 11').") + .test("import(0);", {esversion: 10}); + + test.done(); +};