@volar/typescript 2.2.0-alpha.0 → 2.2.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.
@@ -0,0 +1,2 @@
1
+ import type * as ts from 'typescript';
2
+ export declare function getDocumentRegistry(ts: typeof import('typescript'), useCaseSensitiveFileNames: boolean, currentDirectory: string): ts.DocumentRegistry;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDocumentRegistry = void 0;
4
+ const documentRegistries = [];
5
+ function getDocumentRegistry(ts, useCaseSensitiveFileNames, currentDirectory) {
6
+ let documentRegistry = documentRegistries.find(item => item[0] === useCaseSensitiveFileNames && item[1] === currentDirectory)?.[2];
7
+ if (!documentRegistry) {
8
+ documentRegistry = ts.createDocumentRegistry(useCaseSensitiveFileNames, currentDirectory);
9
+ documentRegistries.push([useCaseSensitiveFileNames, currentDirectory, documentRegistry]);
10
+ }
11
+ return documentRegistry;
12
+ }
13
+ exports.getDocumentRegistry = getDocumentRegistry;
14
+ //# sourceMappingURL=documentRegistry.js.map
@@ -29,19 +29,92 @@ function decorateLanguageService(language, languageService) {
29
29
  }
30
30
  };
31
31
  // methods
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;
32
+ const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getSignatureHelpItems, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
33
+ languageService.getFormattingEditsForDocument = (fileName, options) => {
34
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
35
+ if (serviceScript) {
36
+ if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
37
+ return [];
38
+ }
39
+ const edits = getFormattingEditsForDocument(fileName, options);
40
+ return edits
41
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
42
+ .filter(utils_1.notEmpty);
43
+ }
44
+ else {
45
+ return getFormattingEditsForDocument(fileName, options);
46
+ }
47
+ };
48
+ languageService.getFormattingEditsForRange = (fileName, start, end, options) => {
49
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
50
+ if (serviceScript) {
51
+ const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
52
+ const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
53
+ if (generateStart !== undefined && generateEnd !== undefined) {
54
+ const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
55
+ return edits
56
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
57
+ .filter(utils_1.notEmpty);
58
+ }
59
+ return [];
60
+ }
61
+ else {
62
+ return getFormattingEditsForRange(fileName, start, end, options);
63
+ }
64
+ };
65
+ languageService.getFormattingEditsAfterKeystroke = (fileName, position, key, options) => {
66
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
67
+ if (serviceScript) {
68
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
69
+ if (generatePosition !== undefined) {
70
+ const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
71
+ return edits
72
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
73
+ .filter(utils_1.notEmpty);
74
+ }
75
+ return [];
76
+ }
77
+ else {
78
+ return getFormattingEditsAfterKeystroke(fileName, position, key, options);
79
+ }
80
+ };
81
+ languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
82
+ const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
83
+ return edits
84
+ .map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
85
+ .filter(utils_1.notEmpty);
86
+ };
87
+ languageService.getLinkedEditingRangeAtPosition = (fileName, position) => {
88
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
89
+ if (serviceScript) {
90
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
91
+ if (generatePosition !== undefined) {
92
+ const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
93
+ if (info) {
94
+ return {
95
+ ranges: info.ranges
96
+ .map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
97
+ .filter(utils_1.notEmpty),
98
+ wordPattern: info.wordPattern,
99
+ };
100
+ }
101
+ }
102
+ }
103
+ else {
104
+ return getLinkedEditingRangeAtPosition(fileName, position);
105
+ }
106
+ };
33
107
  languageService.prepareCallHierarchy = (fileName, position) => {
34
108
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
35
109
  if (serviceScript) {
36
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
37
- if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
38
- const item = prepareCallHierarchy(fileName, generateOffset + sourceScript.snapshot.getLength());
39
- if (Array.isArray(item)) {
40
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
41
- }
42
- else if (item) {
43
- return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
44
- }
110
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
111
+ if (generatePosition !== undefined) {
112
+ const item = prepareCallHierarchy(fileName, generatePosition);
113
+ if (Array.isArray(item)) {
114
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
115
+ }
116
+ else if (item) {
117
+ return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
45
118
  }
46
119
  }
47
120
  }
@@ -53,10 +126,9 @@ function decorateLanguageService(language, languageService) {
53
126
  let calls = [];
54
127
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
55
128
  if (serviceScript) {
56
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
57
- if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
58
- calls = provideCallHierarchyIncomingCalls(fileName, generateOffset + sourceScript.snapshot.getLength());
59
- }
129
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
130
+ if (generatePosition !== undefined) {
131
+ calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
60
132
  }
61
133
  }
62
134
  else {
@@ -78,10 +150,9 @@ function decorateLanguageService(language, languageService) {
78
150
  let calls = [];
79
151
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
80
152
  if (serviceScript) {
81
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
82
- if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
83
- calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset + sourceScript.snapshot.getLength());
84
- }
153
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
154
+ if (generatePosition !== undefined) {
155
+ calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
85
156
  }
86
157
  }
87
158
  else {
@@ -91,7 +162,9 @@ function decorateLanguageService(language, languageService) {
91
162
  .map(call => {
92
163
  const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
93
164
  const fromSpans = call.fromSpans
94
- .map(span => (0, transform_1.transformSpan)(language, fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
165
+ .map(span => sourceScript
166
+ ? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
167
+ : span)
95
168
  .filter(utils_1.notEmpty);
96
169
  return {
97
170
  to,
@@ -109,17 +182,16 @@ function decorateLanguageService(language, languageService) {
109
182
  languageService.getQuickInfoAtPosition = (fileName, position) => {
110
183
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
111
184
  if (serviceScript) {
112
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
113
- if ((0, language_core_1.isHoverEnabled)(mapping.data)) {
114
- const result = getQuickInfoAtPosition(fileName, generateOffset + sourceScript.snapshot.getLength());
115
- if (result) {
116
- const textSpan = (0, transform_1.transformSpan)(language, fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
117
- if (textSpan) {
118
- return {
119
- ...result,
120
- textSpan,
121
- };
122
- }
185
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isHoverEnabled);
186
+ if (generatePosition !== undefined) {
187
+ const result = getQuickInfoAtPosition(fileName, generatePosition);
188
+ if (result) {
189
+ const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.textSpan, language_core_1.isHoverEnabled);
190
+ if (textSpan) {
191
+ return {
192
+ ...result,
193
+ textSpan,
194
+ };
123
195
  }
124
196
  }
125
197
  }
@@ -128,6 +200,27 @@ function decorateLanguageService(language, languageService) {
128
200
  return getQuickInfoAtPosition(fileName, position);
129
201
  }
130
202
  };
203
+ languageService.getSignatureHelpItems = (fileName, position, options) => {
204
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
205
+ if (serviceScript) {
206
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
207
+ if (generatePosition !== undefined) {
208
+ const result = getSignatureHelpItems(fileName, generatePosition, options);
209
+ if (result) {
210
+ const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
211
+ if (applicableSpan) {
212
+ return {
213
+ ...result,
214
+ applicableSpan,
215
+ };
216
+ }
217
+ }
218
+ }
219
+ }
220
+ else {
221
+ return getSignatureHelpItems(fileName, position, options);
222
+ }
223
+ };
131
224
  languageService.getDocumentHighlights = (fileName, position, filesToSearch) => {
132
225
  const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, position => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
133
226
  for (const ref of result) {
@@ -160,16 +253,15 @@ function decorateLanguageService(language, languageService) {
160
253
  languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
161
254
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
162
255
  if (serviceScript) {
163
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
164
- if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
165
- const por = typeof positionOrRange === 'number'
166
- ? generateOffset + sourceScript.snapshot.getLength()
167
- : {
168
- pos: generateOffset + sourceScript.snapshot.getLength(),
169
- end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceScript.snapshot.getLength(),
170
- };
171
- return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
172
- }
256
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
257
+ if (generatePosition !== undefined) {
258
+ const por = typeof positionOrRange === 'number'
259
+ ? generatePosition
260
+ : {
261
+ pos: generatePosition,
262
+ end: generatePosition + positionOrRange.end - positionOrRange.pos,
263
+ };
264
+ return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
173
265
  }
174
266
  return [];
175
267
  }
@@ -181,16 +273,17 @@ function decorateLanguageService(language, languageService) {
181
273
  let edits;
182
274
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
183
275
  if (serviceScript) {
184
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
185
- if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
186
- const por = typeof positionOrRange === 'number'
187
- ? generateOffset + sourceScript.snapshot.getLength()
188
- : {
189
- pos: generateOffset + sourceScript.snapshot.getLength(),
190
- end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceScript.snapshot.getLength(),
191
- };
192
- edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
193
- }
276
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
277
+ ? positionOrRange
278
+ : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
279
+ if (generatePosition !== undefined) {
280
+ const por = typeof positionOrRange === 'number'
281
+ ? generatePosition
282
+ : {
283
+ pos: generatePosition,
284
+ end: generatePosition + positionOrRange.end - positionOrRange.pos,
285
+ };
286
+ edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
194
287
  }
195
288
  }
196
289
  else {
@@ -206,20 +299,19 @@ function decorateLanguageService(language, languageService) {
206
299
  languageService.getRenameInfo = (fileName, position, options) => {
207
300
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
208
301
  if (serviceScript) {
209
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
210
- if ((0, language_core_1.isRenameEnabled)(mapping.data)) {
211
- const info = getRenameInfo(fileName, generateOffset + sourceScript.snapshot.getLength(), options);
212
- if (info.canRename) {
213
- const span = (0, transform_1.transformSpan)(language, fileName, info.triggerSpan, language_core_1.isRenameEnabled);
214
- if (span) {
215
- info.triggerSpan = span.textSpan;
216
- return info;
217
- }
218
- }
219
- else {
302
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isRenameEnabled);
303
+ if (generatePosition !== undefined) {
304
+ const info = getRenameInfo(fileName, generatePosition, options);
305
+ if (info.canRename) {
306
+ const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
307
+ if (span) {
308
+ info.triggerSpan = span;
220
309
  return info;
221
310
  }
222
311
  }
312
+ else {
313
+ return info;
314
+ }
223
315
  }
224
316
  return {
225
317
  canRename: false,
@@ -234,16 +326,10 @@ function decorateLanguageService(language, languageService) {
234
326
  let fixes = [];
235
327
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
236
328
  if (serviceScript) {
237
- for (const [generateStart, mapping] of map.getGeneratedOffsets(start)) {
238
- if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
239
- for (const [generateEnd, mapping] of map.getGeneratedOffsets(end)) {
240
- if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
241
- fixes = getCodeFixesAtPosition(fileName, generateStart + sourceScript.snapshot.getLength(), generateEnd + sourceScript.snapshot.getLength(), errorCodes, formatOptions, preferences);
242
- break;
243
- }
244
- }
245
- break;
246
- }
329
+ const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
330
+ const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
331
+ if (generateStart !== undefined && generateEnd !== undefined) {
332
+ fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
247
333
  }
248
334
  }
249
335
  else {
@@ -261,32 +347,25 @@ function decorateLanguageService(language, languageService) {
261
347
  let start;
262
348
  let end;
263
349
  for (const mapping of map.mappings) {
350
+ // TODO reuse the logic from language service
264
351
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
265
352
  start ??= mapping.generatedOffsets[0];
266
- end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1];
353
+ end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1];
267
354
  start = Math.min(start, mapping.generatedOffsets[0]);
268
- end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1]);
355
+ end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1]);
269
356
  }
270
357
  }
271
- if (start === undefined || end === undefined) {
272
- start = 0;
273
- end = 0;
274
- }
358
+ start ??= 0;
359
+ end ??= sourceScript.snapshot.getLength();
275
360
  start += sourceScript.snapshot.getLength();
276
361
  end += sourceScript.snapshot.getLength();
277
362
  const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
278
363
  const spans = [];
279
364
  for (let i = 0; i < result.spans.length; i += 3) {
280
- for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] - sourceScript.snapshot.getLength())) {
281
- if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
282
- for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] - sourceScript.snapshot.getLength())) {
283
- if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
284
- spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
285
- break;
286
- }
287
- }
288
- break;
289
- }
365
+ const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
366
+ const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
367
+ if (sourceStart !== undefined && sourceEnd !== undefined) {
368
+ spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
290
369
  }
291
370
  }
292
371
  result.spans = spans;
@@ -298,17 +377,17 @@ function decorateLanguageService(language, languageService) {
298
377
  };
299
378
  languageService.getSyntacticDiagnostics = fileName => {
300
379
  return getSyntacticDiagnostics(fileName)
301
- .map(d => (0, transform_1.transformDiagnostic)(language, d))
380
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
302
381
  .filter(utils_1.notEmpty);
303
382
  };
304
383
  languageService.getSemanticDiagnostics = fileName => {
305
384
  return getSemanticDiagnostics(fileName)
306
- .map(d => (0, transform_1.transformDiagnostic)(language, d))
385
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
307
386
  .filter(utils_1.notEmpty);
308
387
  };
309
388
  languageService.getSuggestionDiagnostics = fileName => {
310
389
  return getSuggestionDiagnostics(fileName)
311
- .map(d => (0, transform_1.transformDiagnostic)(language, d))
390
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
312
391
  .filter(utils_1.notEmpty);
313
392
  };
314
393
  languageService.getDefinitionAndBoundSpan = (fileName, position) => {
@@ -345,18 +424,15 @@ function decorateLanguageService(language, languageService) {
345
424
  const resolved = unresolved
346
425
  .flat()
347
426
  .map(symbol => {
348
- const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled);
349
- if (definition) {
350
- return {
351
- definition,
352
- references: symbol.references
353
- .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
354
- .filter(utils_1.notEmpty),
355
- };
356
- }
357
- })
358
- .filter(utils_1.notEmpty);
359
- return (0, dedupe_1.dedupeReferencedSymbols)(resolved);
427
+ const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
428
+ return {
429
+ definition,
430
+ references: symbol.references
431
+ .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
432
+ .filter(utils_1.notEmpty),
433
+ };
434
+ });
435
+ return resolved;
360
436
  };
361
437
  languageService.getDefinitionAtPosition = (fileName, position) => {
362
438
  const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAtPosition(fileName, position), function* (result) {
@@ -423,24 +499,29 @@ function decorateLanguageService(language, languageService) {
423
499
  if (serviceScript) {
424
500
  let mainResult;
425
501
  let additionalResults = [];
426
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
427
- if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
428
- const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
429
- if (!isAdditional && mainResult) {
430
- continue;
502
+ let isAdditional;
503
+ const generatedOffset = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, data => {
504
+ if (!(0, language_core_1.isCompletionEnabled)(data)) {
505
+ return false;
506
+ }
507
+ isAdditional = typeof data.completion === 'object' && data.completion.isAdditional;
508
+ if (!isAdditional && mainResult) {
509
+ return false;
510
+ }
511
+ return true;
512
+ });
513
+ if (generatedOffset !== undefined) {
514
+ const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
515
+ if (result) {
516
+ for (const entry of result.entries) {
517
+ entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
518
+ }
519
+ result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
520
+ if (isAdditional) {
521
+ additionalResults.push(result);
431
522
  }
432
- const result = getCompletionsAtPosition(fileName, generateOffset + sourceScript.snapshot.getLength(), options, formattingSettings);
433
- if (result) {
434
- for (const entry of result.entries) {
435
- entry.replacementSpan = (0, transform_1.transformSpan)(language, fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
436
- }
437
- result.optionalReplacementSpan = (0, transform_1.transformSpan)(language, fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
438
- if (isAdditional) {
439
- additionalResults.push(result);
440
- }
441
- else {
442
- mainResult = result;
443
- }
523
+ else {
524
+ mainResult = result;
444
525
  }
445
526
  }
446
527
  }
@@ -465,11 +546,9 @@ function decorateLanguageService(language, languageService) {
465
546
  let details;
466
547
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
467
548
  if (serviceScript) {
468
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
469
- if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
470
- details = getCompletionEntryDetails(fileName, generateOffset + sourceScript.snapshot.getLength(), entryName, formatOptions, source, preferences, data);
471
- break;
472
- }
549
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
550
+ if (generatePosition !== undefined) {
551
+ details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
473
552
  }
474
553
  }
475
554
  else {
@@ -504,14 +583,12 @@ function decorateLanguageService(language, languageService) {
504
583
  const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
505
584
  const hints = [];
506
585
  for (const hint of result) {
507
- for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position - sourceScript.snapshot.getLength())) {
508
- if ((0, language_core_1.isInlayHintsEnabled)(mapping.data)) {
509
- hints.push({
510
- ...hint,
511
- position: sourcePosition,
512
- });
513
- break;
514
- }
586
+ const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
587
+ if (sourcePosition !== undefined) {
588
+ hints.push({
589
+ ...hint,
590
+ position: sourcePosition,
591
+ });
515
592
  }
516
593
  }
517
594
  return hints;
@@ -528,13 +605,13 @@ function decorateLanguageService(language, languageService) {
528
605
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
529
606
  };
530
607
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
531
- let results = [];
608
+ const results = [];
532
609
  const processedFilePositions = new Set();
533
610
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
534
611
  if (serviceScript) {
535
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
612
+ for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
536
613
  if (filter(mapping.data)) {
537
- process(fileName, generateOffset + sourceScript.snapshot.getLength());
614
+ process(fileName, generatedOffset + sourceScript.snapshot.getLength());
538
615
  }
539
616
  }
540
617
  }
@@ -551,14 +628,14 @@ function decorateLanguageService(language, languageService) {
551
628
  if (!result) {
552
629
  return;
553
630
  }
554
- results = results.concat(result);
631
+ results.push(result);
555
632
  for (const ref of getLinkedCodes(result)) {
556
633
  processedFilePositions.add(ref[0] + ':' + ref[1]);
557
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
558
- if (!serviceScript) {
634
+ const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
635
+ if (!virtualFile) {
559
636
  continue;
560
637
  }
561
- const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
638
+ const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
562
639
  if (!linkedCodeMap) {
563
640
  continue;
564
641
  }
@@ -1,4 +1,4 @@
1
- import { type Language } from '@volar/language-core';
1
+ import type { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageServiceHost(language: Language, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
3
+ export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language, languageServiceHost: ts.LanguageServiceHost): void;
4
4
  export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];