From 5d8cea44897f0c15e040eca900c657259227388b Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 28 Jul 2017 07:56:43 -0700 Subject: [PATCH 1/3] Fix find-all-references for destructured getter --- src/services/findAllReferences.ts | 13 +++++++++---- .../fourslash/findAllRefsDestructureGetter.ts | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/findAllRefsDestructureGetter.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index c9fc3eb05dfa1..5bcb87426f637 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -604,11 +604,16 @@ namespace ts.FindAllReferences.Core { function getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol: Symbol, checker: TypeChecker): Symbol | undefined { const bindingElement = getObjectBindingElementWithoutPropertyName(symbol); - if (bindingElement) { - const typeOfPattern = checker.getTypeAtLocation(bindingElement.parent); - return typeOfPattern && checker.getPropertyOfType(typeOfPattern, (bindingElement.name).text); + if (!bindingElement) return undefined; + + const typeOfPattern = checker.getTypeAtLocation(bindingElement.parent); + const propSymbol = typeOfPattern && checker.getPropertyOfType(typeOfPattern, (bindingElement.name).text); + if (propSymbol && propSymbol.flags & SymbolFlags.GetAccessor) { + // See GH#16922 + Debug.assert(!!(propSymbol.flags & SymbolFlags.Transient)); + return (propSymbol as TransientSymbol).target; } - return undefined; + return propSymbol; } /** diff --git a/tests/cases/fourslash/findAllRefsDestructureGetter.ts b/tests/cases/fourslash/findAllRefsDestructureGetter.ts new file mode 100644 index 0000000000000..00f1e2aaa004d --- /dev/null +++ b/tests/cases/fourslash/findAllRefsDestructureGetter.ts @@ -0,0 +1,14 @@ +/// + +////class Test { +//// get [|{| "isDefinition": true, "isWriteAccess": true |}x|]() { return 0; } +////} +////const { [|{| "isDefinition": true, "isWriteAccess": true |}x|] } = new Test(); +////[|x|]; + +const [r0, r1, r2] = test.ranges(); +verify.referenceGroups(r0, [{ definition: "(property) Test.x: number", ranges: [r0, r1, r2] }]); +verify.referenceGroups([r1, r2], [ + { definition: "(property) Test.x: number", ranges: [r0] }, + { definition: "const x: number", ranges: [r1, r2] } +]); From da64b3c45fd9d18b6b02543856d00e697690daea Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 28 Jul 2017 15:46:24 -0700 Subject: [PATCH 2/3] Handle setter too --- src/services/findAllReferences.ts | 2 +- .../fourslash/findAllRefsDestructureGetter.ts | 22 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 5bcb87426f637..2dc0cbaef7bef 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -608,7 +608,7 @@ namespace ts.FindAllReferences.Core { const typeOfPattern = checker.getTypeAtLocation(bindingElement.parent); const propSymbol = typeOfPattern && checker.getPropertyOfType(typeOfPattern, (bindingElement.name).text); - if (propSymbol && propSymbol.flags & SymbolFlags.GetAccessor) { + if (propSymbol && propSymbol.flags & (SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) { // See GH#16922 Debug.assert(!!(propSymbol.flags & SymbolFlags.Transient)); return (propSymbol as TransientSymbol).target; diff --git a/tests/cases/fourslash/findAllRefsDestructureGetter.ts b/tests/cases/fourslash/findAllRefsDestructureGetter.ts index 00f1e2aaa004d..b21e6186eb272 100644 --- a/tests/cases/fourslash/findAllRefsDestructureGetter.ts +++ b/tests/cases/fourslash/findAllRefsDestructureGetter.ts @@ -2,13 +2,21 @@ ////class Test { //// get [|{| "isDefinition": true, "isWriteAccess": true |}x|]() { return 0; } +//// +//// set [|{| "isDefinition": true, "isWriteAccess": true |}y|](a: number) {} ////} -////const { [|{| "isDefinition": true, "isWriteAccess": true |}x|] } = new Test(); -////[|x|]; +////const { [|{| "isDefinition": true, "isWriteAccess": true |}x|], [|{| "isDefinition": true, "isWriteAccess": true |}y|] } = new Test(); +////[|x|]; [|y|]; -const [r0, r1, r2] = test.ranges(); -verify.referenceGroups(r0, [{ definition: "(property) Test.x: number", ranges: [r0, r1, r2] }]); -verify.referenceGroups([r1, r2], [ - { definition: "(property) Test.x: number", ranges: [r0] }, - { definition: "const x: number", ranges: [r1, r2] } +const [x0, y0, x1, y1, x2, y2] = test.ranges(); +verify.referenceGroups(x0, [{ definition: "(property) Test.x: number", ranges: [x0, x1, x2] }]); +verify.referenceGroups([x1, x2], [ + { definition: "(property) Test.x: number", ranges: [x0] }, + { definition: "const x: number", ranges: [x1, x2] }, +]); + +verify.referenceGroups(y0, [{ definition: "(property) Test.y: number", ranges: [y0, y1, y2] }]); +verify.referenceGroups([y1, y2], [ + { definition: "(property) Test.y: number", ranges: [y0] }, + { definition: "const y: number", ranges: [y1, y2] }, ]); From 9b0e512ca458d2ba3e7486deb4c3e30af401cec4 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 1 Aug 2017 09:07:06 -0700 Subject: [PATCH 3/3] Use SymbolFlags.Accessor --- src/services/findAllReferences.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 2dc0cbaef7bef..204de12a10c96 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -608,7 +608,7 @@ namespace ts.FindAllReferences.Core { const typeOfPattern = checker.getTypeAtLocation(bindingElement.parent); const propSymbol = typeOfPattern && checker.getPropertyOfType(typeOfPattern, (bindingElement.name).text); - if (propSymbol && propSymbol.flags & (SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) { + if (propSymbol && propSymbol.flags & SymbolFlags.Accessor) { // See GH#16922 Debug.assert(!!(propSymbol.flags & SymbolFlags.Transient)); return (propSymbol as TransientSymbol).target;