1namespace ts.projectSystem { 2 describe("unittests:: tsserver:: getExportReferences", () => { 3 const exportVariable = "export const value = 0;"; 4 const exportArrayDestructured = "export const [valueA, valueB] = [0, 1];"; 5 const exportObjectDestructured = "export const { valueC, valueD: renamedD } = { valueC: 0, valueD: 1 };"; 6 const exportNestedObject = "export const { nest: [valueE, { valueF }] } = { nest: [0, { valueF: 1 }] };"; 7 8 const mainTs: File = { 9 path: "/main.ts", 10 content: 'import { value, valueA, valueB, valueC, renamedD, valueE, valueF } from "./mod";', 11 }; 12 const modTs: File = { 13 path: "/mod.ts", 14 content: `${exportVariable} 15${exportArrayDestructured} 16${exportObjectDestructured} 17${exportNestedObject} 18`, 19 }; 20 const tsconfig: File = { 21 path: "/tsconfig.json", 22 content: "{}", 23 }; 24 25 function makeSampleSession() { 26 const host = createServerHost([mainTs, modTs, tsconfig]); 27 const session = createSession(host); 28 openFilesForSession([mainTs, modTs], session); 29 return session; 30 } 31 32 const referenceMainTs = (mainTs: File, text: string): protocol.ReferencesResponseItem => 33 makeReferenceItem({ 34 file: mainTs, 35 isDefinition: false, 36 isWriteAccess: true, 37 lineText: mainTs.content, 38 contextText: mainTs.content, 39 text, 40 }); 41 42 const referenceModTs = ( 43 texts: { text: string; lineText: string; contextText?: string }, 44 override: Partial<MakeReferenceItem> = {}, 45 ): protocol.ReferencesResponseItem => 46 makeReferenceItem({ 47 file: modTs, 48 isDefinition: true, 49 ...texts, 50 ...override, 51 }); 52 53 it("should get const variable declaration references", () => { 54 const session = makeSampleSession(); 55 56 const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>( 57 session, 58 protocol.CommandTypes.References, 59 protocolFileLocationFromSubstring(modTs, "value"), 60 ); 61 62 const expectResponse = { 63 refs: [ 64 referenceModTs({ text: "value", lineText: exportVariable, contextText: exportVariable }), 65 referenceMainTs(mainTs, "value"), 66 ], 67 symbolDisplayString: "const value: 0", 68 symbolName: "value", 69 symbolStartOffset: protocolLocationFromSubstring(modTs.content, "value").offset, 70 }; 71 72 assert.deepEqual(response, expectResponse); 73 }); 74 75 it("should get array destructuring declaration references", () => { 76 const session = makeSampleSession(); 77 const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>( 78 session, 79 protocol.CommandTypes.References, 80 protocolFileLocationFromSubstring(modTs, "valueA"), 81 ); 82 83 const expectResponse = { 84 refs: [ 85 referenceModTs({ 86 text: "valueA", 87 lineText: exportArrayDestructured, 88 contextText: exportArrayDestructured, 89 }), 90 referenceMainTs(mainTs, "valueA"), 91 ], 92 symbolDisplayString: "const valueA: number", 93 symbolName: "valueA", 94 symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueA").offset, 95 }; 96 97 assert.deepEqual(response, expectResponse); 98 }); 99 100 it("should get object destructuring declaration references", () => { 101 const session = makeSampleSession(); 102 const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>( 103 session, 104 protocol.CommandTypes.References, 105 protocolFileLocationFromSubstring(modTs, "valueC"), 106 ); 107 const expectResponse = { 108 refs: [ 109 referenceModTs({ 110 text: "valueC", 111 lineText: exportObjectDestructured, 112 contextText: exportObjectDestructured, 113 }), 114 referenceMainTs(mainTs, "valueC"), 115 referenceModTs( 116 { text: "valueC", lineText: exportObjectDestructured, contextText: "valueC: 0" }, 117 { 118 options: { index: 1 }, 119 isDefinition: false, 120 isWriteAccess: true, 121 }), 122 ], 123 symbolDisplayString: "const valueC: number", 124 symbolName: "valueC", 125 symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueC").offset, 126 }; 127 128 assert.deepEqual(response, expectResponse); 129 }); 130 131 it("should get object declaration references that renames destructured property", () => { 132 const session = makeSampleSession(); 133 const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>( 134 session, 135 protocol.CommandTypes.References, 136 protocolFileLocationFromSubstring(modTs, "renamedD"), 137 ); 138 139 const expectResponse = { 140 refs: [ 141 referenceModTs({ 142 text: "renamedD", 143 lineText: exportObjectDestructured, 144 contextText: exportObjectDestructured, 145 }), 146 referenceMainTs(mainTs, "renamedD"), 147 ], 148 symbolDisplayString: "const renamedD: number", 149 symbolName: "renamedD", 150 symbolStartOffset: protocolLocationFromSubstring(modTs.content, "renamedD").offset, 151 }; 152 153 assert.deepEqual(response, expectResponse); 154 }); 155 156 it("should get nested object declaration references", () => { 157 const session = makeSampleSession(); 158 const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>( 159 session, 160 protocol.CommandTypes.References, 161 protocolFileLocationFromSubstring(modTs, "valueF"), 162 ); 163 164 const expectResponse = { 165 refs: [ 166 referenceModTs({ 167 text: "valueF", 168 lineText: exportNestedObject, 169 contextText: exportNestedObject, 170 }), 171 referenceMainTs(mainTs, "valueF"), 172 referenceModTs( 173 { 174 text: "valueF", 175 lineText: exportNestedObject, 176 contextText: "valueF: 1", 177 }, 178 { 179 options: { index: 1 }, 180 isDefinition: false, 181 isWriteAccess: true, 182 }, 183 ), 184 ], 185 symbolDisplayString: "const valueF: number", 186 symbolName: "valueF", 187 symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueF").offset, 188 }; 189 190 assert.deepEqual(response, expectResponse); 191 }); 192 }); 193} 194