From 0f619db0345aa48627e51beeba797b2501a8a104 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Fri, 12 Nov 2021 13:27:04 -0800 Subject: [PATCH] Plain JS binder errors Issue select errors from the binder in JS files that do not have checkJS explicitly turned on or off. These errors mirror runtime checks done by Javascript. --- src/compiler/program.ts | 37 +++++++-- ...mentsReferenceInConstructor4_Js.errors.txt | 46 ++++++++++++ .../argumentsReferenceInMethod4_Js.errors.txt | 44 +++++++++++ .../reference/jsdocTypedefNoCrash2.errors.txt | 10 ++- .../reference/plainJSModuleStrict.errors.txt | 37 +++++++++ .../reference/plainJSModuleStrict.js | 30 ++++++++ .../reference/plainJSModuleStrict.symbols | 28 +++++++ .../reference/plainJSModuleStrict.types | 33 ++++++++ .../reference/plainJSRedeclare.errors.txt | 13 ++++ tests/baselines/reference/plainJSRedeclare.js | 10 +++ .../reference/plainJSRedeclare.symbols | 12 +++ .../reference/plainJSRedeclare.types | 17 +++++ .../reference/plainJSRedeclare2.errors.txt | 16 ++++ .../baselines/reference/plainJSRedeclare2.js | 10 +++ .../reference/plainJSRedeclare2.symbols | 12 +++ .../reference/plainJSRedeclare2.types | 17 +++++ .../baselines/reference/plainJSRedeclare3.js | 10 +++ .../reference/plainJSRedeclare3.symbols | 12 +++ .../reference/plainJSRedeclare3.types | 17 +++++ .../plainJSReservedStrict.errors.txt | 17 +++++ .../reference/plainJSReservedStrict.js | 10 +++ .../reference/plainJSReservedStrict.symbols | 8 ++ .../reference/plainJSReservedStrict.types | 12 +++ .../reference/plainJSReservedWord.errors.txt | 75 +++++++++++++++++++ .../reference/plainJSReservedWord.js | 58 ++++++++++++++ .../reference/plainJSReservedWord.symbols | 62 +++++++++++++++ .../reference/plainJSReservedWord.types | 75 +++++++++++++++++++ .../conformance/salsa/plainJSRedeclare.ts | 6 ++ .../conformance/salsa/plainJSRedeclare2.ts | 7 ++ .../conformance/salsa/plainJSRedeclare3.ts | 7 ++ .../salsa/plainJSReservedStrict.ts | 7 ++ .../conformance/salsa/plainJSReservedWord.ts | 31 ++++++++ 32 files changed, 777 insertions(+), 9 deletions(-) create mode 100644 tests/baselines/reference/argumentsReferenceInConstructor4_Js.errors.txt create mode 100644 tests/baselines/reference/argumentsReferenceInMethod4_Js.errors.txt create mode 100644 tests/baselines/reference/plainJSModuleStrict.errors.txt create mode 100644 tests/baselines/reference/plainJSModuleStrict.js create mode 100644 tests/baselines/reference/plainJSModuleStrict.symbols create mode 100644 tests/baselines/reference/plainJSModuleStrict.types create mode 100644 tests/baselines/reference/plainJSRedeclare.errors.txt create mode 100644 tests/baselines/reference/plainJSRedeclare.js create mode 100644 tests/baselines/reference/plainJSRedeclare.symbols create mode 100644 tests/baselines/reference/plainJSRedeclare.types create mode 100644 tests/baselines/reference/plainJSRedeclare2.errors.txt create mode 100644 tests/baselines/reference/plainJSRedeclare2.js create mode 100644 tests/baselines/reference/plainJSRedeclare2.symbols create mode 100644 tests/baselines/reference/plainJSRedeclare2.types create mode 100644 tests/baselines/reference/plainJSRedeclare3.js create mode 100644 tests/baselines/reference/plainJSRedeclare3.symbols create mode 100644 tests/baselines/reference/plainJSRedeclare3.types create mode 100644 tests/baselines/reference/plainJSReservedStrict.errors.txt create mode 100644 tests/baselines/reference/plainJSReservedStrict.js create mode 100644 tests/baselines/reference/plainJSReservedStrict.symbols create mode 100644 tests/baselines/reference/plainJSReservedStrict.types create mode 100644 tests/baselines/reference/plainJSReservedWord.errors.txt create mode 100644 tests/baselines/reference/plainJSReservedWord.js create mode 100644 tests/baselines/reference/plainJSReservedWord.symbols create mode 100644 tests/baselines/reference/plainJSReservedWord.types create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare.ts create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare2.ts create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare3.ts create mode 100644 tests/cases/conformance/salsa/plainJSReservedStrict.ts create mode 100644 tests/cases/conformance/salsa/plainJSReservedWord.ts diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c29876ce619..e1a0cedd88d 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -818,6 +818,22 @@ namespace ts { } } + /** @internal */ + export const plainJSErrors: Set = new Set([ + Diagnostics.Cannot_redeclare_block_scoped_variable_0.code, + Diagnostics.A_module_cannot_have_multiple_default_exports.code, + Diagnostics.Another_export_default_is_here.code, + Diagnostics.The_first_export_default_is_here.code, + Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module.code, + Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode.code, + Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here.code, + Diagnostics.constructor_is_a_reserved_word.code, + Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode.code, + Diagnostics.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode.code, + Diagnostics.Invalid_use_of_0_Modules_are_automatically_in_strict_mode.code, + Diagnostics.Invalid_use_of_0_in_strict_mode.code, + ]); + /** * Determine if source file needs to be re-created even if its text hasn't changed */ @@ -2004,15 +2020,22 @@ namespace ts { Debug.assert(!!sourceFile.bindDiagnostics); - const isCheckJs = isCheckJsEnabledForFile(sourceFile, options); + const isCheckJs = !!isCheckJsEnabledForFile(sourceFile, options) && (sourceFile.scriptKind === ScriptKind.JS || sourceFile.scriptKind === ScriptKind.JSX); + const isPlainJs = !sourceFile.checkJsDirective && options.checkJs === undefined && (sourceFile.scriptKind === ScriptKind.JS || sourceFile.scriptKind === ScriptKind.JSX); const isTsNoCheck = !!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false; - // By default, only type-check .ts, .tsx, 'Deferred' and 'External' files (external files are added by plugins) - const includeBindAndCheckDiagnostics = !isTsNoCheck && (sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX - || sourceFile.scriptKind === ScriptKind.External || isCheckJs || sourceFile.scriptKind === ScriptKind.Deferred); - const bindDiagnostics: readonly Diagnostic[] = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray; - const checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray; - return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : undefined); + // By default, only type-check .ts, .tsx, 'Deferred' and 'External' files (external files are added by plugins) + const includeBindAndCheckDiagnostics = !isTsNoCheck && ( + sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX + || sourceFile.scriptKind === ScriptKind.External || isPlainJs || isCheckJs || sourceFile.scriptKind === ScriptKind.Deferred); + let bindDiagnostics: readonly Diagnostic[] = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray; + let checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray; + if (isPlainJs) { + bindDiagnostics = bindDiagnostics.filter(d => plainJSErrors.has(d.code)); + checkDiagnostics = checkDiagnostics.filter(d => plainJSErrors.has(d.code)); + } + + return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics && !isPlainJs, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : undefined); }); } diff --git a/tests/baselines/reference/argumentsReferenceInConstructor4_Js.errors.txt b/tests/baselines/reference/argumentsReferenceInConstructor4_Js.errors.txt new file mode 100644 index 00000000000..30d6092c3f9 --- /dev/null +++ b/tests/baselines/reference/argumentsReferenceInConstructor4_Js.errors.txt @@ -0,0 +1,46 @@ +/a.js(18,9): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. + + +==== /a.js (1 errors) ==== + class A { + /** + * Constructor + * + * @param {object} [foo={}] + */ + constructor(foo = {}) { + const key = "bar"; + + /** + * @type object + */ + this.foo = foo; + + /** + * @type object + */ + const arguments = this.arguments; + ~~~~~~~~~ +!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. + + /** + * @type object + */ + this.bar = arguments.bar; + + /** + * @type object + */ + this.baz = arguments[key]; + + /** + * @type object + */ + this.options = arguments; + } + + get arguments() { + return { bar: {} }; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/argumentsReferenceInMethod4_Js.errors.txt b/tests/baselines/reference/argumentsReferenceInMethod4_Js.errors.txt new file mode 100644 index 00000000000..8c90a67da17 --- /dev/null +++ b/tests/baselines/reference/argumentsReferenceInMethod4_Js.errors.txt @@ -0,0 +1,44 @@ +/a.js(16,9): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. + + +==== /a.js (1 errors) ==== + class A { + /** + * @param {object} [foo={}] + */ + m(foo = {}) { + const key = "bar"; + + /** + * @type object + */ + this.foo = foo; + + /** + * @type object + */ + const arguments = this.arguments; + ~~~~~~~~~ +!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. + + /** + * @type object + */ + this.bar = arguments.bar; + + /** + * @type object + */ + this.baz = arguments[key]; + + /** + * @type object + */ + this.options = arguments; + } + + get arguments() { + return { bar: {} }; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/jsdocTypedefNoCrash2.errors.txt b/tests/baselines/reference/jsdocTypedefNoCrash2.errors.txt index 9448bf84a2a..4545e41dc49 100644 --- a/tests/baselines/reference/jsdocTypedefNoCrash2.errors.txt +++ b/tests/baselines/reference/jsdocTypedefNoCrash2.errors.txt @@ -1,12 +1,18 @@ +tests/cases/compiler/export.js(1,13): error TS2451: Cannot redeclare block-scoped variable 'foo'. tests/cases/compiler/export.js(1,13): error TS8008: Type aliases can only be used in TypeScript files. +tests/cases/compiler/export.js(6,14): error TS2451: Cannot redeclare block-scoped variable 'foo'. -==== tests/cases/compiler/export.js (1 errors) ==== +==== tests/cases/compiler/export.js (3 errors) ==== export type foo = 5; ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'foo'. + ~~~ !!! error TS8008: Type aliases can only be used in TypeScript files. /** * @typedef {{ * }} */ - export const foo = 5; \ No newline at end of file + export const foo = 5; + ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'foo'. \ No newline at end of file diff --git a/tests/baselines/reference/plainJSModuleStrict.errors.txt b/tests/baselines/reference/plainJSModuleStrict.errors.txt new file mode 100644 index 00000000000..fa3b605f9ed --- /dev/null +++ b/tests/baselines/reference/plainJSModuleStrict.errors.txt @@ -0,0 +1,37 @@ +tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(1,1): error TS2528: A module cannot have multiple default exports. +tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(2,1): error TS2528: A module cannot have multiple default exports. +tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(3,7): error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module. +tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(4,7): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. +tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(6,11): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js(9,11): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. + + +==== tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js (6 errors) ==== + export default 12 + ~~~~~~~~~~~~~~~~~ +!!! error TS2528: A module cannot have multiple default exports. +!!! related TS2753 tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js:2:1: Another export default is here. + export default 13 + ~~~~~~~~~~~~~~~~~ +!!! error TS2528: A module cannot have multiple default exports. +!!! related TS2752 tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js:1:1: The first export default is here. + const await = 1 + ~~~~~ +!!! error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module. + const yield = 2 + ~~~~~ +!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. + async function f() { + const await = 3 + ~~~~~ +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } + function* g() { + const yield = 4 + ~~~~~ +!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. + } + class C { + #constructor = 1 + } + \ No newline at end of file diff --git a/tests/baselines/reference/plainJSModuleStrict.js b/tests/baselines/reference/plainJSModuleStrict.js new file mode 100644 index 00000000000..4a6d28c392d --- /dev/null +++ b/tests/baselines/reference/plainJSModuleStrict.js @@ -0,0 +1,30 @@ +//// [plainJSMultipleDefaultExport.js] +export default 12 +export default 13 +const await = 1 +const yield = 2 +async function f() { + const await = 3 +} +function* g() { + const yield = 4 +} +class C { + #constructor = 1 +} + + +//// [plainJSMultipleDefaultExport.js] +export default 12; +export default 13; +const await = 1; +const yield = 2; +async function f() { + const await = 3; +} +function* g() { + const yield = 4; +} +class C { + #constructor = 1; +} diff --git a/tests/baselines/reference/plainJSModuleStrict.symbols b/tests/baselines/reference/plainJSModuleStrict.symbols new file mode 100644 index 00000000000..2b572478c42 --- /dev/null +++ b/tests/baselines/reference/plainJSModuleStrict.symbols @@ -0,0 +1,28 @@ +=== tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js === +export default 12 +export default 13 +const await = 1 +>await : Symbol(await, Decl(plainJSMultipleDefaultExport.js, 2, 5)) + +const yield = 2 +>yield : Symbol(yield, Decl(plainJSMultipleDefaultExport.js, 3, 5)) + +async function f() { +>f : Symbol(f, Decl(plainJSMultipleDefaultExport.js, 3, 15)) + + const await = 3 +>await : Symbol(await, Decl(plainJSMultipleDefaultExport.js, 5, 9)) +} +function* g() { +>g : Symbol(g, Decl(plainJSMultipleDefaultExport.js, 6, 1)) + + const yield = 4 +>yield : Symbol(yield, Decl(plainJSMultipleDefaultExport.js, 8, 9)) +} +class C { +>C : Symbol(C, Decl(plainJSMultipleDefaultExport.js, 9, 1)) + + #constructor = 1 +>#constructor : Symbol(C.#constructor, Decl(plainJSMultipleDefaultExport.js, 10, 9)) +} + diff --git a/tests/baselines/reference/plainJSModuleStrict.types b/tests/baselines/reference/plainJSModuleStrict.types new file mode 100644 index 00000000000..51d45840d0f --- /dev/null +++ b/tests/baselines/reference/plainJSModuleStrict.types @@ -0,0 +1,33 @@ +=== tests/cases/conformance/salsa/plainJSMultipleDefaultExport.js === +export default 12 +export default 13 +const await = 1 +>await : 1 +>1 : 1 + +const yield = 2 +>yield : 2 +>2 : 2 + +async function f() { +>f : () => Promise + + const await = 3 +>await : 3 +>3 : 3 +} +function* g() { +>g : () => Generator + + const yield = 4 +>yield : 4 +>4 : 4 +} +class C { +>C : C + + #constructor = 1 +>#constructor : number +>1 : 1 +} + diff --git a/tests/baselines/reference/plainJSRedeclare.errors.txt b/tests/baselines/reference/plainJSRedeclare.errors.txt new file mode 100644 index 00000000000..c47a3f90d0b --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/salsa/plainJSRedeclare.js(1,7): error TS2451: Cannot redeclare block-scoped variable 'orbitol'. +tests/cases/conformance/salsa/plainJSRedeclare.js(2,5): error TS2451: Cannot redeclare block-scoped variable 'orbitol'. + + +==== tests/cases/conformance/salsa/plainJSRedeclare.js (2 errors) ==== + const orbitol = 1 + ~~~~~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'. + var orbitol = 1 + false + ~~~~~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'. + orbitol.toExponential() + \ No newline at end of file diff --git a/tests/baselines/reference/plainJSRedeclare.js b/tests/baselines/reference/plainJSRedeclare.js new file mode 100644 index 00000000000..32b3249fe67 --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare.js @@ -0,0 +1,10 @@ +//// [plainJSRedeclare.js] +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() + + +//// [plainJSRedeclare.js] +var orbitol = 1; +var orbitol = 1 + false; +orbitol.toExponential(); diff --git a/tests/baselines/reference/plainJSRedeclare.symbols b/tests/baselines/reference/plainJSRedeclare.symbols new file mode 100644 index 00000000000..5214b68b4fe --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/salsa/plainJSRedeclare.js === +const orbitol = 1 +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5)) + +var orbitol = 1 + false +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 1, 3)) + +orbitol.toExponential() +>orbitol.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --)) +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5)) +>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/plainJSRedeclare.types b/tests/baselines/reference/plainJSRedeclare.types new file mode 100644 index 00000000000..0962bb3221f --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare.types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/salsa/plainJSRedeclare.js === +const orbitol = 1 +>orbitol : 1 +>1 : 1 + +var orbitol = 1 + false +>orbitol : any +>1 + false : any +>1 : 1 +>false : false + +orbitol.toExponential() +>orbitol.toExponential() : string +>orbitol.toExponential : (fractionDigits?: number) => string +>orbitol : 1 +>toExponential : (fractionDigits?: number) => string + diff --git a/tests/baselines/reference/plainJSRedeclare2.errors.txt b/tests/baselines/reference/plainJSRedeclare2.errors.txt new file mode 100644 index 00000000000..ca4ef82bbc7 --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare2.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/salsa/plainJSRedeclare.js(1,7): error TS2451: Cannot redeclare block-scoped variable 'orbitol'. +tests/cases/conformance/salsa/plainJSRedeclare.js(2,5): error TS2451: Cannot redeclare block-scoped variable 'orbitol'. +tests/cases/conformance/salsa/plainJSRedeclare.js(2,15): error TS2365: Operator '+' cannot be applied to types 'number' and 'boolean'. + + +==== tests/cases/conformance/salsa/plainJSRedeclare.js (3 errors) ==== + const orbitol = 1 + ~~~~~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'. + var orbitol = 1 + false + ~~~~~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'orbitol'. + ~~~~~~~~~ +!!! error TS2365: Operator '+' cannot be applied to types 'number' and 'boolean'. + orbitol.toExponential() + \ No newline at end of file diff --git a/tests/baselines/reference/plainJSRedeclare2.js b/tests/baselines/reference/plainJSRedeclare2.js new file mode 100644 index 00000000000..32b3249fe67 --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare2.js @@ -0,0 +1,10 @@ +//// [plainJSRedeclare.js] +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() + + +//// [plainJSRedeclare.js] +var orbitol = 1; +var orbitol = 1 + false; +orbitol.toExponential(); diff --git a/tests/baselines/reference/plainJSRedeclare2.symbols b/tests/baselines/reference/plainJSRedeclare2.symbols new file mode 100644 index 00000000000..5214b68b4fe --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare2.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/salsa/plainJSRedeclare.js === +const orbitol = 1 +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5)) + +var orbitol = 1 + false +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 1, 3)) + +orbitol.toExponential() +>orbitol.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --)) +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5)) +>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/plainJSRedeclare2.types b/tests/baselines/reference/plainJSRedeclare2.types new file mode 100644 index 00000000000..0962bb3221f --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare2.types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/salsa/plainJSRedeclare.js === +const orbitol = 1 +>orbitol : 1 +>1 : 1 + +var orbitol = 1 + false +>orbitol : any +>1 + false : any +>1 : 1 +>false : false + +orbitol.toExponential() +>orbitol.toExponential() : string +>orbitol.toExponential : (fractionDigits?: number) => string +>orbitol : 1 +>toExponential : (fractionDigits?: number) => string + diff --git a/tests/baselines/reference/plainJSRedeclare3.js b/tests/baselines/reference/plainJSRedeclare3.js new file mode 100644 index 00000000000..32b3249fe67 --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare3.js @@ -0,0 +1,10 @@ +//// [plainJSRedeclare.js] +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() + + +//// [plainJSRedeclare.js] +var orbitol = 1; +var orbitol = 1 + false; +orbitol.toExponential(); diff --git a/tests/baselines/reference/plainJSRedeclare3.symbols b/tests/baselines/reference/plainJSRedeclare3.symbols new file mode 100644 index 00000000000..5214b68b4fe --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare3.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/salsa/plainJSRedeclare.js === +const orbitol = 1 +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5)) + +var orbitol = 1 + false +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 1, 3)) + +orbitol.toExponential() +>orbitol.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --)) +>orbitol : Symbol(orbitol, Decl(plainJSRedeclare.js, 0, 5)) +>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/plainJSRedeclare3.types b/tests/baselines/reference/plainJSRedeclare3.types new file mode 100644 index 00000000000..0962bb3221f --- /dev/null +++ b/tests/baselines/reference/plainJSRedeclare3.types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/salsa/plainJSRedeclare.js === +const orbitol = 1 +>orbitol : 1 +>1 : 1 + +var orbitol = 1 + false +>orbitol : any +>1 + false : any +>1 : 1 +>false : false + +orbitol.toExponential() +>orbitol.toExponential() : string +>orbitol.toExponential : (fractionDigits?: number) => string +>orbitol : 1 +>toExponential : (fractionDigits?: number) => string + diff --git a/tests/baselines/reference/plainJSReservedStrict.errors.txt b/tests/baselines/reference/plainJSReservedStrict.errors.txt new file mode 100644 index 00000000000..a040fce591c --- /dev/null +++ b/tests/baselines/reference/plainJSReservedStrict.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/salsa/plainJSReservedStrict.js(2,7): error TS1100: Invalid use of 'eval' in strict mode. +tests/cases/conformance/salsa/plainJSReservedStrict.js(2,7): error TS2451: Cannot redeclare block-scoped variable 'eval'. +tests/cases/conformance/salsa/plainJSReservedStrict.js(3,7): error TS1100: Invalid use of 'arguments' in strict mode. + + +==== tests/cases/conformance/salsa/plainJSReservedStrict.js (3 errors) ==== + "use strict" + const eval = 1 + ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + ~~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'eval'. +!!! related TS6203 /.ts/lib.es5.d.ts:32:18: 'eval' was also declared here. + const arguments = 2 + ~~~~~~~~~ +!!! error TS1100: Invalid use of 'arguments' in strict mode. + \ No newline at end of file diff --git a/tests/baselines/reference/plainJSReservedStrict.js b/tests/baselines/reference/plainJSReservedStrict.js new file mode 100644 index 00000000000..9f35d353afc --- /dev/null +++ b/tests/baselines/reference/plainJSReservedStrict.js @@ -0,0 +1,10 @@ +//// [plainJSReservedStrict.js] +"use strict" +const eval = 1 +const arguments = 2 + + +//// [plainJSReservedStrict.js] +"use strict"; +const eval = 1; +const arguments = 2; diff --git a/tests/baselines/reference/plainJSReservedStrict.symbols b/tests/baselines/reference/plainJSReservedStrict.symbols new file mode 100644 index 00000000000..e89d1216579 --- /dev/null +++ b/tests/baselines/reference/plainJSReservedStrict.symbols @@ -0,0 +1,8 @@ +=== tests/cases/conformance/salsa/plainJSReservedStrict.js === +"use strict" +const eval = 1 +>eval : Symbol(eval, Decl(plainJSReservedStrict.js, 1, 5)) + +const arguments = 2 +>arguments : Symbol(arguments, Decl(plainJSReservedStrict.js, 2, 5)) + diff --git a/tests/baselines/reference/plainJSReservedStrict.types b/tests/baselines/reference/plainJSReservedStrict.types new file mode 100644 index 00000000000..f4462e1cdab --- /dev/null +++ b/tests/baselines/reference/plainJSReservedStrict.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/salsa/plainJSReservedStrict.js === +"use strict" +>"use strict" : "use strict" + +const eval = 1 +>eval : 1 +>1 : 1 + +const arguments = 2 +>arguments : 2 +>2 : 2 + diff --git a/tests/baselines/reference/plainJSReservedWord.errors.txt b/tests/baselines/reference/plainJSReservedWord.errors.txt new file mode 100644 index 00000000000..3b0e9ac5ef4 --- /dev/null +++ b/tests/baselines/reference/plainJSReservedWord.errors.txt @@ -0,0 +1,75 @@ +tests/cases/conformance/salsa/plainJSReservedWord.js(1,1): error TS2528: A module cannot have multiple default exports. +tests/cases/conformance/salsa/plainJSReservedWord.js(2,1): error TS2528: A module cannot have multiple default exports. +tests/cases/conformance/salsa/plainJSReservedWord.js(3,7): error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module. +tests/cases/conformance/salsa/plainJSReservedWord.js(4,7): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(6,11): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/salsa/plainJSReservedWord.js(9,11): error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(12,5): error TS18012: '#constructor' is a reserved word. +tests/cases/conformance/salsa/plainJSReservedWord.js(15,20): error TS1102: 'delete' cannot be called on an identifier in strict mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(18,16): error TS1102: 'delete' cannot be called on an identifier in strict mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(19,16): error TS1102: 'delete' cannot be called on an identifier in strict mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(22,15): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'eval'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(23,15): error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(26,7): error TS1215: Invalid use of 'eval'. Modules are automatically in strict mode. +tests/cases/conformance/salsa/plainJSReservedWord.js(27,7): error TS1215: Invalid use of 'arguments'. Modules are automatically in strict mode. + + +==== tests/cases/conformance/salsa/plainJSReservedWord.js (14 errors) ==== + export default 12 + ~~~~~~~~~~~~~~~~~ +!!! error TS2528: A module cannot have multiple default exports. +!!! related TS2753 tests/cases/conformance/salsa/plainJSReservedWord.js:2:1: Another export default is here. + export default 13 + ~~~~~~~~~~~~~~~~~ +!!! error TS2528: A module cannot have multiple default exports. +!!! related TS2752 tests/cases/conformance/salsa/plainJSReservedWord.js:1:1: The first export default is here. + const await = 1 + ~~~~~ +!!! error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module. + const yield = 2 + ~~~~~ +!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. + async function f() { + const await = 3 + ~~~~~ +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } + function* g() { + const yield = 4 + ~~~~~ +!!! error TS1214: Identifier expected. 'yield' is a reserved word in strict mode. Modules are automatically in strict mode. + } + class C { + #constructor = 5 + ~~~~~~~~~~~~ +!!! error TS18012: '#constructor' is a reserved word. + deleted() { + function container(f) { + delete f + ~ +!!! error TS1102: 'delete' cannot be called on an identifier in strict mode. + } + var g = 6 + delete g + ~ +!!! error TS1102: 'delete' cannot be called on an identifier in strict mode. + delete container + ~~~~~~~~~ +!!! error TS1102: 'delete' cannot be called on an identifier in strict mode. + } + evalArguments() { + const eval = 7 + ~~~~ +!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'eval'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. + const arguments = 8 + ~~~~~~~~~ +!!! error TS1210: Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of 'arguments'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode. + } + } + const eval = 9 + ~~~~ +!!! error TS1215: Invalid use of 'eval'. Modules are automatically in strict mode. + const arguments = 10 + ~~~~~~~~~ +!!! error TS1215: Invalid use of 'arguments'. Modules are automatically in strict mode. + \ No newline at end of file diff --git a/tests/baselines/reference/plainJSReservedWord.js b/tests/baselines/reference/plainJSReservedWord.js new file mode 100644 index 00000000000..a412fad4bc7 --- /dev/null +++ b/tests/baselines/reference/plainJSReservedWord.js @@ -0,0 +1,58 @@ +//// [plainJSReservedWord.js] +export default 12 +export default 13 +const await = 1 +const yield = 2 +async function f() { + const await = 3 +} +function* g() { + const yield = 4 +} +class C { + #constructor = 5 + deleted() { + function container(f) { + delete f + } + var g = 6 + delete g + delete container + } + evalArguments() { + const eval = 7 + const arguments = 8 + } +} +const eval = 9 +const arguments = 10 + + +//// [plainJSReservedWord.js] +export default 12; +export default 13; +const await = 1; +const yield = 2; +async function f() { + const await = 3; +} +function* g() { + const yield = 4; +} +class C { + #constructor = 5; + deleted() { + function container(f) { + delete f; + } + var g = 6; + delete g; + delete container; + } + evalArguments() { + const eval = 7; + const arguments = 8; + } +} +const eval = 9; +const arguments = 10; diff --git a/tests/baselines/reference/plainJSReservedWord.symbols b/tests/baselines/reference/plainJSReservedWord.symbols new file mode 100644 index 00000000000..64e9c9eed79 --- /dev/null +++ b/tests/baselines/reference/plainJSReservedWord.symbols @@ -0,0 +1,62 @@ +=== tests/cases/conformance/salsa/plainJSReservedWord.js === +export default 12 +export default 13 +const await = 1 +>await : Symbol(await, Decl(plainJSReservedWord.js, 2, 5)) + +const yield = 2 +>yield : Symbol(yield, Decl(plainJSReservedWord.js, 3, 5)) + +async function f() { +>f : Symbol(f, Decl(plainJSReservedWord.js, 3, 15)) + + const await = 3 +>await : Symbol(await, Decl(plainJSReservedWord.js, 5, 9)) +} +function* g() { +>g : Symbol(g, Decl(plainJSReservedWord.js, 6, 1)) + + const yield = 4 +>yield : Symbol(yield, Decl(plainJSReservedWord.js, 8, 9)) +} +class C { +>C : Symbol(C, Decl(plainJSReservedWord.js, 9, 1)) + + #constructor = 5 +>#constructor : Symbol(C.#constructor, Decl(plainJSReservedWord.js, 10, 9)) + + deleted() { +>deleted : Symbol(C.deleted, Decl(plainJSReservedWord.js, 11, 20)) + + function container(f) { +>container : Symbol(container, Decl(plainJSReservedWord.js, 12, 15)) +>f : Symbol(f, Decl(plainJSReservedWord.js, 13, 27)) + + delete f +>f : Symbol(f, Decl(plainJSReservedWord.js, 13, 27)) + } + var g = 6 +>g : Symbol(g, Decl(plainJSReservedWord.js, 16, 11)) + + delete g +>g : Symbol(g, Decl(plainJSReservedWord.js, 16, 11)) + + delete container +>container : Symbol(container, Decl(plainJSReservedWord.js, 12, 15)) + } + evalArguments() { +>evalArguments : Symbol(C.evalArguments, Decl(plainJSReservedWord.js, 19, 5)) + + const eval = 7 +>eval : Symbol(eval, Decl(plainJSReservedWord.js, 21, 13)) + + const arguments = 8 +>arguments : Symbol(arguments, Decl(plainJSReservedWord.js, 22, 13)) + } +} +const eval = 9 +>eval : Symbol(eval, Decl(plainJSReservedWord.js, 25, 5)) + +const arguments = 10 +>arguments : Symbol(arguments, Decl(plainJSReservedWord.js, 26, 5)) + diff --git a/tests/baselines/reference/plainJSReservedWord.types b/tests/baselines/reference/plainJSReservedWord.types new file mode 100644 index 00000000000..9b8c76a2dab --- /dev/null +++ b/tests/baselines/reference/plainJSReservedWord.types @@ -0,0 +1,75 @@ +=== tests/cases/conformance/salsa/plainJSReservedWord.js === +export default 12 +export default 13 +const await = 1 +>await : 1 +>1 : 1 + +const yield = 2 +>yield : 2 +>2 : 2 + +async function f() { +>f : () => Promise + + const await = 3 +>await : 3 +>3 : 3 +} +function* g() { +>g : () => Generator + + const yield = 4 +>yield : 4 +>4 : 4 +} +class C { +>C : C + + #constructor = 5 +>#constructor : number +>5 : 5 + + deleted() { +>deleted : () => void + + function container(f) { +>container : (f: any) => void +>f : any + + delete f +>delete f : boolean +>f : any + } + var g = 6 +>g : number +>6 : 6 + + delete g +>delete g : boolean +>g : number + + delete container +>delete container : boolean +>container : (f: any) => void + } + evalArguments() { +>evalArguments : () => void + + const eval = 7 +>eval : 7 +>7 : 7 + + const arguments = 8 +>arguments : 8 +>8 : 8 + } +} +const eval = 9 +>eval : 9 +>9 : 9 + +const arguments = 10 +>arguments : 10 +>10 : 10 + diff --git a/tests/cases/conformance/salsa/plainJSRedeclare.ts b/tests/cases/conformance/salsa/plainJSRedeclare.ts new file mode 100644 index 00000000000..be6831d0cdf --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSRedeclare.ts @@ -0,0 +1,6 @@ +// @outdir: out/ +// @allowJS: true +// @filename: plainJSRedeclare.js +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() diff --git a/tests/cases/conformance/salsa/plainJSRedeclare2.ts b/tests/cases/conformance/salsa/plainJSRedeclare2.ts new file mode 100644 index 00000000000..7409b6c8fe0 --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSRedeclare2.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @allowJS: true +// @checkJS: true +// @filename: plainJSRedeclare.js +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() diff --git a/tests/cases/conformance/salsa/plainJSRedeclare3.ts b/tests/cases/conformance/salsa/plainJSRedeclare3.ts new file mode 100644 index 00000000000..1327fcfc177 --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSRedeclare3.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @allowJS: true +// @checkJS: false +// @filename: plainJSRedeclare.js +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() diff --git a/tests/cases/conformance/salsa/plainJSReservedStrict.ts b/tests/cases/conformance/salsa/plainJSReservedStrict.ts new file mode 100644 index 00000000000..fbd654927d1 --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSReservedStrict.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @target: esnext +// @allowJS: true +// @filename: plainJSReservedStrict.js +"use strict" +const eval = 1 +const arguments = 2 diff --git a/tests/cases/conformance/salsa/plainJSReservedWord.ts b/tests/cases/conformance/salsa/plainJSReservedWord.ts new file mode 100644 index 00000000000..7eaaa6af97f --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSReservedWord.ts @@ -0,0 +1,31 @@ +// @outdir: out/ +// @target: esnext +// @allowJS: true +// @filename: plainJSReservedWord.js +export default 12 +export default 13 +const await = 1 +const yield = 2 +async function f() { + const await = 3 +} +function* g() { + const yield = 4 +} +class C { + #constructor = 5 + deleted() { + function container(f) { + delete f + } + var g = 6 + delete g + delete container + } + evalArguments() { + const eval = 7 + const arguments = 8 + } +} +const eval = 9 +const arguments = 10