diff --git a/src/services/services.ts b/src/services/services.ts index 8d28d5d958a..109ad7bd14f 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2583,8 +2583,17 @@ namespace ts { /** Returns true if node is a name of an object literal property, e.g. "a" in x = { "a": 1 } */ function isNameOfPropertyAssignment(node: Node): boolean { - return (node.kind === SyntaxKind.Identifier || node.kind === SyntaxKind.StringLiteral || node.kind === SyntaxKind.NumericLiteral) && - (node.parent.kind === SyntaxKind.PropertyAssignment || node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) && (node.parent).name === node; + if (node.kind === SyntaxKind.Identifier || node.kind === SyntaxKind.StringLiteral || node.kind === SyntaxKind.NumericLiteral) { + switch (node.parent.kind) { + case SyntaxKind.PropertyAssignment: + case SyntaxKind.ShorthandPropertyAssignment: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + return (node.parent).name === node; + } + } + return false; } function isLiteralNameOfPropertyDeclarationOrIndexAccess(node: Node): boolean { diff --git a/tests/cases/fourslash/renameContextuallyTypedProperties.ts b/tests/cases/fourslash/renameContextuallyTypedProperties.ts new file mode 100644 index 00000000000..21885874269 --- /dev/null +++ b/tests/cases/fourslash/renameContextuallyTypedProperties.ts @@ -0,0 +1,43 @@ +/// + +////interface I { +//// [|prop1|]: () => void; +//// prop2(): void; +////} +//// +////var o1: I = { +//// [|prop1|]() { }, +//// prop2() { } +////}; +//// +////var o2: I = { +//// [|prop1|]: () => { }, +//// prop2: () => { } +////}; +//// +////var o3: I = { +//// get [|prop1|]() { return () => { }; }, +//// get prop2() { return () => { }; } +////}; +//// +////var o4: I = { +//// set [|prop1|](v) { }, +//// set prop2(v) { } +////}; +//// +////var o5: I = { +//// "[|prop1|]"() { }, +//// "prop2"() { } +////}; +//// +////var o6: I = { +//// "[|prop1|]": function () { }, +//// "prop2": function () { } +////}; + +let ranges = test.ranges() +for (let range of ranges) { + goTo.file(range.fileName); + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +} diff --git a/tests/cases/fourslash/renameContextuallyTypedProperties2.ts b/tests/cases/fourslash/renameContextuallyTypedProperties2.ts new file mode 100644 index 00000000000..9961c9b8403 --- /dev/null +++ b/tests/cases/fourslash/renameContextuallyTypedProperties2.ts @@ -0,0 +1,43 @@ +/// + +////interface I { +//// prop1: () => void; +//// [|prop2|](): void; +////} +//// +////var o1: I = { +//// prop1() { }, +//// [|prop2|]() { } +////}; +//// +////var o2: I = { +//// prop1: () => { }, +//// [|prop2|]: () => { } +////}; +//// +////var o3: I = { +//// get prop1() { return () => { }; }, +//// get [|prop2|]() { return () => { }; } +////}; +//// +////var o4: I = { +//// set prop1(v) { }, +//// set [|prop2|](v) { } +////}; +//// +////var o5: I = { +//// "prop1"() { }, +//// "[|prop2|]"() { } +////}; +//// +////var o6: I = { +//// "prop1": function () { }, +//// "[|prop2|]": function () { } +////}; + +let ranges = test.ranges() +for (let range of ranges) { + goTo.file(range.fileName); + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +}