From 35bf1fb0e4b5f3729bfe761659cf0d24dcb8f7f9 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 23 Jan 2024 21:54:32 +0200 Subject: [PATCH 1/3] fix(57141): handle computed prop names --- src/compiler/checker.ts | 13 ++++++------ .../baselines/reference/override21.errors.txt | 13 ++++++++++++ tests/baselines/reference/override21.js | 18 +++++++++++++++++ tests/baselines/reference/override21.symbols | 19 ++++++++++++++++++ tests/baselines/reference/override21.types | 20 +++++++++++++++++++ .../cases/conformance/override/override21.ts | 9 +++++++++ 6 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 tests/baselines/reference/override21.errors.txt create mode 100644 tests/baselines/reference/override21.js create mode 100644 tests/baselines/reference/override21.symbols create mode 100644 tests/baselines/reference/override21.types create mode 100644 tests/cases/conformance/override/override21.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dd24f9be315ee..f0a86e153614a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -44783,7 +44783,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { hasAbstractModifier(member), isStatic(member), memberIsParameterProperty, - symbolName(declaredProp), + declaredProp, reportErrors ? member : undefined, ); } @@ -44807,22 +44807,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { memberHasAbstractModifier: boolean, memberIsStatic: boolean, memberIsParameterProperty: boolean, - memberName: string, + member: Symbol, errorNode?: Node, ): MemberOverrideStatus { const isJs = isInJSFile(node); const nodeInAmbientContext = !!(node.flags & NodeFlags.Ambient); if (baseWithThis && (memberHasOverrideModifier || compilerOptions.noImplicitOverride)) { - const memberEscapedName = escapeLeadingUnderscores(memberName); const thisType = memberIsStatic ? staticType : typeWithThis; const baseType = memberIsStatic ? baseStaticType : baseWithThis; - const prop = getPropertyOfType(thisType, memberEscapedName); - const baseProp = getPropertyOfType(baseType, memberEscapedName); + const prop = getPropertyOfType(thisType, member.escapedName); + const baseProp = getPropertyOfType(baseType, member.escapedName); const baseClassName = typeToString(baseWithThis); if (prop && !baseProp && memberHasOverrideModifier) { if (errorNode) { - const suggestion = getSuggestedSymbolForNonexistentClassMember(memberName, baseType); // Again, using symbol name: note that's different from `symbol.escapedName` + const suggestion = getSuggestedSymbolForNonexistentClassMember(symbolName(member), baseType); // Again, using symbol name: note that's different from `symbol.escapedName` suggestion ? error( errorNode, @@ -44968,7 +44967,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { hasAbstractModifier(member), isStatic(member), /*memberIsParameterProperty*/ false, - symbolName(memberSymbol), + memberSymbol, ); } diff --git a/tests/baselines/reference/override21.errors.txt b/tests/baselines/reference/override21.errors.txt new file mode 100644 index 0000000000000..325cd0999add3 --- /dev/null +++ b/tests/baselines/reference/override21.errors.txt @@ -0,0 +1,13 @@ +override21.ts(5,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. + + +==== override21.ts (1 errors) ==== + const foo = Symbol(); + class A { } + + class B extends A { + override [foo]() { } + ~~~~~ +!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/override21.js b/tests/baselines/reference/override21.js new file mode 100644 index 0000000000000..b05305c38a536 --- /dev/null +++ b/tests/baselines/reference/override21.js @@ -0,0 +1,18 @@ +//// [tests/cases/conformance/override/override21.ts] //// + +//// [override21.ts] +const foo = Symbol(); +class A { } + +class B extends A { + override [foo]() { } +} + + +//// [override21.js] +const foo = Symbol(); +class A { +} +class B extends A { + [foo]() { } +} diff --git a/tests/baselines/reference/override21.symbols b/tests/baselines/reference/override21.symbols new file mode 100644 index 0000000000000..374510196b9b0 --- /dev/null +++ b/tests/baselines/reference/override21.symbols @@ -0,0 +1,19 @@ +//// [tests/cases/conformance/override/override21.ts] //// + +=== override21.ts === +const foo = Symbol(); +>foo : Symbol(foo, Decl(override21.ts, 0, 5)) +>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --)) + +class A { } +>A : Symbol(A, Decl(override21.ts, 0, 21)) + +class B extends A { +>B : Symbol(B, Decl(override21.ts, 1, 11)) +>A : Symbol(A, Decl(override21.ts, 0, 21)) + + override [foo]() { } +>[foo] : Symbol(B[foo], Decl(override21.ts, 3, 19)) +>foo : Symbol(foo, Decl(override21.ts, 0, 5)) +} + diff --git a/tests/baselines/reference/override21.types b/tests/baselines/reference/override21.types new file mode 100644 index 0000000000000..c4046451af5cd --- /dev/null +++ b/tests/baselines/reference/override21.types @@ -0,0 +1,20 @@ +//// [tests/cases/conformance/override/override21.ts] //// + +=== override21.ts === +const foo = Symbol(); +>foo : unique symbol +>Symbol() : unique symbol +>Symbol : SymbolConstructor + +class A { } +>A : A + +class B extends A { +>B : B +>A : A + + override [foo]() { } +>[foo] : () => void +>foo : unique symbol +} + diff --git a/tests/cases/conformance/override/override21.ts b/tests/cases/conformance/override/override21.ts new file mode 100644 index 0000000000000..1ae27447a6d17 --- /dev/null +++ b/tests/cases/conformance/override/override21.ts @@ -0,0 +1,9 @@ +// @target: esnext +// @noImplicitOverride: true + +const foo = Symbol(); +class A { } + +class B extends A { + override [foo]() { } +} From 522bdc51cc082793be3b77dc7153ea28eaf18624 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Mon, 11 Mar 2024 23:36:53 +0200 Subject: [PATCH 2/3] update baseline --- ...nodeModulesAllowJsImportHelpersCollisions3(module=node16).js | 2 +- ...deModulesAllowJsImportHelpersCollisions3(module=nodenext).js | 2 +- .../nodeModulesImportHelpersCollisions3(module=node16).js | 2 +- .../nodeModulesImportHelpersCollisions3(module=nodenext).js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js index 8fefc3d2d6b56..a65aeaf84177b 100644 --- a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js +++ b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js @@ -31,7 +31,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.baz = exports.foo = exports.default = void 0; -var tslib_1 = require("tslib"); +const tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); diff --git a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js index 8fefc3d2d6b56..a65aeaf84177b 100644 --- a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js +++ b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js @@ -31,7 +31,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.baz = exports.foo = exports.default = void 0; -var tslib_1 = require("tslib"); +const tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); diff --git a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js index e7fd6f6cab25b..e7cb4f5e61f69 100644 --- a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js +++ b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js @@ -27,7 +27,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var tslib_1 = require("tslib"); +const tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); diff --git a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js index e7fd6f6cab25b..e7cb4f5e61f69 100644 --- a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js +++ b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js @@ -27,7 +27,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var tslib_1 = require("tslib"); +const tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); From b5a0e169feaaf73f977baa9ddb8250b2cc44f16c Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 12 Mar 2024 23:37:31 +0200 Subject: [PATCH 3/3] update baseline --- ...nodeModulesAllowJsImportHelpersCollisions3(module=node16).js | 2 +- ...deModulesAllowJsImportHelpersCollisions3(module=nodenext).js | 2 +- .../nodeModulesImportHelpersCollisions3(module=node16).js | 2 +- .../nodeModulesImportHelpersCollisions3(module=nodenext).js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js index a65aeaf84177b..8fefc3d2d6b56 100644 --- a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js +++ b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js @@ -31,7 +31,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.baz = exports.foo = exports.default = void 0; -const tslib_1 = require("tslib"); +var tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); diff --git a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js index a65aeaf84177b..8fefc3d2d6b56 100644 --- a/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js +++ b/tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js @@ -31,7 +31,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.baz = exports.foo = exports.default = void 0; -const tslib_1 = require("tslib"); +var tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); diff --git a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js index e7cb4f5e61f69..e7fd6f6cab25b 100644 --- a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js +++ b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js @@ -27,7 +27,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -const tslib_1 = require("tslib"); +var tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } }); diff --git a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js index e7cb4f5e61f69..e7fd6f6cab25b 100644 --- a/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js +++ b/tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js @@ -27,7 +27,7 @@ declare module "tslib" { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -const tslib_1 = require("tslib"); +var tslib_1 = require("tslib"); // cjs format file var fs_1 = require("fs"); Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } });