diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c29876ce619f5..0b577f586e8a8 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -818,6 +818,25 @@ 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, + Diagnostics.A_label_is_not_allowed_here.code, + Diagnostics.Octal_literals_are_not_allowed_in_strict_mode.code, + Diagnostics.with_statements_are_not_allowed_in_strict_mode.code, + ]); + /** * Determine if source file needs to be re-created even if its text hasn't changed */ @@ -2004,15 +2023,24 @@ namespace ts { Debug.assert(!!sourceFile.bindDiagnostics); - const isCheckJs = isCheckJsEnabledForFile(sourceFile, options); + const isJs = sourceFile.scriptKind === ScriptKind.JS || sourceFile.scriptKind === ScriptKind.JSX; + const isCheckJs = isJs && isCheckJsEnabledForFile(sourceFile, options); + const isPlainJs = isJs && !sourceFile.checkJsDirective && options.checkJs === undefined; 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, plain JS, checked JS and External + // - plain JS: .js files with no // ts-check and checkJs: undefined + // - check JS: .js files with either // ts-check or checkJs: true + // - external: files that 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; + const checkDiagnostics = includeBindAndCheckDiagnostics && !isPlainJs ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray; + if (isPlainJs) { + bindDiagnostics = filter(bindDiagnostics, d => plainJSErrors.has(d.code)); + } + // skip ts-expect-error errors in plain JS files, and skip JSDoc errors except in checked JS + 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 0000000000000..30d6092c3f9a4 --- /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 0000000000000..8c90a67da1700 --- /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 9448bf84a2a32..4545e41dc4991 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/plainJSBinderErrors.errors.txt b/tests/baselines/reference/plainJSBinderErrors.errors.txt new file mode 100644 index 0000000000000..72aaa17b1e892 --- /dev/null +++ b/tests/baselines/reference/plainJSBinderErrors.errors.txt @@ -0,0 +1,97 @@ +tests/cases/conformance/salsa/plainJSBinderErrors.js(1,1): error TS2528: A module cannot have multiple default exports. +tests/cases/conformance/salsa/plainJSBinderErrors.js(2,1): error TS2528: A module cannot have multiple default exports. +tests/cases/conformance/salsa/plainJSBinderErrors.js(3,7): error TS1262: Identifier expected. 'await' is a reserved word at the top-level of a module. +tests/cases/conformance/salsa/plainJSBinderErrors.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/plainJSBinderErrors.js(6,11): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/salsa/plainJSBinderErrors.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/plainJSBinderErrors.js(12,5): error TS18012: '#constructor' is a reserved word. +tests/cases/conformance/salsa/plainJSBinderErrors.js(15,20): error TS1102: 'delete' cannot be called on an identifier in strict mode. +tests/cases/conformance/salsa/plainJSBinderErrors.js(18,16): error TS1102: 'delete' cannot be called on an identifier in strict mode. +tests/cases/conformance/salsa/plainJSBinderErrors.js(19,16): error TS1102: 'delete' cannot be called on an identifier in strict mode. +tests/cases/conformance/salsa/plainJSBinderErrors.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/plainJSBinderErrors.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/plainJSBinderErrors.js(26,27): error TS1121: Octal literals are not allowed in strict mode. +tests/cases/conformance/salsa/plainJSBinderErrors.js(27,9): error TS1101: 'with' statements are not allowed in strict mode. +tests/cases/conformance/salsa/plainJSBinderErrors.js(33,13): error TS1344: 'A label is not allowed here. +tests/cases/conformance/salsa/plainJSBinderErrors.js(39,7): error TS1215: Invalid use of 'eval'. Modules are automatically in strict mode. +tests/cases/conformance/salsa/plainJSBinderErrors.js(40,7): error TS1215: Invalid use of 'arguments'. Modules are automatically in strict mode. + + +==== tests/cases/conformance/salsa/plainJSBinderErrors.js (17 errors) ==== + export default 12 + ~~~~~~~~~~~~~~~~~ +!!! error TS2528: A module cannot have multiple default exports. +!!! related TS2753 tests/cases/conformance/salsa/plainJSBinderErrors.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/plainJSBinderErrors.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. + } + withOctal() { + const redundant = 010 + ~~~ +!!! error TS1121: Octal literals are not allowed in strict mode. + with (redundant) { + ~~~~ +!!! error TS1101: 'with' statements are not allowed in strict mode. + return toFixed() + } + } + label() { + for(;;) { + label: var x = 1 + ~~~~~ +!!! error TS1344: 'A label is not allowed here. + break label + } + return x + } + } + 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/plainJSBinderErrors.js b/tests/baselines/reference/plainJSBinderErrors.js new file mode 100644 index 0000000000000..5f8f3138a64c5 --- /dev/null +++ b/tests/baselines/reference/plainJSBinderErrors.js @@ -0,0 +1,84 @@ +//// [plainJSBinderErrors.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 + } + withOctal() { + const redundant = 010 + with (redundant) { + return toFixed() + } + } + label() { + for(;;) { + label: var x = 1 + break label + } + return x + } +} +const eval = 9 +const arguments = 10 + + +//// [plainJSBinderErrors.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; + } + withOctal() { + const redundant = 010; + with (redundant) { + return toFixed(); + } + } + label() { + for (;;) { + label: var x = 1; + break label; + } + return x; + } +} +const eval = 9; +const arguments = 10; diff --git a/tests/baselines/reference/plainJSBinderErrors.symbols b/tests/baselines/reference/plainJSBinderErrors.symbols new file mode 100644 index 0000000000000..55b2866141718 --- /dev/null +++ b/tests/baselines/reference/plainJSBinderErrors.symbols @@ -0,0 +1,86 @@ +=== tests/cases/conformance/salsa/plainJSBinderErrors.js === +export default 12 +export default 13 +const await = 1 +>await : Symbol(await, Decl(plainJSBinderErrors.js, 2, 5)) + +const yield = 2 +>yield : Symbol(yield, Decl(plainJSBinderErrors.js, 3, 5)) + +async function f() { +>f : Symbol(f, Decl(plainJSBinderErrors.js, 3, 15)) + + const await = 3 +>await : Symbol(await, Decl(plainJSBinderErrors.js, 5, 9)) +} +function* g() { +>g : Symbol(g, Decl(plainJSBinderErrors.js, 6, 1)) + + const yield = 4 +>yield : Symbol(yield, Decl(plainJSBinderErrors.js, 8, 9)) +} +class C { +>C : Symbol(C, Decl(plainJSBinderErrors.js, 9, 1)) + + #constructor = 5 +>#constructor : Symbol(C.#constructor, Decl(plainJSBinderErrors.js, 10, 9)) + + deleted() { +>deleted : Symbol(C.deleted, Decl(plainJSBinderErrors.js, 11, 20)) + + function container(f) { +>container : Symbol(container, Decl(plainJSBinderErrors.js, 12, 15)) +>f : Symbol(f, Decl(plainJSBinderErrors.js, 13, 27)) + + delete f +>f : Symbol(f, Decl(plainJSBinderErrors.js, 13, 27)) + } + var g = 6 +>g : Symbol(g, Decl(plainJSBinderErrors.js, 16, 11)) + + delete g +>g : Symbol(g, Decl(plainJSBinderErrors.js, 16, 11)) + + delete container +>container : Symbol(container, Decl(plainJSBinderErrors.js, 12, 15)) + } + evalArguments() { +>evalArguments : Symbol(C.evalArguments, Decl(plainJSBinderErrors.js, 19, 5)) + + const eval = 7 +>eval : Symbol(eval, Decl(plainJSBinderErrors.js, 21, 13)) + + const arguments = 8 +>arguments : Symbol(arguments, Decl(plainJSBinderErrors.js, 22, 13)) + } + withOctal() { +>withOctal : Symbol(C.withOctal, Decl(plainJSBinderErrors.js, 23, 5)) + + const redundant = 010 +>redundant : Symbol(redundant, Decl(plainJSBinderErrors.js, 25, 13)) + + with (redundant) { +>redundant : Symbol(redundant, Decl(plainJSBinderErrors.js, 25, 13)) + + return toFixed() + } + } + label() { +>label : Symbol(C.label, Decl(plainJSBinderErrors.js, 29, 5)) + + for(;;) { + label: var x = 1 +>x : Symbol(x, Decl(plainJSBinderErrors.js, 32, 22)) + + break label + } + return x +>x : Symbol(x, Decl(plainJSBinderErrors.js, 32, 22)) + } +} +const eval = 9 +>eval : Symbol(eval, Decl(plainJSBinderErrors.js, 38, 5)) + +const arguments = 10 +>arguments : Symbol(arguments, Decl(plainJSBinderErrors.js, 39, 5)) + diff --git a/tests/baselines/reference/plainJSBinderErrors.types b/tests/baselines/reference/plainJSBinderErrors.types new file mode 100644 index 0000000000000..29c4be2c11a20 --- /dev/null +++ b/tests/baselines/reference/plainJSBinderErrors.types @@ -0,0 +1,105 @@ +=== tests/cases/conformance/salsa/plainJSBinderErrors.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 + } + withOctal() { +>withOctal : () => any + + const redundant = 010 +>redundant : 10 +>010 : 10 + + with (redundant) { +>redundant : 10 + + return toFixed() +>toFixed() : any +>toFixed : any + } + } + label() { +>label : () => number + + for(;;) { + label: var x = 1 +>label : any +>x : number +>1 : 1 + + break label +>label : any + } + return x +>x : number + } +} +const eval = 9 +>eval : 9 +>9 : 9 + +const arguments = 10 +>arguments : 10 +>10 : 10 + diff --git a/tests/baselines/reference/plainJSModuleStrict.errors.txt b/tests/baselines/reference/plainJSModuleStrict.errors.txt new file mode 100644 index 0000000000000..fa3b605f9ed12 --- /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 0000000000000..4a6d28c392d6d --- /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 0000000000000..2b572478c42aa --- /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 0000000000000..51d45840d0fd5 --- /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 0000000000000..c47a3f90d0b29 --- /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 0000000000000..32b3249fe6773 --- /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 0000000000000..5214b68b4fefd --- /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 0000000000000..0962bb3221fd7 --- /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 0000000000000..ca4ef82bbc756 --- /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 0000000000000..32b3249fe6773 --- /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 0000000000000..5214b68b4fefd --- /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 0000000000000..0962bb3221fd7 --- /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 0000000000000..32b3249fe6773 --- /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 0000000000000..5214b68b4fefd --- /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 0000000000000..0962bb3221fd7 --- /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 0000000000000..db4714a10c194 --- /dev/null +++ b/tests/baselines/reference/plainJSReservedStrict.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/salsa/plainJSReservedStrict.js(2,7): error TS1100: Invalid use of 'eval' in strict mode. +tests/cases/conformance/salsa/plainJSReservedStrict.js(3,7): error TS1100: Invalid use of 'arguments' in strict mode. + + +==== tests/cases/conformance/salsa/plainJSReservedStrict.js (2 errors) ==== + "use strict" + const eval = 1 + ~~~~ +!!! error TS1100: Invalid use of 'eval' in strict mode. + 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 0000000000000..9f35d353afc6a --- /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 0000000000000..e89d121657979 --- /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 0000000000000..f4462e1cdab91 --- /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/cases/conformance/salsa/plainJSBinderErrors.ts b/tests/cases/conformance/salsa/plainJSBinderErrors.ts new file mode 100644 index 0000000000000..d2019e3f78b2f --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSBinderErrors.ts @@ -0,0 +1,44 @@ +// @outdir: out/ +// @target: esnext +// @allowJS: true +// @filename: plainJSBinderErrors.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 + } + withOctal() { + const redundant = 010 + with (redundant) { + return toFixed() + } + } + label() { + for(;;) { + label: var x = 1 + break label + } + return x + } +} +const eval = 9 +const arguments = 10 diff --git a/tests/cases/conformance/salsa/plainJSRedeclare.ts b/tests/cases/conformance/salsa/plainJSRedeclare.ts new file mode 100644 index 0000000000000..be6831d0cdf12 --- /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 0000000000000..7409b6c8fe071 --- /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 0000000000000..1327fcfc1777c --- /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 0000000000000..fbd654927d1ea --- /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