@volar/typescript 2.3.0-alpha.8 → 2.3.0-alpha.9

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.
@@ -35,17 +35,18 @@ function decorateLanguageService(language, languageService) {
35
35
  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;
36
36
  languageService.getFormattingEditsForDocument = (filePath, options) => {
37
37
  const fileName = filePath.replace(windowsPathReg, '/');
38
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
38
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
39
39
  if (sourceScript?.associatedOnly) {
40
40
  return [];
41
41
  }
42
42
  if (serviceScript) {
43
+ const map = language.maps.get(serviceScript.code, sourceScript);
43
44
  if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
44
45
  return [];
45
46
  }
46
47
  const edits = getFormattingEditsForDocument(sourceScript.id, options);
47
48
  return edits
48
- .map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
49
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
49
50
  .filter(utils_1.notEmpty);
50
51
  }
51
52
  else {
@@ -54,17 +55,17 @@ function decorateLanguageService(language, languageService) {
54
55
  };
55
56
  languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
56
57
  const fileName = filePath.replace(windowsPathReg, '/');
57
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
58
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
58
59
  if (sourceScript?.associatedOnly) {
59
60
  return [];
60
61
  }
61
62
  if (serviceScript) {
62
- const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isFormattingEnabled);
63
- const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isFormattingEnabled);
63
+ const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
64
+ const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
64
65
  if (generateStart !== undefined && generateEnd !== undefined) {
65
66
  const edits = getFormattingEditsForRange(sourceScript.id, generateStart, generateEnd, options);
66
67
  return edits
67
- .map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
68
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
68
69
  .filter(utils_1.notEmpty);
69
70
  }
70
71
  return [];
@@ -75,16 +76,16 @@ function decorateLanguageService(language, languageService) {
75
76
  };
76
77
  languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
77
78
  const fileName = filePath.replace(windowsPathReg, '/');
78
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
79
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
79
80
  if (sourceScript?.associatedOnly) {
80
81
  return [];
81
82
  }
82
83
  if (serviceScript) {
83
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isFormattingEnabled);
84
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
84
85
  if (generatePosition !== undefined) {
85
86
  const edits = getFormattingEditsAfterKeystroke(sourceScript.id, generatePosition, key, options);
86
87
  return edits
87
- .map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
88
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
88
89
  .filter(utils_1.notEmpty);
89
90
  }
90
91
  return [];
@@ -95,22 +96,22 @@ function decorateLanguageService(language, languageService) {
95
96
  };
96
97
  languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
97
98
  const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
98
- return (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, edits, language_core_1.isRenameEnabled);
99
+ return (0, transform_1.transformFileTextChanges)(undefined, language, edits, language_core_1.isRenameEnabled);
99
100
  };
100
101
  languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
101
102
  const fileName = filePath.replace(windowsPathReg, '/');
102
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
103
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
103
104
  if (sourceScript?.associatedOnly) {
104
105
  return undefined;
105
106
  }
106
107
  if (serviceScript) {
107
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
108
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
108
109
  if (generatePosition !== undefined) {
109
110
  const info = getLinkedEditingRangeAtPosition(sourceScript.id, generatePosition);
110
111
  if (info) {
111
112
  return {
112
113
  ranges: info.ranges
113
- .map(span => (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
114
+ .map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
114
115
  .filter(utils_1.notEmpty),
115
116
  wordPattern: info.wordPattern,
116
117
  };
@@ -123,19 +124,19 @@ function decorateLanguageService(language, languageService) {
123
124
  };
124
125
  languageService.prepareCallHierarchy = (filePath, position) => {
125
126
  const fileName = filePath.replace(windowsPathReg, '/');
126
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
127
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
127
128
  if (sourceScript?.associatedOnly) {
128
129
  return undefined;
129
130
  }
130
131
  if (serviceScript) {
131
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
132
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
132
133
  if (generatePosition !== undefined) {
133
134
  const item = prepareCallHierarchy(sourceScript.id, generatePosition);
134
135
  if (Array.isArray(item)) {
135
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, item, language_core_1.isCallHierarchyEnabled));
136
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(undefined, language, item, language_core_1.isCallHierarchyEnabled));
136
137
  }
137
138
  else if (item) {
138
- return (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, item, language_core_1.isCallHierarchyEnabled);
139
+ return (0, transform_1.transformCallHierarchyItem)(undefined, language, item, language_core_1.isCallHierarchyEnabled);
139
140
  }
140
141
  }
141
142
  }
@@ -146,12 +147,12 @@ function decorateLanguageService(language, languageService) {
146
147
  languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
147
148
  let calls = [];
148
149
  const fileName = filePath.replace(windowsPathReg, '/');
149
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
150
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
150
151
  if (sourceScript?.associatedOnly) {
151
152
  return [];
152
153
  }
153
154
  if (serviceScript) {
154
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
155
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
155
156
  if (generatePosition !== undefined) {
156
157
  calls = provideCallHierarchyIncomingCalls(sourceScript.id, generatePosition);
157
158
  }
@@ -161,9 +162,9 @@ function decorateLanguageService(language, languageService) {
161
162
  }
162
163
  return calls
163
164
  .map(call => {
164
- const from = (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, call.from, language_core_1.isCallHierarchyEnabled);
165
+ const from = (0, transform_1.transformCallHierarchyItem)(undefined, language, call.from, language_core_1.isCallHierarchyEnabled);
165
166
  const fromSpans = call.fromSpans
166
- .map(span => (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
167
+ .map(span => (0, transform_1.transformSpan)(undefined, language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
167
168
  .filter(utils_1.notEmpty);
168
169
  return {
169
170
  from,
@@ -174,12 +175,12 @@ function decorateLanguageService(language, languageService) {
174
175
  languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
175
176
  let calls = [];
176
177
  const fileName = filePath.replace(windowsPathReg, '/');
177
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
178
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
178
179
  if (sourceScript?.associatedOnly) {
179
180
  return [];
180
181
  }
181
182
  if (serviceScript) {
182
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
183
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
183
184
  if (generatePosition !== undefined) {
184
185
  calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
185
186
  }
@@ -189,10 +190,10 @@ function decorateLanguageService(language, languageService) {
189
190
  }
190
191
  return calls
191
192
  .map(call => {
192
- const to = (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, call.to, language_core_1.isCallHierarchyEnabled);
193
+ const to = (0, transform_1.transformCallHierarchyItem)(undefined, language, call.to, language_core_1.isCallHierarchyEnabled);
193
194
  const fromSpans = call.fromSpans
194
195
  .map(span => serviceScript
195
- ? (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
196
+ ? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
196
197
  : span)
197
198
  .filter(utils_1.notEmpty);
198
199
  return {
@@ -203,20 +204,20 @@ function decorateLanguageService(language, languageService) {
203
204
  };
204
205
  languageService.organizeImports = (args, formatOptions, preferences) => {
205
206
  const unresolved = organizeImports(args, formatOptions, preferences);
206
- return (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, unresolved, language_core_1.isCodeActionsEnabled);
207
+ return (0, transform_1.transformFileTextChanges)(undefined, language, unresolved, language_core_1.isCodeActionsEnabled);
207
208
  };
208
209
  languageService.getQuickInfoAtPosition = (filePath, position) => {
209
210
  const fileName = filePath.replace(windowsPathReg, '/');
210
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
211
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
211
212
  if (sourceScript?.associatedOnly) {
212
213
  return undefined;
213
214
  }
214
215
  if (serviceScript) {
215
216
  const infos = [];
216
- for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isHoverEnabled)) {
217
+ for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
217
218
  const info = getQuickInfoAtPosition(sourceScript.id, generatePosition);
218
219
  if (info) {
219
- const textSpan = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
220
+ const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
220
221
  if (textSpan) {
221
222
  infos.push({
222
223
  ...info,
@@ -270,16 +271,16 @@ function decorateLanguageService(language, languageService) {
270
271
  };
271
272
  languageService.getSignatureHelpItems = (filePath, position, options) => {
272
273
  const fileName = filePath.replace(windowsPathReg, '/');
273
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
274
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
274
275
  if (sourceScript?.associatedOnly) {
275
276
  return undefined;
276
277
  }
277
278
  if (serviceScript) {
278
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
279
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
279
280
  if (generatePosition !== undefined) {
280
281
  const result = getSignatureHelpItems(sourceScript.id, generatePosition, options);
281
282
  if (result) {
282
- const applicableSpan = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
283
+ const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
283
284
  if (applicableSpan) {
284
285
  return {
285
286
  ...result,
@@ -309,11 +310,11 @@ function decorateLanguageService(language, languageService) {
309
310
  ...highlights,
310
311
  highlightSpans: highlights.highlightSpans
311
312
  .map(span => {
312
- const { textSpan } = (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
313
+ const { textSpan } = (0, transform_1.transformSpan)(undefined, language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
313
314
  if (textSpan) {
314
315
  return {
315
316
  ...span,
316
- contextSpan: (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
317
+ contextSpan: (0, transform_1.transformSpan)(undefined, language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
317
318
  textSpan,
318
319
  };
319
320
  }
@@ -325,12 +326,12 @@ function decorateLanguageService(language, languageService) {
325
326
  };
326
327
  languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
327
328
  const fileName = filePath.replace(windowsPathReg, '/');
328
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
329
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
329
330
  if (sourceScript?.associatedOnly) {
330
331
  return [];
331
332
  }
332
333
  if (serviceScript) {
333
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
334
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
334
335
  if (generatePosition !== undefined) {
335
336
  const por = typeof positionOrRange === 'number'
336
337
  ? generatePosition
@@ -349,12 +350,12 @@ function decorateLanguageService(language, languageService) {
349
350
  languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
350
351
  let edits;
351
352
  const fileName = filePath.replace(windowsPathReg, '/');
352
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
353
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
353
354
  if (sourceScript?.associatedOnly) {
354
355
  return undefined;
355
356
  }
356
357
  if (serviceScript) {
357
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number'
358
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number'
358
359
  ? positionOrRange
359
360
  : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
360
361
  if (generatePosition !== undefined) {
@@ -371,13 +372,13 @@ function decorateLanguageService(language, languageService) {
371
372
  edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
372
373
  }
373
374
  if (edits) {
374
- edits.edits = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, edits.edits, language_core_1.isCodeActionsEnabled);
375
+ edits.edits = (0, transform_1.transformFileTextChanges)(undefined, language, edits.edits, language_core_1.isCodeActionsEnabled);
375
376
  return edits;
376
377
  }
377
378
  };
378
379
  languageService.getRenameInfo = (filePath, position, options) => {
379
380
  const fileName = filePath.replace(windowsPathReg, '/');
380
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
381
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
381
382
  if (sourceScript?.associatedOnly) {
382
383
  return {
383
384
  canRename: false,
@@ -386,10 +387,10 @@ function decorateLanguageService(language, languageService) {
386
387
  }
387
388
  if (serviceScript) {
388
389
  let failed;
389
- for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isRenameEnabled)) {
390
+ for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
390
391
  const info = getRenameInfo(sourceScript.id, generateOffset, options);
391
392
  if (info.canRename) {
392
- const span = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
393
+ const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
393
394
  if (span) {
394
395
  info.triggerSpan = span;
395
396
  return info;
@@ -414,13 +415,13 @@ function decorateLanguageService(language, languageService) {
414
415
  languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
415
416
  let fixes = [];
416
417
  const fileName = filePath.replace(windowsPathReg, '/');
417
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
418
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
418
419
  if (sourceScript?.associatedOnly) {
419
420
  return [];
420
421
  }
421
422
  if (serviceScript) {
422
- const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isCodeActionsEnabled);
423
- const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isCodeActionsEnabled);
423
+ const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
424
+ const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
424
425
  if (generateStart !== undefined && generateEnd !== undefined) {
425
426
  fixes = getCodeFixesAtPosition(sourceScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
426
427
  }
@@ -429,14 +430,14 @@ function decorateLanguageService(language, languageService) {
429
430
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
430
431
  }
431
432
  fixes = fixes.map(fix => {
432
- fix.changes = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, fix.changes, language_core_1.isCodeActionsEnabled);
433
+ fix.changes = (0, transform_1.transformFileTextChanges)(undefined, language, fix.changes, language_core_1.isCodeActionsEnabled);
433
434
  return fix;
434
435
  });
435
436
  return fixes;
436
437
  };
437
438
  languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
438
439
  const fileName = filePath.replace(windowsPathReg, '/');
439
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
440
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
440
441
  if (sourceScript?.associatedOnly) {
441
442
  return {
442
443
  spans: [],
@@ -446,6 +447,7 @@ function decorateLanguageService(language, languageService) {
446
447
  if (serviceScript) {
447
448
  let start;
448
449
  let end;
450
+ const map = language.maps.get(serviceScript.code, sourceScript);
449
451
  for (const mapping of map.mappings) {
450
452
  // TODO reuse the logic from language service
451
453
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
@@ -457,14 +459,14 @@ function decorateLanguageService(language, languageService) {
457
459
  }
458
460
  start ??= 0;
459
461
  end ??= sourceScript.snapshot.getLength();
460
- const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
462
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
461
463
  start += mappingOffset;
462
464
  end += mappingOffset;
463
465
  const result = getEncodedSemanticClassifications(sourceScript.id, { start, length: end - start }, format);
464
466
  const spans = [];
465
467
  for (let i = 0; i < result.spans.length; i += 3) {
466
- for (const sourceStart of (0, transform_1.toSourceOffsets)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.spans[i], language_core_1.isSemanticTokensEnabled)) {
467
- for (const sourceEnd of (0, transform_1.toSourceOffsets)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
468
+ for (const sourceStart of (0, transform_1.toSourceOffsets)(sourceScript, language, serviceScript, result.spans[i], language_core_1.isSemanticTokensEnabled)) {
469
+ for (const sourceEnd of (0, transform_1.toSourceOffsets)(sourceScript, language, serviceScript, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
468
470
  if (sourceStart[0] === sourceEnd[0] && sourceEnd[1] >= sourceStart[1]) {
469
471
  spans.push(sourceStart[1], sourceEnd[1] - sourceStart[1], result.spans[i + 2]);
470
472
  break;
@@ -489,7 +491,7 @@ function decorateLanguageService(language, languageService) {
489
491
  return [];
490
492
  }
491
493
  return getSyntacticDiagnostics(fileName)
492
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
494
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
493
495
  .filter(utils_1.notEmpty);
494
496
  };
495
497
  languageService.getSemanticDiagnostics = filePath => {
@@ -499,7 +501,7 @@ function decorateLanguageService(language, languageService) {
499
501
  return [];
500
502
  }
501
503
  return getSemanticDiagnostics(fileName)
502
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
504
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
503
505
  .filter(utils_1.notEmpty);
504
506
  };
505
507
  languageService.getSuggestionDiagnostics = filePath => {
@@ -509,7 +511,7 @@ function decorateLanguageService(language, languageService) {
509
511
  return [];
510
512
  }
511
513
  return getSuggestionDiagnostics(fileName)
512
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
514
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
513
515
  .filter(utils_1.notEmpty);
514
516
  };
515
517
  languageService.getDefinitionAndBoundSpan = (filePath, position) => {
@@ -520,14 +522,14 @@ function decorateLanguageService(language, languageService) {
520
522
  }
521
523
  });
522
524
  const textSpan = unresolved
523
- .map(s => (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
525
+ .map(s => (0, transform_1.transformSpan)(undefined, language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
524
526
  .filter(utils_1.notEmpty)[0];
525
527
  if (!textSpan) {
526
528
  return;
527
529
  }
528
530
  const definitions = unresolved
529
531
  .map(s => s.definitions
530
- ?.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
532
+ ?.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
531
533
  .filter(utils_1.notEmpty))
532
534
  .filter(utils_1.notEmpty)
533
535
  .flat();
@@ -548,11 +550,11 @@ function decorateLanguageService(language, languageService) {
548
550
  const resolved = unresolved
549
551
  .flat()
550
552
  .map(symbol => {
551
- const definition = (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, symbol.definition, language_core_1.isDefinitionEnabled, true);
553
+ const definition = (0, transform_1.transformDocumentSpan)(undefined, language, symbol.definition, language_core_1.isDefinitionEnabled, true);
552
554
  return {
553
555
  definition,
554
556
  references: symbol.references
555
- .map(r => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, r, language_core_1.isReferencesEnabled))
557
+ .map(r => (0, transform_1.transformDocumentSpan)(undefined, language, r, language_core_1.isReferencesEnabled))
556
558
  .filter(utils_1.notEmpty),
557
559
  };
558
560
  });
@@ -567,7 +569,7 @@ function decorateLanguageService(language, languageService) {
567
569
  });
568
570
  const resolved = unresolved
569
571
  .flat()
570
- .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
572
+ .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
571
573
  .filter(utils_1.notEmpty);
572
574
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
573
575
  };
@@ -580,7 +582,7 @@ function decorateLanguageService(language, languageService) {
580
582
  });
581
583
  const resolved = unresolved
582
584
  .flat()
583
- .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isTypeDefinitionEnabled))
585
+ .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isTypeDefinitionEnabled))
584
586
  .filter(utils_1.notEmpty);
585
587
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
586
588
  };
@@ -593,7 +595,7 @@ function decorateLanguageService(language, languageService) {
593
595
  });
594
596
  const resolved = unresolved
595
597
  .flat()
596
- .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isImplementationEnabled))
598
+ .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isImplementationEnabled))
597
599
  .filter(utils_1.notEmpty);
598
600
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
599
601
  };
@@ -606,7 +608,7 @@ function decorateLanguageService(language, languageService) {
606
608
  });
607
609
  const resolved = unresolved
608
610
  .flat()
609
- .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isRenameEnabled))
611
+ .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isRenameEnabled))
610
612
  .filter(utils_1.notEmpty);
611
613
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
612
614
  };
@@ -619,19 +621,19 @@ function decorateLanguageService(language, languageService) {
619
621
  });
620
622
  const resolved = unresolved
621
623
  .flat()
622
- .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isReferencesEnabled))
624
+ .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isReferencesEnabled))
623
625
  .filter(utils_1.notEmpty);
624
626
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
625
627
  };
626
628
  languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
627
629
  const fileName = filePath.replace(windowsPathReg, '/');
628
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
630
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
629
631
  if (sourceScript?.associatedOnly) {
630
632
  return undefined;
631
633
  }
632
634
  if (serviceScript) {
633
635
  const results = [];
634
- for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled)) {
636
+ for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
635
637
  const result = getCompletionsAtPosition(sourceScript.id, generatedOffset, options, formattingSettings);
636
638
  if (!result) {
637
639
  continue;
@@ -640,10 +642,10 @@ function decorateLanguageService(language, languageService) {
640
642
  result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
641
643
  }
642
644
  for (const entry of result.entries) {
643
- entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
645
+ entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
644
646
  }
645
647
  result.optionalReplacementSpan = result.optionalReplacementSpan
646
- && (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
648
+ && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
647
649
  const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
648
650
  if (isAdditional) {
649
651
  results.push(result);
@@ -668,12 +670,12 @@ function decorateLanguageService(language, languageService) {
668
670
  languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
669
671
  let details;
670
672
  const fileName = filePath.replace(windowsPathReg, '/');
671
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
673
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
672
674
  if (sourceScript?.associatedOnly) {
673
675
  return undefined;
674
676
  }
675
677
  if (serviceScript) {
676
- const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled);
678
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
677
679
  if (generatePosition !== undefined) {
678
680
  details = getCompletionEntryDetails(sourceScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
679
681
  }
@@ -683,20 +685,21 @@ function decorateLanguageService(language, languageService) {
683
685
  }
684
686
  if (details?.codeActions) {
685
687
  for (const codeAction of details.codeActions) {
686
- codeAction.changes = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, codeAction.changes, language_core_1.isCompletionEnabled);
688
+ codeAction.changes = (0, transform_1.transformFileTextChanges)(undefined, language, codeAction.changes, language_core_1.isCompletionEnabled);
687
689
  }
688
690
  }
689
691
  return details;
690
692
  };
691
693
  languageService.provideInlayHints = (filePath, span, preferences) => {
692
694
  const fileName = filePath.replace(windowsPathReg, '/');
693
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
695
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
694
696
  if (sourceScript?.associatedOnly) {
695
697
  return [];
696
698
  }
697
699
  if (serviceScript) {
698
700
  let start;
699
701
  let end;
702
+ const map = language.maps.get(serviceScript.code, sourceScript);
700
703
  for (const mapping of map.mappings) {
701
704
  if ((0, language_core_1.isInlayHintsEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
702
705
  start ??= mapping.generatedOffsets[0];
@@ -709,13 +712,13 @@ function decorateLanguageService(language, languageService) {
709
712
  start = 0;
710
713
  end = 0;
711
714
  }
712
- const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
715
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
713
716
  start += mappingOffset;
714
717
  end += mappingOffset;
715
718
  const result = provideInlayHints(sourceScript.id, { start, length: end - start }, preferences);
716
719
  const hints = [];
717
720
  for (const hint of result) {
718
- const sourcePosition = (0, transform_1.toSourceOffset)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, hint.position, language_core_1.isInlayHintsEnabled);
721
+ const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
719
722
  if (sourcePosition !== undefined) {
720
723
  hints.push({
721
724
  ...hint,
@@ -733,19 +736,17 @@ function decorateLanguageService(language, languageService) {
733
736
  const fileName = filePath.replace(windowsPathReg, '/');
734
737
  const unresolved = getFileReferences(fileName);
735
738
  const resolved = unresolved
736
- .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isReferencesEnabled))
739
+ .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isReferencesEnabled))
737
740
  .filter(utils_1.notEmpty);
738
741
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
739
742
  };
740
743
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
741
744
  const results = [];
742
745
  const processedFilePositions = new Set();
743
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
746
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
744
747
  if (serviceScript) {
745
- for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
746
- if (filter(mapping.data)) {
747
- process(sourceScript.id, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
748
- }
748
+ for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
749
+ process(sourceScript.id, generatedOffset);
749
750
  }
750
751
  }
751
752
  else {
@@ -764,7 +765,7 @@ function decorateLanguageService(language, languageService) {
764
765
  results.push(result);
765
766
  for (const ref of getLinkedCodes(result)) {
766
767
  processedFilePositions.add(ref[0] + ':' + ref[1]);
767
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
768
+ const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
768
769
  if (!serviceScript) {
769
770
  continue;
770
771
  }
@@ -772,7 +773,7 @@ function decorateLanguageService(language, languageService) {
772
773
  if (!linkedCodeMap) {
773
774
  continue;
774
775
  }
775
- const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
776
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
776
777
  for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
777
778
  process(ref[0], linkedCodeOffset + mappingOffset);
778
779
  }
@@ -18,7 +18,7 @@ function decorateProgram(language, program) {
18
18
  return {
19
19
  ...result,
20
20
  diagnostics: result.diagnostics
21
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.IncludeAssciated, language, d, program, true))
21
+ .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
22
22
  .filter(utils_1.notEmpty),
23
23
  };
24
24
  };
@@ -29,7 +29,7 @@ function decorateProgram(language, program) {
29
29
  const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
30
30
  const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
31
31
  return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
32
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
32
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
33
33
  .filter(utils_1.notEmpty);
34
34
  };
35
35
  program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
@@ -39,12 +39,12 @@ function decorateProgram(language, program) {
39
39
  const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
40
40
  const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
41
41
  return getSemanticDiagnostics(actualSourceFile, cancellationToken)
42
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
42
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
43
43
  .filter(utils_1.notEmpty);
44
44
  };
45
45
  program.getGlobalDiagnostics = cancellationToken => {
46
46
  return getGlobalDiagnostics(cancellationToken)
47
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.IncludeAssciated, language, d, program, true))
47
+ .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
48
48
  .filter(utils_1.notEmpty);
49
49
  };
50
50
  // @ts-ignore
@@ -55,7 +55,7 @@ function decorateProgram(language, program) {
55
55
  const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
56
56
  const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
57
57
  return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
58
- .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
58
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
59
59
  .filter(utils_1.notEmpty);
60
60
  };
61
61
  // fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
@@ -1,23 +1,19 @@
1
- import type { CodeInformation, SourceMap, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
1
+ import type { CodeInformation, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
2
2
  import { Language } from '@volar/language-core';
3
3
  import type * as ts from 'typescript';
4
- export declare enum ToSourceMode {
5
- IncludeAssciated = 0,
6
- SkipAssciated = 1
7
- }
8
- export declare function transformCallHierarchyItem(mode: ToSourceMode, language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
9
- export declare function transformDiagnostic<T extends ts.Diagnostic>(mode: ToSourceMode, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
4
+ export declare function transformCallHierarchyItem(targetScript: SourceScript<string> | undefined, language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
5
+ export declare function transformDiagnostic<T extends ts.Diagnostic>(targetScript: SourceScript<string> | undefined, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
10
6
  export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
11
- export declare function transformFileTextChanges(mode: ToSourceMode, language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
12
- export declare function transformDocumentSpan<T extends ts.DocumentSpan>(mode: ToSourceMode, language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
13
- export declare function transformSpan(mode: ToSourceMode, language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
7
+ export declare function transformFileTextChanges(targetScript: SourceScript<string> | undefined, language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
8
+ export declare function transformDocumentSpan<T extends ts.DocumentSpan>(targetScript: SourceScript<string> | undefined, language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
9
+ export declare function transformSpan(targetScript: SourceScript<string> | undefined, language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
14
10
  fileName: string;
15
11
  textSpan: ts.TextSpan;
16
12
  } | undefined;
17
- export declare function transformTextChange(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
18
- export declare function transformTextSpan(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
19
- export declare function toSourceOffset(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
20
- export declare function toSourceOffsets(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
21
- export declare function toGeneratedOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
22
- export declare function toGeneratedOffsets(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
23
- export declare function getMappingOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>): number;
13
+ export declare function transformTextChange(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
14
+ export declare function transformTextSpan(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
15
+ export declare function toSourceOffset(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
16
+ export declare function toSourceOffsets(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
17
+ export declare function toGeneratedOffset(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
18
+ export declare function toGeneratedOffsets(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
19
+ export declare function getMappingOffset(language: Language, serviceScript: TypeScriptServiceScript): number;
@@ -1,18 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffsets = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = exports.ToSourceMode = void 0;
3
+ exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffsets = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const utils_1 = require("./utils");
6
- var ToSourceMode;
7
- (function (ToSourceMode) {
8
- ToSourceMode[ToSourceMode["IncludeAssciated"] = 0] = "IncludeAssciated";
9
- ToSourceMode[ToSourceMode["SkipAssciated"] = 1] = "SkipAssciated";
10
- })(ToSourceMode || (exports.ToSourceMode = ToSourceMode = {}));
11
6
  const transformedDiagnostics = new WeakMap();
12
7
  const transformedSourceFile = new WeakSet();
13
- function transformCallHierarchyItem(mode, language, item, filter) {
14
- const span = transformSpan(mode, language, item.file, item.span, filter);
15
- const selectionSpan = transformSpan(mode, language, item.file, item.selectionSpan, filter);
8
+ function transformCallHierarchyItem(targetScript, language, item, filter) {
9
+ const span = transformSpan(targetScript, language, item.file, item.span, filter);
10
+ const selectionSpan = transformSpan(targetScript, language, item.file, item.selectionSpan, filter);
16
11
  return {
17
12
  ...item,
18
13
  file: span?.fileName ?? item.file,
@@ -21,13 +16,13 @@ function transformCallHierarchyItem(mode, language, item, filter) {
21
16
  };
22
17
  }
23
18
  exports.transformCallHierarchyItem = transformCallHierarchyItem;
24
- function transformDiagnostic(mode, language, diagnostic, program, isTsc) {
19
+ function transformDiagnostic(targetScript, language, diagnostic, program, isTsc) {
25
20
  if (!transformedDiagnostics.has(diagnostic)) {
26
21
  transformedDiagnostics.set(diagnostic, undefined);
27
22
  const { relatedInformation } = diagnostic;
28
23
  if (relatedInformation) {
29
24
  diagnostic.relatedInformation = relatedInformation
30
- .map(d => transformDiagnostic(mode, language, d, program, isTsc))
25
+ .map(d => transformDiagnostic(targetScript, language, d, program, isTsc))
31
26
  .filter(utils_1.notEmpty);
32
27
  }
33
28
  if (diagnostic.file !== undefined
@@ -35,7 +30,7 @@ function transformDiagnostic(mode, language, diagnostic, program, isTsc) {
35
30
  && diagnostic.length !== undefined) {
36
31
  const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
37
32
  if (serviceScript) {
38
- const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, {
33
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(sourceScript, language, serviceScript, {
39
34
  start: diagnostic.start,
40
35
  length: diagnostic.length
41
36
  }, language_core_1.shouldReportDiagnostics) ?? [];
@@ -80,14 +75,14 @@ function fillSourceFileText(language, sourceFile) {
80
75
  }
81
76
  }
82
77
  exports.fillSourceFileText = fillSourceFileText;
83
- function transformFileTextChanges(mode, language, changes, filter) {
78
+ function transformFileTextChanges(targetScript, language, changes, filter) {
84
79
  const changesPerFile = {};
85
80
  const newFiles = new Set();
86
81
  for (const fileChanges of changes) {
87
82
  const [_, source] = (0, utils_1.getServiceScript)(language, fileChanges.fileName);
88
83
  if (source) {
89
84
  fileChanges.textChanges.forEach(c => {
90
- const { fileName, textSpan } = transformSpan(mode, language, fileChanges.fileName, c.span, filter) ?? {};
85
+ const { fileName, textSpan } = transformSpan(targetScript, language, fileChanges.fileName, c.span, filter) ?? {};
91
86
  if (fileName && textSpan) {
92
87
  (changesPerFile[fileName] ?? (changesPerFile[fileName] = [])).push({ ...c, span: textSpan });
93
88
  }
@@ -114,8 +109,8 @@ function transformFileTextChanges(mode, language, changes, filter) {
114
109
  return result;
115
110
  }
116
111
  exports.transformFileTextChanges = transformFileTextChanges;
117
- function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallback) {
118
- let textSpan = transformSpan(mode, language, documentSpan.fileName, documentSpan.textSpan, filter);
112
+ function transformDocumentSpan(targetScript, language, documentSpan, filter, shouldFallback) {
113
+ let textSpan = transformSpan(targetScript, language, documentSpan.fileName, documentSpan.textSpan, filter);
119
114
  if (!textSpan && shouldFallback) {
120
115
  textSpan = {
121
116
  fileName: documentSpan.fileName,
@@ -125,9 +120,9 @@ function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallb
125
120
  if (!textSpan) {
126
121
  return;
127
122
  }
128
- const contextSpan = transformSpan(mode, language, documentSpan.fileName, documentSpan.contextSpan, filter);
129
- const originalTextSpan = transformSpan(mode, language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
130
- const originalContextSpan = transformSpan(mode, language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
123
+ const contextSpan = transformSpan(targetScript, language, documentSpan.fileName, documentSpan.contextSpan, filter);
124
+ const originalTextSpan = transformSpan(targetScript, language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
125
+ const originalContextSpan = transformSpan(targetScript, language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
131
126
  return {
132
127
  ...documentSpan,
133
128
  fileName: textSpan.fileName,
@@ -139,7 +134,7 @@ function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallb
139
134
  };
140
135
  }
141
136
  exports.transformDocumentSpan = transformDocumentSpan;
142
- function transformSpan(mode, language, fileName, textSpan, filter) {
137
+ function transformSpan(targetScript, language, fileName, textSpan, filter) {
143
138
  if (!fileName || !textSpan) {
144
139
  return;
145
140
  }
@@ -148,7 +143,7 @@ function transformSpan(mode, language, fileName, textSpan, filter) {
148
143
  return;
149
144
  }
150
145
  else if (serviceScript) {
151
- const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, textSpan, filter) ?? [];
146
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(targetScript, language, serviceScript, textSpan, filter) ?? [];
152
147
  if (sourceSpan && sourceSpanFileName) {
153
148
  return {
154
149
  fileName: sourceSpanFileName,
@@ -164,8 +159,8 @@ function transformSpan(mode, language, fileName, textSpan, filter) {
164
159
  }
165
160
  }
166
161
  exports.transformSpan = transformSpan;
167
- function transformTextChange(mode, language, serviceScript, sourceScript, textChange, filter) {
168
- const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, textChange.span, filter) ?? [];
162
+ function transformTextChange(targetScript, language, serviceScript, textChange, filter) {
163
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(targetScript, language, serviceScript, textChange.span, filter) ?? [];
169
164
  if (sourceSpan && sourceSpanFileName) {
170
165
  return [sourceSpanFileName, {
171
166
  newText: textChange.newText,
@@ -175,11 +170,11 @@ function transformTextChange(mode, language, serviceScript, sourceScript, textCh
175
170
  return undefined;
176
171
  }
177
172
  exports.transformTextChange = transformTextChange;
178
- function transformTextSpan(mode, language, serviceScript, sourceScript, textSpan, filter) {
173
+ function transformTextSpan(targetScript, language, serviceScript, textSpan, filter) {
179
174
  const start = textSpan.start;
180
175
  const end = textSpan.start + textSpan.length;
181
- for (const sourceStart of toSourceOffsets(mode, language, serviceScript, sourceScript, start, filter)) {
182
- for (const sourceEnd of toSourceOffsets(mode, language, serviceScript, sourceScript, end, filter)) {
176
+ for (const sourceStart of toSourceOffsets(targetScript, language, serviceScript, start, filter)) {
177
+ for (const sourceEnd of toSourceOffsets(targetScript, language, serviceScript, end, filter)) {
183
178
  if (sourceStart[0] === sourceEnd[0]
184
179
  && sourceEnd[1] >= sourceStart[1]) {
185
180
  return [sourceStart[0], {
@@ -191,24 +186,24 @@ function transformTextSpan(mode, language, serviceScript, sourceScript, textSpan
191
186
  }
192
187
  }
193
188
  exports.transformTextSpan = transformTextSpan;
194
- function toSourceOffset(mode, language, serviceScript, sourceScript, position, filter) {
195
- for (const source of toSourceOffsets(mode, language, serviceScript, sourceScript, position, filter)) {
189
+ function toSourceOffset(targetScript, language, serviceScript, position, filter) {
190
+ for (const source of toSourceOffsets(targetScript, language, serviceScript, position, filter)) {
196
191
  return source;
197
192
  }
198
193
  }
199
194
  exports.toSourceOffset = toSourceOffset;
200
- function* toSourceOffsets(mode, language, serviceScript, sourceScript, position, filter) {
201
- if (mode === ToSourceMode.SkipAssciated) {
202
- const map = language.maps.get(serviceScript.code);
203
- for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
195
+ function* toSourceOffsets(targetScript, language, serviceScript, position, filter) {
196
+ if (targetScript) {
197
+ const map = language.maps.get(serviceScript.code, targetScript);
198
+ for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
204
199
  if (filter(mapping.data)) {
205
- yield [sourceScript.id, sourceOffset];
200
+ yield [targetScript.id, sourceOffset];
206
201
  }
207
202
  }
208
203
  }
209
204
  else {
210
205
  for (const [fileName, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
211
- for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
206
+ for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
212
207
  if (filter(mapping.data)) {
213
208
  yield [fileName, sourceOffset];
214
209
  }
@@ -217,24 +212,27 @@ function* toSourceOffsets(mode, language, serviceScript, sourceScript, position,
217
212
  }
218
213
  }
219
214
  exports.toSourceOffsets = toSourceOffsets;
220
- function toGeneratedOffset(serviceScript, sourceScript, map, position, filter) {
221
- for (const [generateOffset] of toGeneratedOffsets(serviceScript, sourceScript, map, position, filter)) {
215
+ function toGeneratedOffset(language, serviceScript, sourceScript, position, filter) {
216
+ for (const [generateOffset] of toGeneratedOffsets(language, serviceScript, sourceScript, position, filter)) {
222
217
  return generateOffset;
223
218
  }
224
219
  }
225
220
  exports.toGeneratedOffset = toGeneratedOffset;
226
- function* toGeneratedOffsets(serviceScript, sourceScript, map, position, filter) {
221
+ function* toGeneratedOffsets(language, serviceScript, sourceScript, position, filter) {
222
+ const map = language.maps.get(serviceScript.code, sourceScript);
227
223
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
228
224
  if (filter(mapping.data)) {
229
- yield [generateOffset + getMappingOffset(serviceScript, sourceScript), mapping];
225
+ yield [generateOffset + getMappingOffset(language, serviceScript), mapping];
230
226
  }
231
227
  }
232
228
  }
233
229
  exports.toGeneratedOffsets = toGeneratedOffsets;
234
- function getMappingOffset(serviceScript, sourceScript) {
235
- return !serviceScript.preventLeadingOffset
236
- ? sourceScript.snapshot.getLength()
237
- : 0;
230
+ function getMappingOffset(language, serviceScript) {
231
+ if (serviceScript.preventLeadingOffset) {
232
+ return 0;
233
+ }
234
+ const sourceScript = language.scripts.fromVirtualCode(serviceScript.code);
235
+ return sourceScript.snapshot.getLength();
238
236
  }
239
237
  exports.getMappingOffset = getMappingOffset;
240
238
  //# sourceMappingURL=transform.js.map
@@ -1,3 +1,3 @@
1
- import type { CodeInformation, Language, SourceMap, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
1
+ import type { Language, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
2
2
  export declare function notEmpty<T>(value: T | null | undefined): value is T;
3
- export declare function getServiceScript(language: Language<string>, fileName: string): [TypeScriptServiceScript, SourceScript<string>, SourceMap<CodeInformation>] | [undefined, SourceScript<string>, undefined] | [undefined, undefined, undefined];
3
+ export declare function getServiceScript(language: Language<string>, fileName: string): [TypeScriptServiceScript, SourceScript<string>] | [undefined, SourceScript<string>] | [undefined, undefined];
package/lib/node/utils.js CHANGED
@@ -6,37 +6,28 @@ function notEmpty(value) {
6
6
  }
7
7
  exports.notEmpty = notEmpty;
8
8
  function getServiceScript(language, fileName) {
9
- let sourceScript = language.scripts.get(fileName);
10
- if (sourceScript?.targetIds && sourceScript?.targetIds.size > 0) {
11
- const sourceId = sourceScript.id;
9
+ const sourceScript = language.scripts.get(fileName);
10
+ if (sourceScript?.targetIds.size) {
12
11
  for (const targetId of sourceScript.targetIds) {
13
- sourceScript = language.scripts.get(targetId);
14
- if (sourceScript?.generated) {
15
- const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
12
+ const targetScript = language.scripts.get(targetId);
13
+ if (targetScript?.generated) {
14
+ const serviceScript = targetScript.generated.languagePlugin.typescript?.getServiceScript(targetScript.generated.root);
16
15
  if (serviceScript) {
17
- for (const [id, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
18
- if (id === sourceId) {
19
- return [serviceScript, sourceScript, map];
20
- }
21
- }
22
- break;
16
+ return [serviceScript, targetScript];
23
17
  }
24
18
  }
25
19
  }
26
20
  }
27
21
  if (sourceScript?.associatedOnly) {
28
- return [undefined, sourceScript, undefined];
22
+ return [undefined, sourceScript];
29
23
  }
30
24
  if (sourceScript?.generated) {
31
25
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
32
26
  if (serviceScript) {
33
- const map = language.maps.get(serviceScript.code);
34
- if (map) {
35
- return [serviceScript, sourceScript, map];
36
- }
27
+ return [serviceScript, sourceScript];
37
28
  }
38
29
  }
39
- return [undefined, undefined, undefined];
30
+ return [undefined, undefined];
40
31
  }
41
32
  exports.getServiceScript = getServiceScript;
42
33
  //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.3.0-alpha.8",
3
+ "version": "2.3.0-alpha.9",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,14 +12,14 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.3.0-alpha.8",
15
+ "@volar/language-core": "2.3.0-alpha.9",
16
16
  "path-browserify": "^1.0.1",
17
17
  "vscode-uri": "^3.0.8"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "latest",
21
21
  "@types/path-browserify": "latest",
22
- "@volar/language-service": "2.3.0-alpha.8"
22
+ "@volar/language-service": "2.3.0-alpha.9"
23
23
  },
24
- "gitHead": "377a0083ac697a476509805a6777a2339391dcaf"
24
+ "gitHead": "3f741930343896dfc464a893ebe5f3619bb1a1aa"
25
25
  }