@volar/typescript 2.0.0-alpha.0 → 2.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,20 +3,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decorateLanguageService = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const dedupe_1 = require("./dedupe");
6
- function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
7
- const transformedDiagnostics = new WeakMap();
6
+ const utils_1 = require("./utils");
7
+ const transform_1 = require("./transform");
8
+ function decorateLanguageService(files, languageService) {
9
+ // ignored methods
10
+ const { getNavigationTree, getOutliningSpans, } = languageService;
11
+ languageService.getNavigationTree = (fileName) => {
12
+ const [virtualFile] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
13
+ if (virtualFile) {
14
+ const tree = getNavigationTree(fileName);
15
+ tree.childItems = undefined;
16
+ return tree;
17
+ }
18
+ else {
19
+ return getNavigationTree(fileName);
20
+ }
21
+ };
22
+ languageService.getOutliningSpans = (fileName) => {
23
+ const [virtualFile] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
24
+ if (virtualFile) {
25
+ return [];
26
+ }
27
+ else {
28
+ return getOutliningSpans(fileName);
29
+ }
30
+ };
31
+ // methods
8
32
  const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getImplementationAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
9
33
  languageService.prepareCallHierarchy = (fileName, position) => {
10
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
34
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
11
35
  if (virtualFile) {
12
36
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
13
37
  if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
14
- const item = prepareCallHierarchy(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0));
38
+ const item = prepareCallHierarchy(fileName, generateOffset + sourceFile.snapshot.getLength());
15
39
  if (Array.isArray(item)) {
16
- return item.map(item => transformCallHierarchyItem(item, language_core_1.isCallHierarchyEnabled));
40
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled));
17
41
  }
18
42
  else if (item) {
19
- return transformCallHierarchyItem(item, language_core_1.isCallHierarchyEnabled);
43
+ return (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled);
20
44
  }
21
45
  }
22
46
  }
@@ -27,11 +51,11 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
27
51
  };
28
52
  languageService.provideCallHierarchyIncomingCalls = (fileName, position) => {
29
53
  let calls = [];
30
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
54
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
31
55
  if (virtualFile) {
32
56
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
33
57
  if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
34
- calls = provideCallHierarchyIncomingCalls(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0));
58
+ calls = provideCallHierarchyIncomingCalls(fileName, generateOffset + sourceFile.snapshot.getLength());
35
59
  }
36
60
  }
37
61
  }
@@ -40,10 +64,10 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
40
64
  }
41
65
  return calls
42
66
  .map(call => {
43
- const from = transformCallHierarchyItem(call.from, language_core_1.isCallHierarchyEnabled);
67
+ const from = (0, transform_1.transformCallHierarchyItem)(files, call.from, language_core_1.isCallHierarchyEnabled);
44
68
  const fromSpans = call.fromSpans
45
- .map(span => transformSpan(call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
46
- .filter(notEmpty);
69
+ .map(span => (0, transform_1.transformSpan)(files, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
70
+ .filter(utils_1.notEmpty);
47
71
  return {
48
72
  from,
49
73
  fromSpans,
@@ -52,11 +76,11 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
52
76
  };
53
77
  languageService.provideCallHierarchyOutgoingCalls = (fileName, position) => {
54
78
  let calls = [];
55
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
79
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
56
80
  if (virtualFile) {
57
81
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
58
82
  if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
59
- calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0));
83
+ calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset + sourceFile.snapshot.getLength());
60
84
  }
61
85
  }
62
86
  }
@@ -65,10 +89,10 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
65
89
  }
66
90
  return calls
67
91
  .map(call => {
68
- const to = transformCallHierarchyItem(call.to, language_core_1.isCallHierarchyEnabled);
92
+ const to = (0, transform_1.transformCallHierarchyItem)(files, call.to, language_core_1.isCallHierarchyEnabled);
69
93
  const fromSpans = call.fromSpans
70
- .map(span => transformSpan(fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
71
- .filter(notEmpty);
94
+ .map(span => (0, transform_1.transformSpan)(files, fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
95
+ .filter(utils_1.notEmpty);
72
96
  return {
73
97
  to,
74
98
  fromSpans,
@@ -78,18 +102,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
78
102
  languageService.organizeImports = (args, formatOptions, preferences) => {
79
103
  const unresolved = organizeImports(args, formatOptions, preferences);
80
104
  const resolved = unresolved
81
- .map(changes => transformFileTextChanges(changes, language_core_1.isCodeActionsEnabled))
82
- .filter(notEmpty);
105
+ .map(changes => (0, transform_1.transformFileTextChanges)(files, changes, language_core_1.isCodeActionsEnabled))
106
+ .filter(utils_1.notEmpty);
83
107
  return resolved;
84
108
  };
85
109
  languageService.getQuickInfoAtPosition = (fileName, position) => {
86
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
110
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
87
111
  if (virtualFile) {
88
112
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
89
113
  if ((0, language_core_1.isHoverEnabled)(mapping.data)) {
90
- const result = getQuickInfoAtPosition(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0));
114
+ const result = getQuickInfoAtPosition(fileName, generateOffset + sourceFile.snapshot.getLength());
91
115
  if (result) {
92
- const textSpan = transformSpan(fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
116
+ const textSpan = (0, transform_1.transformSpan)(files, fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
93
117
  if (textSpan) {
94
118
  return {
95
119
  ...result,
@@ -119,30 +143,30 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
119
143
  ...highlights,
120
144
  highlightSpans: highlights.highlightSpans
121
145
  .map(span => {
122
- const textSpan = transformSpan(span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
146
+ const textSpan = (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
123
147
  if (textSpan) {
124
148
  return {
125
149
  ...span,
126
- contextSpan: transformSpan(span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
150
+ contextSpan: (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
127
151
  textSpan,
128
152
  };
129
153
  }
130
154
  })
131
- .filter(notEmpty),
155
+ .filter(utils_1.notEmpty),
132
156
  };
133
157
  });
134
158
  return resolved;
135
159
  };
136
160
  languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
137
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
161
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
138
162
  if (virtualFile) {
139
163
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
140
164
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
141
165
  const por = typeof positionOrRange === 'number'
142
- ? generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0)
166
+ ? generateOffset + sourceFile.snapshot.getLength()
143
167
  : {
144
- pos: generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0),
145
- end: generateOffset + positionOrRange.end - positionOrRange.pos + (isTsPlugin ? sourceFile.snapshot.getLength() : 0),
168
+ pos: generateOffset + sourceFile.snapshot.getLength(),
169
+ end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceFile.snapshot.getLength(),
146
170
  };
147
171
  return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
148
172
  }
@@ -155,15 +179,15 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
155
179
  };
156
180
  languageService.getEditsForRefactor = (fileName, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
157
181
  let edits;
158
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
182
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
159
183
  if (virtualFile) {
160
184
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
161
185
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
162
186
  const por = typeof positionOrRange === 'number'
163
- ? generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0)
187
+ ? generateOffset + sourceFile.snapshot.getLength()
164
188
  : {
165
- pos: generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0),
166
- end: generateOffset + positionOrRange.end - positionOrRange.pos + (isTsPlugin ? sourceFile.snapshot.getLength() : 0),
189
+ pos: generateOffset + sourceFile.snapshot.getLength(),
190
+ end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceFile.snapshot.getLength(),
167
191
  };
168
192
  edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
169
193
  }
@@ -174,19 +198,19 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
174
198
  }
175
199
  if (edits) {
176
200
  edits.edits = edits.edits
177
- .map(edit => transformFileTextChanges(edit, language_core_1.isCodeActionsEnabled))
178
- .filter(notEmpty);
201
+ .map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled))
202
+ .filter(utils_1.notEmpty);
179
203
  return edits;
180
204
  }
181
205
  };
182
206
  languageService.getRenameInfo = (fileName, position, options) => {
183
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
207
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
184
208
  if (virtualFile) {
185
209
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
186
210
  if ((0, language_core_1.isRenameEnabled)(mapping.data)) {
187
- const info = getRenameInfo(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0), options);
211
+ const info = getRenameInfo(fileName, generateOffset + sourceFile.snapshot.getLength(), options);
188
212
  if (info.canRename) {
189
- const span = transformSpan(fileName, info.triggerSpan, language_core_1.isRenameEnabled);
213
+ const span = (0, transform_1.transformSpan)(files, fileName, info.triggerSpan, language_core_1.isRenameEnabled);
190
214
  if (span) {
191
215
  info.triggerSpan = span.textSpan;
192
216
  return info;
@@ -208,15 +232,17 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
208
232
  };
209
233
  languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
210
234
  let fixes = [];
211
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
235
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
212
236
  if (virtualFile) {
213
237
  for (const [generateStart, mapping] of map.getGeneratedOffsets(start)) {
214
238
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
215
239
  for (const [generateEnd, mapping] of map.getGeneratedOffsets(end)) {
216
240
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
217
- fixes = getCodeFixesAtPosition(fileName, generateStart + (isTsPlugin ? sourceFile.snapshot.getLength() : 0), generateEnd + (isTsPlugin ? sourceFile.snapshot.getLength() : 0), errorCodes, formatOptions, preferences);
241
+ fixes = getCodeFixesAtPosition(fileName, generateStart + sourceFile.snapshot.getLength(), generateEnd + sourceFile.snapshot.getLength(), errorCodes, formatOptions, preferences);
242
+ break;
218
243
  }
219
244
  }
245
+ break;
220
246
  }
221
247
  }
222
248
  }
@@ -224,13 +250,13 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
224
250
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
225
251
  }
226
252
  fixes = fixes.map(fix => {
227
- fix.changes = fix.changes.map(edit => transformFileTextChanges(edit, language_core_1.isCodeActionsEnabled)).filter(notEmpty);
253
+ fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
228
254
  return fix;
229
255
  });
230
256
  return fixes;
231
257
  };
232
258
  languageService.getEncodedSemanticClassifications = (fileName, span, format) => {
233
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
259
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
234
260
  if (virtualFile) {
235
261
  let start;
236
262
  let end;
@@ -246,16 +272,14 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
246
272
  start = 0;
247
273
  end = 0;
248
274
  }
249
- if (isTsPlugin) {
250
- start += sourceFile.snapshot.getLength();
251
- end += sourceFile.snapshot.getLength();
252
- }
275
+ start += sourceFile.snapshot.getLength();
276
+ end += sourceFile.snapshot.getLength();
253
277
  const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
254
278
  const spans = [];
255
279
  for (let i = 0; i < result.spans.length; i += 3) {
256
- for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
280
+ for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] - sourceFile.snapshot.getLength())) {
257
281
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
258
- for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
282
+ for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] - sourceFile.snapshot.getLength())) {
259
283
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
260
284
  spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
261
285
  break;
@@ -274,18 +298,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
274
298
  };
275
299
  languageService.getSyntacticDiagnostics = (fileName) => {
276
300
  return getSyntacticDiagnostics(fileName)
277
- .map(diagnostic => transformDiagnostic(diagnostic))
278
- .filter(notEmpty);
301
+ .map(d => (0, transform_1.transformDiagnostic)(files, d))
302
+ .filter(utils_1.notEmpty);
279
303
  };
280
304
  languageService.getSemanticDiagnostics = (fileName) => {
281
305
  return getSemanticDiagnostics(fileName)
282
- .map(diagnostic => transformDiagnostic(diagnostic))
283
- .filter(notEmpty);
306
+ .map(d => (0, transform_1.transformDiagnostic)(files, d))
307
+ .filter(utils_1.notEmpty);
284
308
  };
285
309
  languageService.getSuggestionDiagnostics = (fileName) => {
286
310
  return getSuggestionDiagnostics(fileName)
287
- .map(diagnostic => transformDiagnostic(diagnostic))
288
- .filter(notEmpty);
311
+ .map(d => (0, transform_1.transformDiagnostic)(files, d))
312
+ .filter(utils_1.notEmpty);
289
313
  };
290
314
  languageService.getDefinitionAndBoundSpan = (fileName, position) => {
291
315
  const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAndBoundSpan(fileName, position), function* (result) {
@@ -294,15 +318,15 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
294
318
  }
295
319
  });
296
320
  const textSpan = unresolved
297
- .map(s => transformSpan(fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
298
- .filter(notEmpty)[0];
321
+ .map(s => (0, transform_1.transformSpan)(files, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
322
+ .filter(utils_1.notEmpty)[0];
299
323
  if (!textSpan)
300
324
  return;
301
325
  const definitions = unresolved
302
326
  .map(s => s.definitions
303
- ?.map(s => transformDocumentSpan(s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
304
- .filter(notEmpty))
305
- .filter(notEmpty)
327
+ ?.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
328
+ .filter(utils_1.notEmpty))
329
+ .filter(utils_1.notEmpty)
306
330
  .flat();
307
331
  return {
308
332
  textSpan,
@@ -320,17 +344,17 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
320
344
  const resolved = unresolved
321
345
  .flat()
322
346
  .map(symbol => {
323
- const definition = transformDocumentSpan(symbol.definition, language_core_1.isDefinitionEnabled);
347
+ const definition = (0, transform_1.transformDocumentSpan)(files, symbol.definition, language_core_1.isDefinitionEnabled);
324
348
  if (definition) {
325
349
  return {
326
350
  definition,
327
351
  references: symbol.references
328
- .map(r => transformDocumentSpan(r, language_core_1.isReferencesEnabled))
329
- .filter(notEmpty),
352
+ .map(r => (0, transform_1.transformDocumentSpan)(files, r, language_core_1.isReferencesEnabled))
353
+ .filter(utils_1.notEmpty),
330
354
  };
331
355
  }
332
356
  })
333
- .filter(notEmpty);
357
+ .filter(utils_1.notEmpty);
334
358
  return (0, dedupe_1.dedupeReferencedSymbols)(resolved);
335
359
  };
336
360
  languageService.getDefinitionAtPosition = (fileName, position) => {
@@ -341,8 +365,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
341
365
  });
342
366
  const resolved = unresolved
343
367
  .flat()
344
- .map(s => transformDocumentSpan(s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
345
- .filter(notEmpty);
368
+ .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
369
+ .filter(utils_1.notEmpty);
346
370
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
347
371
  };
348
372
  languageService.getTypeDefinitionAtPosition = (fileName, position) => {
@@ -353,8 +377,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
353
377
  });
354
378
  const resolved = unresolved
355
379
  .flat()
356
- .map(s => transformDocumentSpan(s, language_core_1.isTypeDefinitionEnabled))
357
- .filter(notEmpty);
380
+ .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isTypeDefinitionEnabled))
381
+ .filter(utils_1.notEmpty);
358
382
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
359
383
  };
360
384
  languageService.getImplementationAtPosition = (fileName, position) => {
@@ -365,8 +389,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
365
389
  });
366
390
  const resolved = unresolved
367
391
  .flat()
368
- .map(s => transformDocumentSpan(s, language_core_1.isImplementationEnabled))
369
- .filter(notEmpty);
392
+ .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isImplementationEnabled))
393
+ .filter(utils_1.notEmpty);
370
394
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
371
395
  };
372
396
  languageService.findRenameLocations = (fileName, position, findInStrings, findInComments, preferences) => {
@@ -377,8 +401,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
377
401
  });
378
402
  const resolved = unresolved
379
403
  .flat()
380
- .map(s => transformDocumentSpan(s, language_core_1.isRenameEnabled))
381
- .filter(notEmpty);
404
+ .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isRenameEnabled))
405
+ .filter(utils_1.notEmpty);
382
406
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
383
407
  };
384
408
  languageService.getReferencesAtPosition = (fileName, position) => {
@@ -389,23 +413,23 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
389
413
  });
390
414
  const resolved = unresolved
391
415
  .flat()
392
- .map(s => transformDocumentSpan(s, language_core_1.isReferencesEnabled))
393
- .filter(notEmpty);
416
+ .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
417
+ .filter(utils_1.notEmpty);
394
418
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
395
419
  };
396
- // need client patch
397
420
  languageService.getCompletionsAtPosition = (fileName, position, options, formattingSettings) => {
398
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
421
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
399
422
  if (virtualFile) {
400
423
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
401
424
  if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
402
- const result = getCompletionsAtPosition(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0), options, formattingSettings);
425
+ const result = getCompletionsAtPosition(fileName, generateOffset + sourceFile.snapshot.getLength(), options, formattingSettings);
403
426
  if (result) {
404
427
  for (const entry of result.entries) {
405
- entry.replacementSpan = transformSpan(fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
428
+ entry.replacementSpan = (0, transform_1.transformSpan)(files, fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
406
429
  }
407
- result.optionalReplacementSpan = transformSpan(fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
430
+ result.optionalReplacementSpan = (0, transform_1.transformSpan)(files, fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
408
431
  }
432
+ return result;
409
433
  }
410
434
  }
411
435
  }
@@ -414,16 +438,28 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
414
438
  }
415
439
  };
416
440
  languageService.getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
417
- const details = getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data);
441
+ let details;
442
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
443
+ if (virtualFile) {
444
+ for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
445
+ if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
446
+ details = getCompletionEntryDetails(fileName, generateOffset + sourceFile.snapshot.getLength(), entryName, formatOptions, source, preferences, data);
447
+ break;
448
+ }
449
+ }
450
+ }
451
+ else {
452
+ return getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data);
453
+ }
418
454
  if (details?.codeActions) {
419
455
  for (const codeAction of details.codeActions) {
420
- codeAction.changes = codeAction.changes.map(edit => transformFileTextChanges(edit, language_core_1.isCodeLensEnabled)).filter(notEmpty);
456
+ codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
421
457
  }
422
458
  }
423
459
  return details;
424
460
  };
425
461
  languageService.provideInlayHints = (fileName, span, preferences) => {
426
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
462
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
427
463
  if (virtualFile) {
428
464
  let start;
429
465
  let end;
@@ -439,14 +475,12 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
439
475
  start = 0;
440
476
  end = 0;
441
477
  }
442
- if (isTsPlugin) {
443
- start += sourceFile.snapshot.getLength();
444
- end += sourceFile.snapshot.getLength();
445
- }
478
+ start += sourceFile.snapshot.getLength();
479
+ end += sourceFile.snapshot.getLength();
446
480
  const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
447
481
  const hints = [];
448
482
  for (const hint of result) {
449
- for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
483
+ for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position - sourceFile.snapshot.getLength())) {
450
484
  if ((0, language_core_1.isInlayHintsEnabled)(mapping.data)) {
451
485
  hints.push({
452
486
  ...hint,
@@ -465,18 +499,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
465
499
  languageService.getFileReferences = (fileName) => {
466
500
  const unresolved = getFileReferences(fileName);
467
501
  const resolved = unresolved
468
- .map(s => transformDocumentSpan(s, language_core_1.isReferencesEnabled))
469
- .filter(notEmpty);
502
+ .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
503
+ .filter(utils_1.notEmpty);
470
504
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
471
505
  };
472
506
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
473
507
  let results = [];
474
508
  const processedFilePositions = new Set();
475
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
509
+ const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
476
510
  if (virtualFile) {
477
511
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
478
512
  if (filter(mapping.data)) {
479
- process(fileName, generateOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0));
513
+ process(fileName, generateOffset + sourceFile.snapshot.getLength());
480
514
  }
481
515
  }
482
516
  }
@@ -494,167 +528,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
494
528
  results = results.concat(result);
495
529
  for (const ref of getLinkedCodes(result)) {
496
530
  processedFilePositions.add(ref[0] + ':' + ref[1]);
497
- const [virtualFile, sourceFile] = getVirtualFileAndMap(ref[0]);
531
+ const [virtualFile, sourceFile] = (0, utils_1.getVirtualFileAndMap)(files, ref[0]);
498
532
  if (!virtualFile)
499
533
  continue;
500
- const linkedCodeMap = virtualFiles.getLinkedCodeMap(virtualFile);
534
+ const linkedCodeMap = files.getLinkedCodeMap(virtualFile);
501
535
  if (!linkedCodeMap)
502
536
  continue;
503
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
504
- process(ref[0], linkedCodeOffset + (isTsPlugin ? sourceFile.snapshot.getLength() : 0));
505
- }
506
- }
507
- }
508
- }
509
- // transforms
510
- function transformCallHierarchyItem(item, filter) {
511
- const span = transformSpan(item.file, item.span, filter);
512
- const selectionSpan = transformSpan(item.file, item.selectionSpan, filter);
513
- return {
514
- ...item,
515
- span: span?.textSpan ?? { start: 0, length: 0 },
516
- selectionSpan: selectionSpan?.textSpan ?? { start: 0, length: 0 },
517
- };
518
- }
519
- function transformDiagnostic(diagnostic) {
520
- if (!transformedDiagnostics.has(diagnostic)) {
521
- if (diagnostic.start !== undefined && diagnostic.file) {
522
- transformedDiagnostics.set(diagnostic, undefined);
523
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(diagnostic.file?.fileName);
524
- if (virtualFile) {
525
- for (const [sourceOffset, mapping] of map.getSourceOffsets(diagnostic.start - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
526
- if ((0, language_core_1.shouldReportDiagnostics)(mapping.data)) {
527
- transformedDiagnostics.set(diagnostic, {
528
- ...diagnostic,
529
- start: sourceOffset,
530
- });
531
- break;
532
- }
533
- }
534
- }
535
- else {
536
- transformedDiagnostics.set(diagnostic, diagnostic);
537
+ for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceFile.snapshot.getLength())) {
538
+ process(ref[0], linkedCodeOffset + sourceFile.snapshot.getLength());
537
539
  }
538
540
  }
539
- else {
540
- transformedDiagnostics.set(diagnostic, diagnostic);
541
- }
542
- if (diagnostic.relatedInformation) {
543
- diagnostic.relatedInformation = diagnostic.relatedInformation
544
- .map(transformDiagnostic)
545
- .filter(notEmpty);
546
- }
547
541
  }
548
- return transformedDiagnostics.get(diagnostic);
549
- }
550
- function transformFileTextChanges(changes, filter) {
551
- const [_, source] = getVirtualFileAndMap(changes.fileName);
552
- if (source) {
553
- return {
554
- ...changes,
555
- fileName: source.id,
556
- textChanges: changes.textChanges.map(c => {
557
- const span = transformSpan(changes.fileName, c.span, filter);
558
- if (span) {
559
- return {
560
- ...c,
561
- span: span.textSpan,
562
- };
563
- }
564
- }).filter(notEmpty),
565
- };
566
- }
567
- else {
568
- return changes;
569
- }
570
- }
571
- function transformDocumentSpan(documentSpan, filter, shouldFallback) {
572
- let textSpan = transformSpan(documentSpan.fileName, documentSpan.textSpan, filter);
573
- if (!textSpan && shouldFallback) {
574
- const [virtualFile, source] = getVirtualFileAndMap(documentSpan.fileName);
575
- if (virtualFile) {
576
- textSpan = {
577
- fileName: source.id,
578
- textSpan: { start: 0, length: 0 },
579
- };
580
- }
581
- }
582
- if (!textSpan)
583
- return;
584
- const contextSpan = transformSpan(documentSpan.fileName, documentSpan.contextSpan, filter);
585
- const originalTextSpan = transformSpan(documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
586
- const originalContextSpan = transformSpan(documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
587
- return {
588
- ...documentSpan,
589
- fileName: textSpan.fileName,
590
- textSpan: textSpan.textSpan,
591
- contextSpan: contextSpan?.textSpan,
592
- originalFileName: originalTextSpan?.fileName,
593
- originalTextSpan: originalTextSpan?.textSpan,
594
- originalContextSpan: originalContextSpan?.textSpan,
595
- };
596
- }
597
- function transformSpan(fileName, textSpan, filter) {
598
- if (!fileName)
599
- return;
600
- if (!textSpan)
601
- return;
602
- const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
603
- if (virtualFile) {
604
- for (const sourceStart of map.getSourceOffsets(textSpan.start - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
605
- if (filter(sourceStart[1].data)) {
606
- for (const sourceEnd of map.getSourceOffsets(textSpan.start + textSpan.length - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
607
- if (filter(sourceEnd[1].data)) {
608
- return {
609
- fileName: sourceFile.id,
610
- textSpan: {
611
- start: sourceStart[0],
612
- length: sourceEnd[0] - sourceStart[0],
613
- },
614
- };
615
- }
616
- }
617
- }
618
- }
619
- }
620
- else {
621
- return {
622
- fileName,
623
- textSpan,
624
- };
625
- }
626
- }
627
- function getVirtualFileAndMap(fileName) {
628
- if (isTsPlugin) {
629
- const sourceFile = virtualFiles.getSourceFile(fileName);
630
- if (sourceFile?.virtualFile) {
631
- for (const virtualFile of (0, language_core_1.forEachEmbeddedFile)(sourceFile.virtualFile[0])) {
632
- const ext = virtualFile.id.substring(fileName.length);
633
- if (virtualFile.typescript && (ext === '.d.ts' || ext.match(/^\.(js|ts)x?$/))) {
634
- for (const map of virtualFiles.getMaps(virtualFile)) {
635
- if (map[1][0] === sourceFile.snapshot) {
636
- return [virtualFile, sourceFile, map[1][1]];
637
- }
638
- }
639
- }
640
- }
641
- }
642
- }
643
- else {
644
- const [virtualFile, sourceFile] = virtualFiles.getVirtualFile(fileName);
645
- if (virtualFile) {
646
- for (const map of virtualFiles.getMaps(virtualFile)) {
647
- if (map[1][0] === sourceFile.snapshot) {
648
- return [virtualFile, sourceFile, map[1][1]];
649
- }
650
- }
651
- }
652
- }
653
- return [undefined, undefined, undefined];
654
542
  }
655
543
  }
656
544
  exports.decorateLanguageService = decorateLanguageService;
657
- function notEmpty(value) {
658
- return value !== null && value !== undefined;
659
- }
660
545
  //# sourceMappingURL=decorateLanguageService.js.map