From 538d6ce82859e4476bb23c04e51dbbd0d1a9193f Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 4 May 2022 21:00:32 +0300 Subject: [PATCH 1/3] fix(48948): disallow constructor name in class accessors and generators --- src/compiler/checker.ts | 7 +++++++ src/compiler/diagnosticMessages.json | 8 ++++++++ .../reference/constructorNameInAccessor.errors.txt | 14 ++++++++++++++ .../reference/constructorNameInAccessor.js | 12 ++++++++++++ .../reference/constructorNameInAccessor.symbols | 12 ++++++++++++ .../reference/constructorNameInAccessor.types | 12 ++++++++++++ .../constructorNameInGenerator.errors.txt | 10 ++++++++++ .../reference/constructorNameInGenerator.js | 10 ++++++++++ .../reference/constructorNameInGenerator.symbols | 8 ++++++++ .../reference/constructorNameInGenerator.types | 8 ++++++++ tests/cases/compiler/constructorNameInAccessor.ts | 5 +++++ tests/cases/compiler/constructorNameInGenerator.ts | 4 ++++ 12 files changed, 110 insertions(+) create mode 100644 tests/baselines/reference/constructorNameInAccessor.errors.txt create mode 100644 tests/baselines/reference/constructorNameInAccessor.js create mode 100644 tests/baselines/reference/constructorNameInAccessor.symbols create mode 100644 tests/baselines/reference/constructorNameInAccessor.types create mode 100644 tests/baselines/reference/constructorNameInGenerator.errors.txt create mode 100644 tests/baselines/reference/constructorNameInGenerator.js create mode 100644 tests/baselines/reference/constructorNameInGenerator.symbols create mode 100644 tests/baselines/reference/constructorNameInGenerator.types create mode 100644 tests/cases/compiler/constructorNameInAccessor.ts create mode 100644 tests/cases/compiler/constructorNameInGenerator.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5a1f6f440fe7e..5ee0f6c3f0af3 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 207b23d70135a..16aa9a573046f 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 0000000000000..b83e2cfbde84e --- /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 0000000000000..041d812b01620 --- /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 0000000000000..7d7a3e524374d --- /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 0000000000000..9b797f21891a4 --- /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 0000000000000..a66d3693648b9 --- /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 0000000000000..fb7b318a1923d --- /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 0000000000000..4da0599f5bdd2 --- /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 0000000000000..799bdf6d7f7f1 --- /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 0000000000000..878c4b8dc788a --- /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 0000000000000..7040fb40baaf6 --- /dev/null +++ b/tests/cases/compiler/constructorNameInGenerator.ts @@ -0,0 +1,4 @@ +// @target: esnext +class C2 { + *constructor() {} +} From 9607a5310fd75d44fffc26f45299f8dedcbac2a1 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 13 May 2022 09:24:08 +0300 Subject: [PATCH 2/3] add messages to plainJSErrors --- src/compiler/program.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c7f886ea3119f..823fbf12a2e87 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -967,6 +967,8 @@ namespace ts { Diagnostics.extends_clause_already_seen.code, Diagnostics.let_declarations_can_only_be_declared_inside_a_block.code, Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations.code, + Diagnostics.Class_constructor_may_not_be_a_generator.code, + Diagnostics.Class_constructor_may_not_be_an_accessor.code, ]); /** From d8ebeebc596e46558e45eb9e8f643dd090677dda Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 13 May 2022 09:24:33 +0300 Subject: [PATCH 3/3] move tests to conformance/salsa from compiler --- .../reference/constructorNameInAccessor.errors.txt | 6 +++--- tests/baselines/reference/constructorNameInAccessor.symbols | 2 +- tests/baselines/reference/constructorNameInAccessor.types | 2 +- .../reference/constructorNameInGenerator.errors.txt | 4 ++-- .../baselines/reference/constructorNameInGenerator.symbols | 2 +- tests/baselines/reference/constructorNameInGenerator.types | 2 +- .../salsa}/constructorNameInAccessor.ts | 0 .../salsa}/constructorNameInGenerator.ts | 0 8 files changed, 9 insertions(+), 9 deletions(-) rename tests/cases/{compiler => conformance/salsa}/constructorNameInAccessor.ts (100%) rename tests/cases/{compiler => conformance/salsa}/constructorNameInGenerator.ts (100%) diff --git a/tests/baselines/reference/constructorNameInAccessor.errors.txt b/tests/baselines/reference/constructorNameInAccessor.errors.txt index b83e2cfbde84e..7033dec4e5bed 100644 --- a/tests/baselines/reference/constructorNameInAccessor.errors.txt +++ b/tests/baselines/reference/constructorNameInAccessor.errors.txt @@ -1,8 +1,8 @@ -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/conformance/salsa/constructorNameInAccessor.ts(2,9): error TS1341: Class constructor may not be an accessor. +tests/cases/conformance/salsa/constructorNameInAccessor.ts(3,9): error TS1341: Class constructor may not be an accessor. -==== tests/cases/compiler/constructorNameInAccessor.ts (2 errors) ==== +==== tests/cases/conformance/salsa/constructorNameInAccessor.ts (2 errors) ==== class C1 { get constructor() { return } ~~~~~~~~~~~ diff --git a/tests/baselines/reference/constructorNameInAccessor.symbols b/tests/baselines/reference/constructorNameInAccessor.symbols index 7d7a3e524374d..cea664a716f80 100644 --- a/tests/baselines/reference/constructorNameInAccessor.symbols +++ b/tests/baselines/reference/constructorNameInAccessor.symbols @@ -1,4 +1,4 @@ -=== tests/cases/compiler/constructorNameInAccessor.ts === +=== tests/cases/conformance/salsa/constructorNameInAccessor.ts === class C1 { >C1 : Symbol(C1, Decl(constructorNameInAccessor.ts, 0, 0)) diff --git a/tests/baselines/reference/constructorNameInAccessor.types b/tests/baselines/reference/constructorNameInAccessor.types index 9b797f21891a4..b81c47ec3e2d8 100644 --- a/tests/baselines/reference/constructorNameInAccessor.types +++ b/tests/baselines/reference/constructorNameInAccessor.types @@ -1,4 +1,4 @@ -=== tests/cases/compiler/constructorNameInAccessor.ts === +=== tests/cases/conformance/salsa/constructorNameInAccessor.ts === class C1 { >C1 : C1 diff --git a/tests/baselines/reference/constructorNameInGenerator.errors.txt b/tests/baselines/reference/constructorNameInGenerator.errors.txt index a66d3693648b9..061560615fb0c 100644 --- a/tests/baselines/reference/constructorNameInGenerator.errors.txt +++ b/tests/baselines/reference/constructorNameInGenerator.errors.txt @@ -1,7 +1,7 @@ -tests/cases/compiler/constructorNameInGenerator.ts(2,6): error TS1360: Class constructor may not be a generator. +tests/cases/conformance/salsa/constructorNameInGenerator.ts(2,6): error TS1360: Class constructor may not be a generator. -==== tests/cases/compiler/constructorNameInGenerator.ts (1 errors) ==== +==== tests/cases/conformance/salsa/constructorNameInGenerator.ts (1 errors) ==== class C2 { *constructor() {} ~~~~~~~~~~~ diff --git a/tests/baselines/reference/constructorNameInGenerator.symbols b/tests/baselines/reference/constructorNameInGenerator.symbols index 4da0599f5bdd2..ea64a07a65188 100644 --- a/tests/baselines/reference/constructorNameInGenerator.symbols +++ b/tests/baselines/reference/constructorNameInGenerator.symbols @@ -1,4 +1,4 @@ -=== tests/cases/compiler/constructorNameInGenerator.ts === +=== tests/cases/conformance/salsa/constructorNameInGenerator.ts === class C2 { >C2 : Symbol(C2, Decl(constructorNameInGenerator.ts, 0, 0)) diff --git a/tests/baselines/reference/constructorNameInGenerator.types b/tests/baselines/reference/constructorNameInGenerator.types index 799bdf6d7f7f1..ba5f4f243da43 100644 --- a/tests/baselines/reference/constructorNameInGenerator.types +++ b/tests/baselines/reference/constructorNameInGenerator.types @@ -1,4 +1,4 @@ -=== tests/cases/compiler/constructorNameInGenerator.ts === +=== tests/cases/conformance/salsa/constructorNameInGenerator.ts === class C2 { >C2 : C2 diff --git a/tests/cases/compiler/constructorNameInAccessor.ts b/tests/cases/conformance/salsa/constructorNameInAccessor.ts similarity index 100% rename from tests/cases/compiler/constructorNameInAccessor.ts rename to tests/cases/conformance/salsa/constructorNameInAccessor.ts diff --git a/tests/cases/compiler/constructorNameInGenerator.ts b/tests/cases/conformance/salsa/constructorNameInGenerator.ts similarity index 100% rename from tests/cases/compiler/constructorNameInGenerator.ts rename to tests/cases/conformance/salsa/constructorNameInGenerator.ts