diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5a1f6f440fe..5ee0f6c3f0a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -35325,6 +35325,10 @@ namespace ts { // Grammar checking if (!checkGrammarMethod(node)) checkGrammarComputedPropertyName(node.name); + if (isMethodDeclaration(node) && node.asteriskToken && isIdentifier(node.name) && idText(node.name) === "constructor") { + error(node.name, Diagnostics.Class_constructor_may_not_be_a_generator); + } + // Grammar checking for modifiers is done inside the function checkGrammarFunctionLikeDeclaration checkFunctionOrMethodDeclaration(node); @@ -35477,6 +35481,9 @@ namespace ts { } function checkAccessorDeclaration(node: AccessorDeclaration) { + if (isIdentifier(node.name) && idText(node.name) === "constructor") { + error(node.name, Diagnostics.Class_constructor_may_not_be_an_accessor); + } addLazyDiagnostic(checkAccessorDeclarationDiagnostics); checkSourceElement(node.body); setNodeLinksForPrivateIdentifierScope(node); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 207b23d7013..16aa9a57304 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1012,6 +1012,10 @@ "category": "Error", "code": 1340 }, + "Class constructor may not be an accessor.": { + "category": "Error", + "code": 1341 + }, "Type arguments cannot be used here.": { "category": "Error", "code": 1342 @@ -1084,6 +1088,10 @@ "category": "Error", "code": 1359 }, + "Class constructor may not be a generator.": { + "category": "Error", + "code": 1360 + }, "'{0}' cannot be used as a value because it was imported using 'import type'.": { "category": "Error", "code": 1361 diff --git a/tests/baselines/reference/constructorNameInAccessor.errors.txt b/tests/baselines/reference/constructorNameInAccessor.errors.txt new file mode 100644 index 00000000000..b83e2cfbde8 --- /dev/null +++ b/tests/baselines/reference/constructorNameInAccessor.errors.txt @@ -0,0 +1,14 @@ +tests/cases/compiler/constructorNameInAccessor.ts(2,9): error TS1341: Class constructor may not be an accessor. +tests/cases/compiler/constructorNameInAccessor.ts(3,9): error TS1341: Class constructor may not be an accessor. + + +==== tests/cases/compiler/constructorNameInAccessor.ts (2 errors) ==== + class C1 { + get constructor() { return } + ~~~~~~~~~~~ +!!! error TS1341: Class constructor may not be an accessor. + set constructor(value) {} + ~~~~~~~~~~~ +!!! error TS1341: Class constructor may not be an accessor. + } + \ No newline at end of file diff --git a/tests/baselines/reference/constructorNameInAccessor.js b/tests/baselines/reference/constructorNameInAccessor.js new file mode 100644 index 00000000000..041d812b016 --- /dev/null +++ b/tests/baselines/reference/constructorNameInAccessor.js @@ -0,0 +1,12 @@ +//// [constructorNameInAccessor.ts] +class C1 { + get constructor() { return } + set constructor(value) {} +} + + +//// [constructorNameInAccessor.js] +class C1 { + get constructor() { return; } + set constructor(value) { } +} diff --git a/tests/baselines/reference/constructorNameInAccessor.symbols b/tests/baselines/reference/constructorNameInAccessor.symbols new file mode 100644 index 00000000000..7d7a3e52437 --- /dev/null +++ b/tests/baselines/reference/constructorNameInAccessor.symbols @@ -0,0 +1,12 @@ +=== tests/cases/compiler/constructorNameInAccessor.ts === +class C1 { +>C1 : Symbol(C1, Decl(constructorNameInAccessor.ts, 0, 0)) + + get constructor() { return } +>constructor : Symbol(C1.constructor, Decl(constructorNameInAccessor.ts, 0, 10), Decl(constructorNameInAccessor.ts, 1, 32)) + + set constructor(value) {} +>constructor : Symbol(C1.constructor, Decl(constructorNameInAccessor.ts, 0, 10), Decl(constructorNameInAccessor.ts, 1, 32)) +>value : Symbol(value, Decl(constructorNameInAccessor.ts, 2, 20)) +} + diff --git a/tests/baselines/reference/constructorNameInAccessor.types b/tests/baselines/reference/constructorNameInAccessor.types new file mode 100644 index 00000000000..9b797f21891 --- /dev/null +++ b/tests/baselines/reference/constructorNameInAccessor.types @@ -0,0 +1,12 @@ +=== tests/cases/compiler/constructorNameInAccessor.ts === +class C1 { +>C1 : C1 + + get constructor() { return } +>constructor : void + + set constructor(value) {} +>constructor : void +>value : void +} + diff --git a/tests/baselines/reference/constructorNameInGenerator.errors.txt b/tests/baselines/reference/constructorNameInGenerator.errors.txt new file mode 100644 index 00000000000..a66d3693648 --- /dev/null +++ b/tests/baselines/reference/constructorNameInGenerator.errors.txt @@ -0,0 +1,10 @@ +tests/cases/compiler/constructorNameInGenerator.ts(2,6): error TS1360: Class constructor may not be a generator. + + +==== tests/cases/compiler/constructorNameInGenerator.ts (1 errors) ==== + class C2 { + *constructor() {} + ~~~~~~~~~~~ +!!! error TS1360: Class constructor may not be a generator. + } + \ No newline at end of file diff --git a/tests/baselines/reference/constructorNameInGenerator.js b/tests/baselines/reference/constructorNameInGenerator.js new file mode 100644 index 00000000000..fb7b318a192 --- /dev/null +++ b/tests/baselines/reference/constructorNameInGenerator.js @@ -0,0 +1,10 @@ +//// [constructorNameInGenerator.ts] +class C2 { + *constructor() {} +} + + +//// [constructorNameInGenerator.js] +class C2 { + *constructor() { } +} diff --git a/tests/baselines/reference/constructorNameInGenerator.symbols b/tests/baselines/reference/constructorNameInGenerator.symbols new file mode 100644 index 00000000000..4da0599f5bd --- /dev/null +++ b/tests/baselines/reference/constructorNameInGenerator.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/constructorNameInGenerator.ts === +class C2 { +>C2 : Symbol(C2, Decl(constructorNameInGenerator.ts, 0, 0)) + + *constructor() {} +>constructor : Symbol(C2.constructor, Decl(constructorNameInGenerator.ts, 0, 10)) +} + diff --git a/tests/baselines/reference/constructorNameInGenerator.types b/tests/baselines/reference/constructorNameInGenerator.types new file mode 100644 index 00000000000..799bdf6d7f7 --- /dev/null +++ b/tests/baselines/reference/constructorNameInGenerator.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/constructorNameInGenerator.ts === +class C2 { +>C2 : C2 + + *constructor() {} +>constructor : () => Generator +} + diff --git a/tests/cases/compiler/constructorNameInAccessor.ts b/tests/cases/compiler/constructorNameInAccessor.ts new file mode 100644 index 00000000000..878c4b8dc78 --- /dev/null +++ b/tests/cases/compiler/constructorNameInAccessor.ts @@ -0,0 +1,5 @@ +// @target: esnext +class C1 { + get constructor() { return } + set constructor(value) {} +} diff --git a/tests/cases/compiler/constructorNameInGenerator.ts b/tests/cases/compiler/constructorNameInGenerator.ts new file mode 100644 index 00000000000..7040fb40baa --- /dev/null +++ b/tests/cases/compiler/constructorNameInGenerator.ts @@ -0,0 +1,4 @@ +// @target: esnext +class C2 { + *constructor() {} +}