diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fb1f62ddaf5..b138ce9ea70 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -24153,6 +24153,16 @@ namespace ts { } } + /** + * The name cannot be used as 'Object' of user defined types with special target. + */ + function checkClassNameCollisionWithObject(name: Identifier): void { + if (languageVersion === ScriptTarget.ES5 && name.escapedText === "Object" + && moduleKind !== ModuleKind.ES2015 && moduleKind !== ModuleKind.ESNext) { + error(name, Diagnostics.Class_name_cannot_be_Object_when_targeting_ES5_with_module_0, ModuleKind[moduleKind]); // https://github.com/Microsoft/TypeScript/issues/17494 + } + } + /** * Check each type parameter and check that type parameters have no duplicate type parameter declarations */ @@ -24279,8 +24289,10 @@ namespace ts { checkTypeNameIsReserved(node.name, Diagnostics.Class_name_cannot_be_0); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); + checkClassNameCollisionWithObject(node.name); } checkTypeParameters(getEffectiveTypeParameterDeclarations(node)); + checkTypeParameters(node.typeParameters); checkExportsOnMergedDeclarations(node); const symbol = getSymbolOfNode(node); const type = getDeclaredTypeOfSymbol(symbol); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index be96d3de07d..f0bb5e5ed7d 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2357,6 +2357,11 @@ "category": "Error", "code": 2724 }, + "Class name cannot be 'Object' when targeting ES5 with module {0}.": { + "category": "Error", + "code": 2725 + }, + "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", "code": 4000 diff --git a/tests/baselines/reference/es6modulekindExportClassNameWithObject.js b/tests/baselines/reference/es6modulekindExportClassNameWithObject.js new file mode 100644 index 00000000000..d5af2ffafa0 --- /dev/null +++ b/tests/baselines/reference/es6modulekindExportClassNameWithObject.js @@ -0,0 +1,11 @@ +//// [es6modulekindExportClassNameWithObject.ts] +export class Object {} + + +//// [es6modulekindExportClassNameWithObject.js] +var Object = /** @class */ (function () { + function Object() { + } + return Object; +}()); +export { Object }; diff --git a/tests/baselines/reference/es6modulekindExportClassNameWithObject.symbols b/tests/baselines/reference/es6modulekindExportClassNameWithObject.symbols new file mode 100644 index 00000000000..b05183ae935 --- /dev/null +++ b/tests/baselines/reference/es6modulekindExportClassNameWithObject.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/es6/es6modulekindExportClassNameWithObject.ts === +export class Object {} +>Object : Symbol(Object, Decl(es6modulekindExportClassNameWithObject.ts, 0, 0)) + diff --git a/tests/baselines/reference/es6modulekindExportClassNameWithObject.types b/tests/baselines/reference/es6modulekindExportClassNameWithObject.types new file mode 100644 index 00000000000..b0b9cd7f6a6 --- /dev/null +++ b/tests/baselines/reference/es6modulekindExportClassNameWithObject.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/es6/es6modulekindExportClassNameWithObject.ts === +export class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.js b/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.js new file mode 100644 index 00000000000..e56b6ad8f16 --- /dev/null +++ b/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.js @@ -0,0 +1,11 @@ +//// [exnextmodulekindExportClassNameWithObject.ts] +export class Object {} + + +//// [exnextmodulekindExportClassNameWithObject.js] +var Object = /** @class */ (function () { + function Object() { + } + return Object; +}()); +export { Object }; diff --git a/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.symbols b/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.symbols new file mode 100644 index 00000000000..2bc0455e162 --- /dev/null +++ b/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/esnext/exnextmodulekindExportClassNameWithObject.ts === +export class Object {} +>Object : Symbol(Object, Decl(exnextmodulekindExportClassNameWithObject.ts, 0, 0)) + diff --git a/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.types b/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.types new file mode 100644 index 00000000000..1fbe924a4a0 --- /dev/null +++ b/tests/baselines/reference/exnextmodulekindExportClassNameWithObject.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/esnext/exnextmodulekindExportClassNameWithObject.ts === +export class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exportAmbientClassNameWithObject.js b/tests/baselines/reference/exportAmbientClassNameWithObject.js new file mode 100644 index 00000000000..fdad4c7818c --- /dev/null +++ b/tests/baselines/reference/exportAmbientClassNameWithObject.js @@ -0,0 +1,7 @@ +//// [exportAmbientClassNameWithObject.ts] +export declare class Object {} + + +//// [exportAmbientClassNameWithObject.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/tests/baselines/reference/exportAmbientClassNameWithObject.symbols b/tests/baselines/reference/exportAmbientClassNameWithObject.symbols new file mode 100644 index 00000000000..6287c91780a --- /dev/null +++ b/tests/baselines/reference/exportAmbientClassNameWithObject.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportAmbientClassNameWithObject.ts === +export declare class Object {} +>Object : Symbol(Object, Decl(exportAmbientClassNameWithObject.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportAmbientClassNameWithObject.types b/tests/baselines/reference/exportAmbientClassNameWithObject.types new file mode 100644 index 00000000000..e85e4eb05db --- /dev/null +++ b/tests/baselines/reference/exportAmbientClassNameWithObject.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportAmbientClassNameWithObject.ts === +export declare class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exportClassNameWithObjectAMD.errors.txt b/tests/baselines/reference/exportClassNameWithObjectAMD.errors.txt new file mode 100644 index 00000000000..781a010abb4 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectAMD.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts(1,14): error TS2717: Class name cannot be 'Object' when targeting ES5 with module AMD. + + +==== tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts (1 errors) ==== + export class Object {} + ~~~~~~ +!!! error TS2717: Class name cannot be 'Object' when targeting ES5 with module AMD. + \ No newline at end of file diff --git a/tests/baselines/reference/exportClassNameWithObjectAMD.js b/tests/baselines/reference/exportClassNameWithObjectAMD.js new file mode 100644 index 00000000000..e3403689cbb --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectAMD.js @@ -0,0 +1,15 @@ +//// [exportClassNameWithObjectAMD.ts] +export class Object {} + + +//// [exportClassNameWithObjectAMD.js] +define(["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var Object = /** @class */ (function () { + function Object() { + } + return Object; + }()); + exports.Object = Object; +}); diff --git a/tests/baselines/reference/exportClassNameWithObjectAMD.symbols b/tests/baselines/reference/exportClassNameWithObjectAMD.symbols new file mode 100644 index 00000000000..eadb0af0ddc --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectAMD.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts === +export class Object {} +>Object : Symbol(Object, Decl(exportClassNameWithObjectAMD.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportClassNameWithObjectAMD.types b/tests/baselines/reference/exportClassNameWithObjectAMD.types new file mode 100644 index 00000000000..7caeadb6e03 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectAMD.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts === +export class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exportClassNameWithObjectCommonJS.errors.txt b/tests/baselines/reference/exportClassNameWithObjectCommonJS.errors.txt new file mode 100644 index 00000000000..84ffb7f0f8a --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectCommonJS.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts(1,14): error TS2717: Class name cannot be 'Object' when targeting ES5 with module CommonJS. + + +==== tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts (1 errors) ==== + export class Object {} + ~~~~~~ +!!! error TS2717: Class name cannot be 'Object' when targeting ES5 with module CommonJS. + \ No newline at end of file diff --git a/tests/baselines/reference/exportClassNameWithObjectCommonJS.js b/tests/baselines/reference/exportClassNameWithObjectCommonJS.js new file mode 100644 index 00000000000..b9e2522b1b2 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectCommonJS.js @@ -0,0 +1,13 @@ +//// [exportClassNameWithObjectCommonJS.ts] +export class Object {} + + +//// [exportClassNameWithObjectCommonJS.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Object = /** @class */ (function () { + function Object() { + } + return Object; +}()); +exports.Object = Object; diff --git a/tests/baselines/reference/exportClassNameWithObjectCommonJS.symbols b/tests/baselines/reference/exportClassNameWithObjectCommonJS.symbols new file mode 100644 index 00000000000..025fa479fd6 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectCommonJS.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts === +export class Object {} +>Object : Symbol(Object, Decl(exportClassNameWithObjectCommonJS.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportClassNameWithObjectCommonJS.types b/tests/baselines/reference/exportClassNameWithObjectCommonJS.types new file mode 100644 index 00000000000..38ce8d61d95 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectCommonJS.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts === +export class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exportClassNameWithObjectSystem.errors.txt b/tests/baselines/reference/exportClassNameWithObjectSystem.errors.txt new file mode 100644 index 00000000000..67a932524bb --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectSystem.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts(1,14): error TS2717: Class name cannot be 'Object' when targeting ES5 with module System. + + +==== tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts (1 errors) ==== + export class Object {} + ~~~~~~ +!!! error TS2717: Class name cannot be 'Object' when targeting ES5 with module System. + \ No newline at end of file diff --git a/tests/baselines/reference/exportClassNameWithObjectSystem.js b/tests/baselines/reference/exportClassNameWithObjectSystem.js new file mode 100644 index 00000000000..6bb9dadaac6 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectSystem.js @@ -0,0 +1,21 @@ +//// [exportClassNameWithObjectSystem.ts] +export class Object {} + + +//// [exportClassNameWithObjectSystem.js] +System.register([], function (exports_1, context_1) { + "use strict"; + var __moduleName = context_1 && context_1.id; + var Object; + return { + setters: [], + execute: function () { + Object = /** @class */ (function () { + function Object() { + } + return Object; + }()); + exports_1("Object", Object); + } + }; +}); diff --git a/tests/baselines/reference/exportClassNameWithObjectSystem.symbols b/tests/baselines/reference/exportClassNameWithObjectSystem.symbols new file mode 100644 index 00000000000..5152c2aa637 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectSystem.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts === +export class Object {} +>Object : Symbol(Object, Decl(exportClassNameWithObjectSystem.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportClassNameWithObjectSystem.types b/tests/baselines/reference/exportClassNameWithObjectSystem.types new file mode 100644 index 00000000000..5b6507fd940 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectSystem.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts === +export class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exportClassNameWithObjectUMD.errors.txt b/tests/baselines/reference/exportClassNameWithObjectUMD.errors.txt new file mode 100644 index 00000000000..73cd319230b --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectUMD.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts(1,14): error TS2717: Class name cannot be 'Object' when targeting ES5 with module UMD. + + +==== tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts (1 errors) ==== + export class Object {} + ~~~~~~ +!!! error TS2717: Class name cannot be 'Object' when targeting ES5 with module UMD. + \ No newline at end of file diff --git a/tests/baselines/reference/exportClassNameWithObjectUMD.js b/tests/baselines/reference/exportClassNameWithObjectUMD.js new file mode 100644 index 00000000000..1447392c875 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectUMD.js @@ -0,0 +1,23 @@ +//// [exportClassNameWithObjectUMD.ts] +export class Object {} + + +//// [exportClassNameWithObjectUMD.js] +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var Object = /** @class */ (function () { + function Object() { + } + return Object; + }()); + exports.Object = Object; +}); diff --git a/tests/baselines/reference/exportClassNameWithObjectUMD.symbols b/tests/baselines/reference/exportClassNameWithObjectUMD.symbols new file mode 100644 index 00000000000..05d3eeb8b02 --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectUMD.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts === +export class Object {} +>Object : Symbol(Object, Decl(exportClassNameWithObjectUMD.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportClassNameWithObjectUMD.types b/tests/baselines/reference/exportClassNameWithObjectUMD.types new file mode 100644 index 00000000000..42f0198cbaf --- /dev/null +++ b/tests/baselines/reference/exportClassNameWithObjectUMD.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts === +export class Object {} +>Object : Object + diff --git a/tests/baselines/reference/exportDefaultClassNameWithObject.errors.txt b/tests/baselines/reference/exportDefaultClassNameWithObject.errors.txt new file mode 100644 index 00000000000..7be181d956b --- /dev/null +++ b/tests/baselines/reference/exportDefaultClassNameWithObject.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts(1,22): error TS2717: Class name cannot be 'Object' when targeting ES5 with module CommonJS. + + +==== tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts (1 errors) ==== + export default class Object {} + ~~~~~~ +!!! error TS2717: Class name cannot be 'Object' when targeting ES5 with module CommonJS. + \ No newline at end of file diff --git a/tests/baselines/reference/exportDefaultClassNameWithObject.js b/tests/baselines/reference/exportDefaultClassNameWithObject.js new file mode 100644 index 00000000000..f5a4ec74a66 --- /dev/null +++ b/tests/baselines/reference/exportDefaultClassNameWithObject.js @@ -0,0 +1,13 @@ +//// [exportDefaultClassNameWithObject.ts] +export default class Object {} + + +//// [exportDefaultClassNameWithObject.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Object = /** @class */ (function () { + function Object() { + } + return Object; +}()); +exports.default = Object; diff --git a/tests/baselines/reference/exportDefaultClassNameWithObject.symbols b/tests/baselines/reference/exportDefaultClassNameWithObject.symbols new file mode 100644 index 00000000000..3192dcf73ef --- /dev/null +++ b/tests/baselines/reference/exportDefaultClassNameWithObject.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts === +export default class Object {} +>Object : Symbol(Object, Decl(exportDefaultClassNameWithObject.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportDefaultClassNameWithObject.types b/tests/baselines/reference/exportDefaultClassNameWithObject.types new file mode 100644 index 00000000000..547164703d0 --- /dev/null +++ b/tests/baselines/reference/exportDefaultClassNameWithObject.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts === +export default class Object {} +>Object : Object + diff --git a/tests/cases/conformance/externalModules/es6/es6modulekindExportClassNameWithObject.ts b/tests/cases/conformance/externalModules/es6/es6modulekindExportClassNameWithObject.ts new file mode 100644 index 00000000000..40de8852ff1 --- /dev/null +++ b/tests/cases/conformance/externalModules/es6/es6modulekindExportClassNameWithObject.ts @@ -0,0 +1,3 @@ +// @target: ES5 +// @module: es2015 +export class Object {} diff --git a/tests/cases/conformance/externalModules/esnext/exnextmodulekindExportClassNameWithObject.ts b/tests/cases/conformance/externalModules/esnext/exnextmodulekindExportClassNameWithObject.ts new file mode 100644 index 00000000000..440bfe080d4 --- /dev/null +++ b/tests/cases/conformance/externalModules/esnext/exnextmodulekindExportClassNameWithObject.ts @@ -0,0 +1,3 @@ +// @target: ES5 +// @module: esnext +export class Object {} diff --git a/tests/cases/conformance/externalModules/exportAmbientClassNameWithObject.ts b/tests/cases/conformance/externalModules/exportAmbientClassNameWithObject.ts new file mode 100644 index 00000000000..3262ecdd3a5 --- /dev/null +++ b/tests/cases/conformance/externalModules/exportAmbientClassNameWithObject.ts @@ -0,0 +1,2 @@ +// @target: ES5 +export declare class Object {} diff --git a/tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts b/tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts new file mode 100644 index 00000000000..529924b4a4f --- /dev/null +++ b/tests/cases/conformance/externalModules/exportClassNameWithObjectAMD.ts @@ -0,0 +1,3 @@ +// @target: ES5 +// @module: amd +export class Object {} diff --git a/tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts b/tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts new file mode 100644 index 00000000000..676e275dfbd --- /dev/null +++ b/tests/cases/conformance/externalModules/exportClassNameWithObjectCommonJS.ts @@ -0,0 +1,3 @@ +// @target: ES5 +// @module: commonjs +export class Object {} diff --git a/tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts b/tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts new file mode 100644 index 00000000000..6d23d7e1e3b --- /dev/null +++ b/tests/cases/conformance/externalModules/exportClassNameWithObjectSystem.ts @@ -0,0 +1,3 @@ +// @target: ES5 +// @module: system +export class Object {} diff --git a/tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts b/tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts new file mode 100644 index 00000000000..d2cb221a069 --- /dev/null +++ b/tests/cases/conformance/externalModules/exportClassNameWithObjectUMD.ts @@ -0,0 +1,3 @@ +// @target: ES5 +// @module: umd +export class Object {} diff --git a/tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts b/tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts new file mode 100644 index 00000000000..75a5a33ac06 --- /dev/null +++ b/tests/cases/conformance/externalModules/exportDefaultClassNameWithObject.ts @@ -0,0 +1,2 @@ +// @target: ES5 +export default class Object {}