Skip to content

Commit 85771cf

Browse files
committed
Fixes getting destructured variables references(#31922)
1 parent dae86ad commit 85771cf

File tree

2 files changed

+107
-22
lines changed

2 files changed

+107
-22
lines changed

src/services/importTracker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,12 @@ namespace ts.FindAllReferences {
582582
return p.name !== node ? undefined :
583583
p.parent.kind === SyntaxKind.CatchClause ? undefined : p.parent.parent.kind === SyntaxKind.VariableStatement ? p.parent.parent : undefined;
584584
}
585+
else if (parent.parent && parent.parent.parent && parent.parent.parent.kind === SyntaxKind.VariableDeclaration) {
586+
const p = parent.parent.parent as VariableDeclaration;
587+
const binded = parent as BindingElement;
588+
return binded.name !== node ? undefined :
589+
p.parent.kind === SyntaxKind.CatchClause ? undefined : p.parent.parent.kind === SyntaxKind.VariableStatement ? p.parent.parent : undefined;
590+
}
585591
else {
586592
return parent;
587593
}

src/testRunner/unittests/tsserver/getExportReferences.ts

Lines changed: 101 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,38 @@
11
namespace ts.projectSystem {
22
describe("unittests:: tsserver:: getExportReferences", () => {
3-
it("should get const variable decralation references", () => {
4-
const mainTs: File = {
5-
path: "/main.ts",
6-
content: 'import { value } from "./mod";',
7-
};
8-
const modTs: File = {
9-
path: "/mod.ts",
10-
content: "export const value = 0;",
11-
};
12-
const tsconfig: File = {
13-
path: "/tsconfig.json",
14-
content: "{}",
15-
};
3+
const mainTs: File = {
4+
path: "/main.ts",
5+
content: 'import { value, valueA, valueB, valueC, valueD } from "./mod";',
6+
};
7+
const modTs: File = {
8+
path: "/mod.ts",
9+
content: `export const value = 0;
10+
export const [valueA, valueB] = [0, 1];
11+
export const { valueC, valueD } = { valueC: 0, valueD: 1 };`,
12+
};
13+
const tsconfig: File = {
14+
path: "/tsconfig.json",
15+
content: "{}",
16+
};
1617

18+
function makeSampleSession() {
1719
const host = createServerHost([mainTs, modTs, tsconfig]);
1820
const session = createSession(host);
1921
openFilesForSession([mainTs, modTs], session);
22+
return session;
23+
}
24+
25+
const referenceMainTs = (mainTs: File, text: string): protocol.ReferencesResponseItem =>
26+
makeReferenceItem({
27+
file: mainTs,
28+
isDefinition: true,
29+
lineText: 'import { value, valueA, valueB, valueC, valueD } from "./mod";',
30+
contextText: 'import { value, valueA, valueB, valueC, valueD } from "./mod";',
31+
text,
32+
});
33+
34+
it("should get const variable decralation references", () => {
35+
const session = makeSampleSession();
2036

2137
const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
2238
session,
@@ -32,20 +48,83 @@ namespace ts.projectSystem {
3248
contextText: "export const value = 0;",
3349
text: "value",
3450
});
35-
const referenceMainTs = (mainTs: File): protocol.ReferencesResponseItem =>
51+
const expectResponse = {
52+
refs: [referenceModTs(modTs), referenceMainTs(mainTs, "value")],
53+
symbolDisplayString: "const value: 0",
54+
symbolName: "value",
55+
symbolStartOffset: protocolLocationFromSubstring(modTs.content, "value").offset,
56+
};
57+
58+
assert.deepEqual(response, expectResponse);
59+
});
60+
61+
it("should get array destructuring decralation references", () => {
62+
const session = makeSampleSession();
63+
const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
64+
session,
65+
protocol.CommandTypes.References,
66+
protocolFileLocationFromSubstring(modTs, "valueA"),
67+
);
68+
69+
const referenceModTs = (modTs: File): protocol.ReferencesResponseItem =>
3670
makeReferenceItem({
37-
file: mainTs,
71+
file: modTs,
3872
isDefinition: true,
39-
lineText: 'import { value } from "./mod";',
40-
contextText: 'import { value } from "./mod";',
41-
text: "value",
73+
lineText: "export const [valueA, valueB] = [0, 1];",
74+
contextText: "export const [valueA, valueB] = [0, 1];",
75+
text: "valueA",
4276
});
4377

4478
const expectResponse = {
45-
refs: [referenceModTs(modTs), referenceMainTs(mainTs)],
46-
symbolDisplayString: "const value: 0",
47-
symbolName: "value",
48-
symbolStartOffset: protocolLocationFromSubstring(modTs.content, "value").offset,
79+
refs: [referenceModTs(modTs), referenceMainTs(mainTs, "valueA")],
80+
symbolDisplayString: "const valueA: number",
81+
symbolName: "valueA",
82+
symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueA").offset,
83+
};
84+
85+
assert.deepEqual(response, expectResponse);
86+
});
87+
88+
it("should get object destructuring decralation references", () => {
89+
const session = makeSampleSession();
90+
const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
91+
session,
92+
protocol.CommandTypes.References,
93+
protocolFileLocationFromSubstring(modTs, "valueC"),
94+
);
95+
96+
const referenceModTs = (
97+
modTs: File,
98+
opts: {
99+
contextText: string;
100+
options?: SpanFromSubstringOptions;
101+
contextOptions?: SpanFromSubstringOptions;
102+
},
103+
): protocol.ReferencesResponseItem =>
104+
makeReferenceItem({
105+
file: modTs,
106+
isDefinition: true,
107+
lineText: "export const { valueC, valueD } = { valueC: 0, valueD: 1 };",
108+
contextText: opts.contextText,
109+
text: "valueC",
110+
options: opts.options,
111+
contextOptions: opts.contextOptions,
112+
});
113+
114+
const expectResponse = {
115+
refs: [
116+
referenceModTs(modTs, {
117+
contextText: "export const { valueC, valueD } = { valueC: 0, valueD: 1 };",
118+
}),
119+
referenceMainTs(mainTs, "valueC"),
120+
referenceModTs(modTs, {
121+
contextText: "valueC: 0",
122+
options: { index: 1 },
123+
}),
124+
],
125+
symbolDisplayString: "const valueC: number",
126+
symbolName: "valueC",
127+
symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueC").offset,
49128
};
50129

51130
assert.deepEqual(response, expectResponse);

0 commit comments

Comments
 (0)