From 369eeb1bde6f37e46da0c2d04232fe5408a6f818 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 12 Dec 2023 01:12:55 +0200 Subject: [PATCH] fix(49419): Referencing this through a variable causes "Rename Symbol" to misbehave in Javascript (#56540) --- src/compiler/checker.ts | 6 +++++- .../inferringClassMembersFromAssignments6.symbols | 6 +++--- .../inferringClassMembersFromAssignments7.symbols | 6 +++--- .../renameJsPropertyAssignment4.baseline.jsonc | 15 +++++++++++++++ .../typeFromPropertyAssignment10.symbols | 2 +- .../typeFromPropertyAssignment10_1.symbols | 2 +- .../typeFromPropertyAssignment40.symbols | 2 +- .../reference/typeFromPropertyAssignment9.symbols | 2 +- .../typeFromPropertyAssignment9_1.symbols | 2 +- .../fourslash/renameJsPropertyAssignment4.ts | 11 +++++++++++ 10 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 tests/baselines/reference/renameJsPropertyAssignment4.baseline.jsonc create mode 100644 tests/cases/fourslash/renameJsPropertyAssignment4.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 15cf0a85cdb..cd89bbf688a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -46946,9 +46946,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { case AssignmentDeclarationKind.ExportsProperty: case AssignmentDeclarationKind.PrototypeProperty: return getSymbolOfNode(entityName.parent); + case AssignmentDeclarationKind.Property: + if (isPropertyAccessExpression(entityName.parent) && getLeftmostAccessExpression(entityName.parent) === entityName) { + return undefined; + } + // falls through case AssignmentDeclarationKind.ThisProperty: case AssignmentDeclarationKind.ModuleExports: - case AssignmentDeclarationKind.Property: return getSymbolOfDeclaration(entityName.parent.parent as BinaryExpression); } } diff --git a/tests/baselines/reference/inferringClassMembersFromAssignments6.symbols b/tests/baselines/reference/inferringClassMembersFromAssignments6.symbols index ebf4dbd28fc..adaa9b83f1c 100644 --- a/tests/baselines/reference/inferringClassMembersFromAssignments6.symbols +++ b/tests/baselines/reference/inferringClassMembersFromAssignments6.symbols @@ -10,12 +10,12 @@ function Foonly() { self.x = 1 >self.x : Symbol(Foonly.x, Decl(inferringClassMembersFromAssignments6.js, 1, 19)) ->self : Symbol(Foonly.x, Decl(inferringClassMembersFromAssignments6.js, 1, 19)) +>self : Symbol(self, Decl(inferringClassMembersFromAssignments6.js, 1, 7)) >x : Symbol(Foonly.x, Decl(inferringClassMembersFromAssignments6.js, 1, 19)) self.m = function() { >self.m : Symbol(Foonly.m, Decl(inferringClassMembersFromAssignments6.js, 2, 14)) ->self : Symbol(Foonly.m, Decl(inferringClassMembersFromAssignments6.js, 2, 14)) +>self : Symbol(self, Decl(inferringClassMembersFromAssignments6.js, 1, 7)) >m : Symbol(Foonly.m, Decl(inferringClassMembersFromAssignments6.js, 2, 14)) console.log(self.x) @@ -39,7 +39,7 @@ Foonly.prototype.mreal = function() { self.y = 2 >self.y : Symbol(Foonly.y, Decl(inferringClassMembersFromAssignments6.js, 8, 19)) ->self : Symbol(Foonly.y, Decl(inferringClassMembersFromAssignments6.js, 8, 19)) +>self : Symbol(self, Decl(inferringClassMembersFromAssignments6.js, 8, 7)) >y : Symbol(Foonly.y, Decl(inferringClassMembersFromAssignments6.js, 8, 19)) } const foo = new Foonly() diff --git a/tests/baselines/reference/inferringClassMembersFromAssignments7.symbols b/tests/baselines/reference/inferringClassMembersFromAssignments7.symbols index f7a2ed3a771..864bf5456e1 100644 --- a/tests/baselines/reference/inferringClassMembersFromAssignments7.symbols +++ b/tests/baselines/reference/inferringClassMembersFromAssignments7.symbols @@ -11,12 +11,12 @@ class C { self.x = 1 >self.x : Symbol(C.x, Decl(inferringClassMembersFromAssignments7.js, 2, 23)) ->self : Symbol(C.x, Decl(inferringClassMembersFromAssignments7.js, 2, 23)) +>self : Symbol(self, Decl(inferringClassMembersFromAssignments7.js, 2, 11)) >x : Symbol(C.x, Decl(inferringClassMembersFromAssignments7.js, 2, 23)) self.m = function() { >self.m : Symbol(C.m, Decl(inferringClassMembersFromAssignments7.js, 3, 18)) ->self : Symbol(C.m, Decl(inferringClassMembersFromAssignments7.js, 3, 18)) +>self : Symbol(self, Decl(inferringClassMembersFromAssignments7.js, 2, 11)) >m : Symbol(C.m, Decl(inferringClassMembersFromAssignments7.js, 3, 18)) console.log(self.x) @@ -37,7 +37,7 @@ class C { self.y = 2 >self.y : Symbol(C.y, Decl(inferringClassMembersFromAssignments7.js, 9, 23)) ->self : Symbol(C.y, Decl(inferringClassMembersFromAssignments7.js, 9, 23)) +>self : Symbol(self, Decl(inferringClassMembersFromAssignments7.js, 9, 11)) >y : Symbol(C.y, Decl(inferringClassMembersFromAssignments7.js, 9, 23)) } } diff --git a/tests/baselines/reference/renameJsPropertyAssignment4.baseline.jsonc b/tests/baselines/reference/renameJsPropertyAssignment4.baseline.jsonc new file mode 100644 index 00000000000..39fb58cbc57 --- /dev/null +++ b/tests/baselines/reference/renameJsPropertyAssignment4.baseline.jsonc @@ -0,0 +1,15 @@ +// === findRenameLocations === +// === /a.js === +// function f() { +// <|var /*RENAME*/[|fooRENAME|] = this;|> +// <|[|fooRENAME|].x = 1;|> +// } + + + +// === findRenameLocations === +// === /a.js === +// function f() { +// <|var [|fooRENAME|] = this;|> +// /*RENAME*/<|[|fooRENAME|].x = 1;|> +// } \ No newline at end of file diff --git a/tests/baselines/reference/typeFromPropertyAssignment10.symbols b/tests/baselines/reference/typeFromPropertyAssignment10.symbols index 6741190878b..e40fc76333b 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment10.symbols +++ b/tests/baselines/reference/typeFromPropertyAssignment10.symbols @@ -93,7 +93,7 @@ Outer.app.Application = (function () { me.view = new Outer.app.SomeView(); >me.view : Symbol(Application.view, Decl(application.js, 7, 22)) ->me : Symbol(Application.view, Decl(application.js, 7, 22)) +>me : Symbol(me, Decl(application.js, 7, 11)) >view : Symbol(Application.view, Decl(application.js, 7, 22)) >Outer.app.SomeView : Symbol(Outer.app.SomeView, Decl(someview.js, 0, 0)) >Outer.app : Symbol(Outer.app, Decl(module.js, 0, 24), Decl(someview.js, 0, 6), Decl(someview.js, 6, 6), Decl(someview.js, 15, 6), Decl(application.js, 0, 6)) diff --git a/tests/baselines/reference/typeFromPropertyAssignment10_1.symbols b/tests/baselines/reference/typeFromPropertyAssignment10_1.symbols index 3f503faa766..c460e49a902 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment10_1.symbols +++ b/tests/baselines/reference/typeFromPropertyAssignment10_1.symbols @@ -93,7 +93,7 @@ Outer.app.Application = (function () { me.view = new Outer.app.SomeView(); >me.view : Symbol(Application.view, Decl(application.js, 7, 22)) ->me : Symbol(Application.view, Decl(application.js, 7, 22)) +>me : Symbol(me, Decl(application.js, 7, 11)) >view : Symbol(Application.view, Decl(application.js, 7, 22)) >Outer.app.SomeView : Symbol(Outer.app.SomeView, Decl(someview.js, 0, 0)) >Outer.app : Symbol(Outer.app, Decl(module.js, 0, 24), Decl(someview.js, 0, 6), Decl(someview.js, 6, 6), Decl(someview.js, 15, 6), Decl(application.js, 0, 6)) diff --git a/tests/baselines/reference/typeFromPropertyAssignment40.symbols b/tests/baselines/reference/typeFromPropertyAssignment40.symbols index 347a1107562..e77306cb3d9 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment40.symbols +++ b/tests/baselines/reference/typeFromPropertyAssignment40.symbols @@ -10,7 +10,7 @@ function Outer() { self.y = 2 >self.y : Symbol(Outer.y, Decl(typeFromPropertyAssignment40.js, 1, 19)) ->self : Symbol(Outer.y, Decl(typeFromPropertyAssignment40.js, 1, 19)) +>self : Symbol(self, Decl(typeFromPropertyAssignment40.js, 1, 7)) >y : Symbol(Outer.y, Decl(typeFromPropertyAssignment40.js, 1, 19)) } /** @type {Outer} */ diff --git a/tests/baselines/reference/typeFromPropertyAssignment9.symbols b/tests/baselines/reference/typeFromPropertyAssignment9.symbols index 3e1bbca657a..bfc23e323b6 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment9.symbols +++ b/tests/baselines/reference/typeFromPropertyAssignment9.symbols @@ -46,7 +46,7 @@ my.predicate.query = function () { me.property = false; >me.property : Symbol(query.property, Decl(a.js, 9, 18)) ->me : Symbol(query.property, Decl(a.js, 9, 18)) +>me : Symbol(me, Decl(a.js, 9, 7)) >property : Symbol(query.property, Decl(a.js, 9, 18)) }; diff --git a/tests/baselines/reference/typeFromPropertyAssignment9_1.symbols b/tests/baselines/reference/typeFromPropertyAssignment9_1.symbols index 6262ac7d947..dd3d6c19678 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment9_1.symbols +++ b/tests/baselines/reference/typeFromPropertyAssignment9_1.symbols @@ -46,7 +46,7 @@ my.predicate.query = function () { me.property = false; >me.property : Symbol(query.property, Decl(a.js, 9, 18)) ->me : Symbol(query.property, Decl(a.js, 9, 18)) +>me : Symbol(me, Decl(a.js, 9, 7)) >property : Symbol(query.property, Decl(a.js, 9, 18)) }; diff --git a/tests/cases/fourslash/renameJsPropertyAssignment4.ts b/tests/cases/fourslash/renameJsPropertyAssignment4.ts new file mode 100644 index 00000000000..c436e9d1722 --- /dev/null +++ b/tests/cases/fourslash/renameJsPropertyAssignment4.ts @@ -0,0 +1,11 @@ +/// + +// @allowJs: true +// @Filename: /a.js +////function f() { +//// var /*1*/foo = this; +//// /*2*/foo.x = 1; +////} + +goTo.file("/a.js") +verify.baselineRename(["1", "2"]);