@volar/typescript 2.3.0-alpha.9 → 2.3.1

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.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decorateLanguageService = void 0;
3
+ exports.decorateLanguageService = decorateLanguageService;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const dedupe_1 = require("./dedupe");
6
6
  const transform_1 = require("./transform");
@@ -11,9 +11,9 @@ function decorateLanguageService(language, languageService) {
11
11
  const { getNavigationTree, getOutliningSpans, } = languageService;
12
12
  languageService.getNavigationTree = filePath => {
13
13
  const fileName = filePath.replace(windowsPathReg, '/');
14
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
15
- if (serviceScript || sourceScript?.associatedOnly) {
16
- const tree = getNavigationTree(sourceScript.id);
14
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
15
+ if (serviceScript || targetScript?.associatedOnly) {
16
+ const tree = getNavigationTree(targetScript.id);
17
17
  tree.childItems = undefined;
18
18
  return tree;
19
19
  }
@@ -23,8 +23,8 @@ function decorateLanguageService(language, languageService) {
23
23
  };
24
24
  languageService.getOutliningSpans = filePath => {
25
25
  const fileName = filePath.replace(windowsPathReg, '/');
26
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
27
- if (serviceScript || sourceScript?.associatedOnly) {
26
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
27
+ if (serviceScript || targetScript?.associatedOnly) {
28
28
  return [];
29
29
  }
30
30
  else {
@@ -35,19 +35,19 @@ 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] = (0, utils_1.getServiceScript)(language, fileName);
39
- if (sourceScript?.associatedOnly) {
38
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
39
+ if (targetScript?.associatedOnly) {
40
40
  return [];
41
41
  }
42
42
  if (serviceScript) {
43
- const map = language.maps.get(serviceScript.code, sourceScript);
43
+ const map = language.maps.get(serviceScript.code, targetScript);
44
44
  if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
45
45
  return [];
46
46
  }
47
- const edits = getFormattingEditsForDocument(sourceScript.id, options);
47
+ const edits = getFormattingEditsForDocument(targetScript.id, options);
48
48
  return edits
49
49
  .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
50
- .filter(utils_1.notEmpty);
50
+ .filter(edit => !!edit);
51
51
  }
52
52
  else {
53
53
  return getFormattingEditsForDocument(fileName, options);
@@ -55,18 +55,18 @@ function decorateLanguageService(language, languageService) {
55
55
  };
56
56
  languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
57
57
  const fileName = filePath.replace(windowsPathReg, '/');
58
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
59
- if (sourceScript?.associatedOnly) {
58
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
59
+ if (targetScript?.associatedOnly) {
60
60
  return [];
61
61
  }
62
62
  if (serviceScript) {
63
63
  const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
64
64
  const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
65
65
  if (generateStart !== undefined && generateEnd !== undefined) {
66
- const edits = getFormattingEditsForRange(sourceScript.id, generateStart, generateEnd, options);
66
+ const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
67
67
  return edits
68
68
  .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
69
- .filter(utils_1.notEmpty);
69
+ .filter(edit => !!edit);
70
70
  }
71
71
  return [];
72
72
  }
@@ -76,17 +76,17 @@ function decorateLanguageService(language, languageService) {
76
76
  };
77
77
  languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
78
78
  const fileName = filePath.replace(windowsPathReg, '/');
79
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
80
- if (sourceScript?.associatedOnly) {
79
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
80
+ if (targetScript?.associatedOnly) {
81
81
  return [];
82
82
  }
83
83
  if (serviceScript) {
84
84
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
85
85
  if (generatePosition !== undefined) {
86
- const edits = getFormattingEditsAfterKeystroke(sourceScript.id, generatePosition, key, options);
86
+ const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
87
87
  return edits
88
88
  .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
89
- .filter(utils_1.notEmpty);
89
+ .filter(edit => !!edit);
90
90
  }
91
91
  return [];
92
92
  }
@@ -96,23 +96,23 @@ function decorateLanguageService(language, languageService) {
96
96
  };
97
97
  languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
98
98
  const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
99
- return (0, transform_1.transformFileTextChanges)(undefined, language, edits, language_core_1.isRenameEnabled);
99
+ return (0, transform_1.transformFileTextChanges)(language, edits, language_core_1.isRenameEnabled);
100
100
  };
101
101
  languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
102
102
  const fileName = filePath.replace(windowsPathReg, '/');
103
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
104
- if (sourceScript?.associatedOnly) {
103
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
104
+ if (targetScript?.associatedOnly) {
105
105
  return undefined;
106
106
  }
107
107
  if (serviceScript) {
108
108
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
109
109
  if (generatePosition !== undefined) {
110
- const info = getLinkedEditingRangeAtPosition(sourceScript.id, generatePosition);
110
+ const info = getLinkedEditingRangeAtPosition(targetScript.id, generatePosition);
111
111
  if (info) {
112
112
  return {
113
113
  ranges: info.ranges
114
114
  .map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
115
- .filter(utils_1.notEmpty),
115
+ .filter(span => !!span),
116
116
  wordPattern: info.wordPattern,
117
117
  };
118
118
  }
@@ -124,19 +124,19 @@ function decorateLanguageService(language, languageService) {
124
124
  };
125
125
  languageService.prepareCallHierarchy = (filePath, position) => {
126
126
  const fileName = filePath.replace(windowsPathReg, '/');
127
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
128
- if (sourceScript?.associatedOnly) {
127
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
128
+ if (targetScript?.associatedOnly) {
129
129
  return undefined;
130
130
  }
131
131
  if (serviceScript) {
132
132
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
133
133
  if (generatePosition !== undefined) {
134
- const item = prepareCallHierarchy(sourceScript.id, generatePosition);
134
+ const item = prepareCallHierarchy(targetScript.id, generatePosition);
135
135
  if (Array.isArray(item)) {
136
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(undefined, language, item, language_core_1.isCallHierarchyEnabled));
136
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
137
137
  }
138
138
  else if (item) {
139
- return (0, transform_1.transformCallHierarchyItem)(undefined, language, item, language_core_1.isCallHierarchyEnabled);
139
+ return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
140
140
  }
141
141
  }
142
142
  }
@@ -147,14 +147,14 @@ function decorateLanguageService(language, languageService) {
147
147
  languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
148
148
  let calls = [];
149
149
  const fileName = filePath.replace(windowsPathReg, '/');
150
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
151
- if (sourceScript?.associatedOnly) {
150
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
151
+ if (targetScript?.associatedOnly) {
152
152
  return [];
153
153
  }
154
154
  if (serviceScript) {
155
155
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
156
156
  if (generatePosition !== undefined) {
157
- calls = provideCallHierarchyIncomingCalls(sourceScript.id, generatePosition);
157
+ calls = provideCallHierarchyIncomingCalls(targetScript.id, generatePosition);
158
158
  }
159
159
  }
160
160
  else {
@@ -162,10 +162,10 @@ function decorateLanguageService(language, languageService) {
162
162
  }
163
163
  return calls
164
164
  .map(call => {
165
- const from = (0, transform_1.transformCallHierarchyItem)(undefined, language, call.from, language_core_1.isCallHierarchyEnabled);
165
+ const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
166
166
  const fromSpans = call.fromSpans
167
- .map(span => (0, transform_1.transformSpan)(undefined, language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
168
- .filter(utils_1.notEmpty);
167
+ .map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
168
+ .filter(span => !!span);
169
169
  return {
170
170
  from,
171
171
  fromSpans,
@@ -175,14 +175,14 @@ function decorateLanguageService(language, languageService) {
175
175
  languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
176
176
  let calls = [];
177
177
  const fileName = filePath.replace(windowsPathReg, '/');
178
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
179
- if (sourceScript?.associatedOnly) {
178
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
179
+ if (targetScript?.associatedOnly) {
180
180
  return [];
181
181
  }
182
182
  if (serviceScript) {
183
183
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
184
184
  if (generatePosition !== undefined) {
185
- calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
185
+ calls = provideCallHierarchyOutgoingCalls(targetScript.id, generatePosition);
186
186
  }
187
187
  }
188
188
  else {
@@ -190,12 +190,12 @@ function decorateLanguageService(language, languageService) {
190
190
  }
191
191
  return calls
192
192
  .map(call => {
193
- const to = (0, transform_1.transformCallHierarchyItem)(undefined, language, call.to, language_core_1.isCallHierarchyEnabled);
193
+ const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
194
194
  const fromSpans = call.fromSpans
195
195
  .map(span => serviceScript
196
196
  ? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
197
197
  : span)
198
- .filter(utils_1.notEmpty);
198
+ .filter(span => !!span);
199
199
  return {
200
200
  to,
201
201
  fromSpans,
@@ -204,18 +204,18 @@ function decorateLanguageService(language, languageService) {
204
204
  };
205
205
  languageService.organizeImports = (args, formatOptions, preferences) => {
206
206
  const unresolved = organizeImports(args, formatOptions, preferences);
207
- return (0, transform_1.transformFileTextChanges)(undefined, language, unresolved, language_core_1.isCodeActionsEnabled);
207
+ return (0, transform_1.transformFileTextChanges)(language, unresolved, language_core_1.isCodeActionsEnabled);
208
208
  };
209
209
  languageService.getQuickInfoAtPosition = (filePath, position) => {
210
210
  const fileName = filePath.replace(windowsPathReg, '/');
211
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
212
- if (sourceScript?.associatedOnly) {
211
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
212
+ if (targetScript?.associatedOnly) {
213
213
  return undefined;
214
214
  }
215
215
  if (serviceScript) {
216
216
  const infos = [];
217
217
  for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
218
- const info = getQuickInfoAtPosition(sourceScript.id, generatePosition);
218
+ const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
219
219
  if (info) {
220
220
  const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
221
221
  if (textSpan) {
@@ -271,14 +271,14 @@ function decorateLanguageService(language, languageService) {
271
271
  };
272
272
  languageService.getSignatureHelpItems = (filePath, position, options) => {
273
273
  const fileName = filePath.replace(windowsPathReg, '/');
274
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
275
- if (sourceScript?.associatedOnly) {
274
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
275
+ if (targetScript?.associatedOnly) {
276
276
  return undefined;
277
277
  }
278
278
  if (serviceScript) {
279
279
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
280
280
  if (generatePosition !== undefined) {
281
- const result = getSignatureHelpItems(sourceScript.id, generatePosition, options);
281
+ const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
282
282
  if (result) {
283
283
  const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
284
284
  if (applicableSpan) {
@@ -310,36 +310,37 @@ function decorateLanguageService(language, languageService) {
310
310
  ...highlights,
311
311
  highlightSpans: highlights.highlightSpans
312
312
  .map(span => {
313
- const { textSpan } = (0, transform_1.transformSpan)(undefined, language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
313
+ const { textSpan } = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
314
314
  if (textSpan) {
315
315
  return {
316
316
  ...span,
317
- contextSpan: (0, transform_1.transformSpan)(undefined, language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
317
+ contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
318
318
  textSpan,
319
319
  };
320
320
  }
321
321
  })
322
- .filter(utils_1.notEmpty),
322
+ .filter(span => !!span),
323
323
  };
324
324
  });
325
325
  return resolved;
326
326
  };
327
327
  languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
328
328
  const fileName = filePath.replace(windowsPathReg, '/');
329
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
330
- if (sourceScript?.associatedOnly) {
329
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
330
+ if (targetScript?.associatedOnly) {
331
331
  return [];
332
332
  }
333
333
  if (serviceScript) {
334
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
335
- if (generatePosition !== undefined) {
336
- const por = typeof positionOrRange === 'number'
337
- ? generatePosition
338
- : {
339
- pos: generatePosition,
340
- end: generatePosition + positionOrRange.end - positionOrRange.pos,
341
- };
342
- return getApplicableRefactors(sourceScript.id, por, preferences, triggerReason, kind, includeInteractiveActions);
334
+ if (typeof positionOrRange === 'number') {
335
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, positionOrRange, language_core_1.isCodeActionsEnabled);
336
+ if (generatePosition !== undefined) {
337
+ return getApplicableRefactors(targetScript.id, generatePosition, preferences, triggerReason, kind, includeInteractiveActions);
338
+ }
339
+ }
340
+ else {
341
+ for (const [generatedStart, generatedEnd] of (0, transform_1.toGeneratedRanges)(language, serviceScript, sourceScript, positionOrRange.pos, positionOrRange.end, language_core_1.isCodeActionsEnabled)) {
342
+ return getApplicableRefactors(targetScript.id, { pos: generatedStart, end: generatedEnd }, preferences, triggerReason, kind, includeInteractiveActions);
343
+ }
343
344
  }
344
345
  return [];
345
346
  }
@@ -350,36 +351,35 @@ function decorateLanguageService(language, languageService) {
350
351
  languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
351
352
  let edits;
352
353
  const fileName = filePath.replace(windowsPathReg, '/');
353
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
354
- if (sourceScript?.associatedOnly) {
354
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
355
+ if (targetScript?.associatedOnly) {
355
356
  return undefined;
356
357
  }
357
358
  if (serviceScript) {
358
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number'
359
- ? positionOrRange
360
- : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
361
- if (generatePosition !== undefined) {
362
- const por = typeof positionOrRange === 'number'
363
- ? generatePosition
364
- : {
365
- pos: generatePosition,
366
- end: generatePosition + positionOrRange.end - positionOrRange.pos,
367
- };
368
- edits = getEditsForRefactor(sourceScript.id, formatOptions, por, refactorName, actionName, preferences);
359
+ if (typeof positionOrRange === 'number') {
360
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, positionOrRange, language_core_1.isCodeActionsEnabled);
361
+ if (generatePosition !== undefined) {
362
+ edits = getEditsForRefactor(targetScript.id, formatOptions, generatePosition, refactorName, actionName, preferences);
363
+ }
364
+ }
365
+ else {
366
+ for (const [generatedStart, generatedEnd] of (0, transform_1.toGeneratedRanges)(language, serviceScript, sourceScript, positionOrRange.pos, positionOrRange.end, language_core_1.isCodeActionsEnabled)) {
367
+ edits = getEditsForRefactor(targetScript.id, formatOptions, { pos: generatedStart, end: generatedEnd }, refactorName, actionName, preferences);
368
+ }
369
369
  }
370
370
  }
371
371
  else {
372
372
  edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
373
373
  }
374
374
  if (edits) {
375
- edits.edits = (0, transform_1.transformFileTextChanges)(undefined, language, edits.edits, language_core_1.isCodeActionsEnabled);
375
+ edits.edits = (0, transform_1.transformFileTextChanges)(language, edits.edits, language_core_1.isCodeActionsEnabled);
376
376
  return edits;
377
377
  }
378
378
  };
379
379
  languageService.getRenameInfo = (filePath, position, options) => {
380
380
  const fileName = filePath.replace(windowsPathReg, '/');
381
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
382
- if (sourceScript?.associatedOnly) {
381
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
382
+ if (targetScript?.associatedOnly) {
383
383
  return {
384
384
  canRename: false,
385
385
  localizedErrorMessage: "Cannot rename"
@@ -388,7 +388,7 @@ function decorateLanguageService(language, languageService) {
388
388
  if (serviceScript) {
389
389
  let failed;
390
390
  for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
391
- const info = getRenameInfo(sourceScript.id, generateOffset, options);
391
+ const info = getRenameInfo(targetScript.id, generateOffset, options);
392
392
  if (info.canRename) {
393
393
  const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
394
394
  if (span) {
@@ -415,30 +415,30 @@ function decorateLanguageService(language, languageService) {
415
415
  languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
416
416
  let fixes = [];
417
417
  const fileName = filePath.replace(windowsPathReg, '/');
418
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
419
- if (sourceScript?.associatedOnly) {
418
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
419
+ if (targetScript?.associatedOnly) {
420
420
  return [];
421
421
  }
422
422
  if (serviceScript) {
423
423
  const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
424
424
  const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
425
425
  if (generateStart !== undefined && generateEnd !== undefined) {
426
- fixes = getCodeFixesAtPosition(sourceScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
426
+ fixes = getCodeFixesAtPosition(targetScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
427
427
  }
428
428
  }
429
429
  else {
430
430
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
431
431
  }
432
432
  fixes = fixes.map(fix => {
433
- fix.changes = (0, transform_1.transformFileTextChanges)(undefined, language, fix.changes, language_core_1.isCodeActionsEnabled);
433
+ fix.changes = (0, transform_1.transformFileTextChanges)(language, fix.changes, language_core_1.isCodeActionsEnabled);
434
434
  return fix;
435
435
  });
436
436
  return fixes;
437
437
  };
438
438
  languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
439
439
  const fileName = filePath.replace(windowsPathReg, '/');
440
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
441
- if (sourceScript?.associatedOnly) {
440
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
441
+ if (targetScript?.associatedOnly) {
442
442
  return {
443
443
  spans: [],
444
444
  endOfLineState: 0
@@ -447,7 +447,7 @@ function decorateLanguageService(language, languageService) {
447
447
  if (serviceScript) {
448
448
  let start;
449
449
  let end;
450
- const map = language.maps.get(serviceScript.code, sourceScript);
450
+ const map = language.maps.get(serviceScript.code, targetScript);
451
451
  for (const mapping of map.mappings) {
452
452
  // TODO reuse the logic from language service
453
453
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
@@ -458,23 +458,16 @@ function decorateLanguageService(language, languageService) {
458
458
  }
459
459
  }
460
460
  start ??= 0;
461
- end ??= sourceScript.snapshot.getLength();
461
+ end ??= targetScript.snapshot.getLength();
462
462
  const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
463
463
  start += mappingOffset;
464
464
  end += mappingOffset;
465
- const result = getEncodedSemanticClassifications(sourceScript.id, { start, length: end - start }, format);
465
+ const result = getEncodedSemanticClassifications(targetScript.id, { start, length: end - start }, format);
466
466
  const spans = [];
467
467
  for (let i = 0; i < result.spans.length; i += 3) {
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)) {
470
- if (sourceStart[0] === sourceEnd[0] && sourceEnd[1] >= sourceStart[1]) {
471
- spans.push(sourceStart[1], sourceEnd[1] - sourceStart[1], result.spans[i + 2]);
472
- break;
473
- }
474
- }
475
- if (spans.length) {
476
- break;
477
- }
468
+ for (const [_, sourceStart, sourceEnd] of (0, transform_1.toSourceRanges)(sourceScript, language, serviceScript, result.spans[i], result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
469
+ spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
470
+ break;
478
471
  }
479
472
  }
480
473
  result.spans = spans;
@@ -486,33 +479,36 @@ function decorateLanguageService(language, languageService) {
486
479
  };
487
480
  languageService.getSyntacticDiagnostics = filePath => {
488
481
  const fileName = filePath.replace(windowsPathReg, '/');
489
- const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
490
- if (sourceScript?.associatedOnly) {
482
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
483
+ if (targetScript?.associatedOnly) {
491
484
  return [];
492
485
  }
493
- return getSyntacticDiagnostics(fileName)
494
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
495
- .filter(utils_1.notEmpty);
486
+ return getSyntacticDiagnostics(targetScript?.id ?? fileName)
487
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
488
+ .filter(d => !!d)
489
+ .filter(d => !serviceScript || language.scripts.get(d.file.fileName) === sourceScript);
496
490
  };
497
491
  languageService.getSemanticDiagnostics = filePath => {
498
492
  const fileName = filePath.replace(windowsPathReg, '/');
499
- const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
500
- if (sourceScript?.associatedOnly) {
493
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
494
+ if (targetScript?.associatedOnly) {
501
495
  return [];
502
496
  }
503
- return getSemanticDiagnostics(fileName)
504
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
505
- .filter(utils_1.notEmpty);
497
+ return getSemanticDiagnostics(targetScript?.id ?? fileName)
498
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
499
+ .filter(d => !!d)
500
+ .filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
506
501
  };
507
502
  languageService.getSuggestionDiagnostics = filePath => {
508
503
  const fileName = filePath.replace(windowsPathReg, '/');
509
- const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
510
- if (sourceScript?.associatedOnly) {
504
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
505
+ if (targetScript?.associatedOnly) {
511
506
  return [];
512
507
  }
513
- return getSuggestionDiagnostics(fileName)
514
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
515
- .filter(utils_1.notEmpty);
508
+ return getSuggestionDiagnostics(targetScript?.id ?? fileName)
509
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
510
+ .filter(d => !!d)
511
+ .filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
516
512
  };
517
513
  languageService.getDefinitionAndBoundSpan = (filePath, position) => {
518
514
  const fileName = filePath.replace(windowsPathReg, '/');
@@ -522,16 +518,16 @@ function decorateLanguageService(language, languageService) {
522
518
  }
523
519
  });
524
520
  const textSpan = unresolved
525
- .map(s => (0, transform_1.transformSpan)(undefined, language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
526
- .filter(utils_1.notEmpty)[0];
521
+ .map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
522
+ .filter(s => !!s)[0];
527
523
  if (!textSpan) {
528
524
  return;
529
525
  }
530
526
  const definitions = unresolved
531
527
  .map(s => s.definitions
532
- ?.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
533
- .filter(utils_1.notEmpty))
534
- .filter(utils_1.notEmpty)
528
+ ?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
529
+ .filter(s => !!s)
530
+ ?? [])
535
531
  .flat();
536
532
  return {
537
533
  textSpan,
@@ -550,12 +546,12 @@ function decorateLanguageService(language, languageService) {
550
546
  const resolved = unresolved
551
547
  .flat()
552
548
  .map(symbol => {
553
- const definition = (0, transform_1.transformDocumentSpan)(undefined, language, symbol.definition, language_core_1.isDefinitionEnabled, true);
549
+ const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
554
550
  return {
555
551
  definition,
556
552
  references: symbol.references
557
- .map(r => (0, transform_1.transformDocumentSpan)(undefined, language, r, language_core_1.isReferencesEnabled))
558
- .filter(utils_1.notEmpty),
553
+ .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
554
+ .filter(r => !!r),
559
555
  };
560
556
  });
561
557
  return resolved;
@@ -569,8 +565,8 @@ function decorateLanguageService(language, languageService) {
569
565
  });
570
566
  const resolved = unresolved
571
567
  .flat()
572
- .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
573
- .filter(utils_1.notEmpty);
568
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
569
+ .filter(s => !!s);
574
570
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
575
571
  };
576
572
  languageService.getTypeDefinitionAtPosition = (filePath, position) => {
@@ -582,8 +578,8 @@ function decorateLanguageService(language, languageService) {
582
578
  });
583
579
  const resolved = unresolved
584
580
  .flat()
585
- .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isTypeDefinitionEnabled))
586
- .filter(utils_1.notEmpty);
581
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
582
+ .filter(s => !!s);
587
583
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
588
584
  };
589
585
  languageService.getImplementationAtPosition = (filePath, position) => {
@@ -595,8 +591,8 @@ function decorateLanguageService(language, languageService) {
595
591
  });
596
592
  const resolved = unresolved
597
593
  .flat()
598
- .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isImplementationEnabled))
599
- .filter(utils_1.notEmpty);
594
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
595
+ .filter(s => !!s);
600
596
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
601
597
  };
602
598
  languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
@@ -608,8 +604,8 @@ function decorateLanguageService(language, languageService) {
608
604
  });
609
605
  const resolved = unresolved
610
606
  .flat()
611
- .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isRenameEnabled))
612
- .filter(utils_1.notEmpty);
607
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
608
+ .filter(s => !!s);
613
609
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
614
610
  };
615
611
  languageService.getReferencesAtPosition = (filePath, position) => {
@@ -621,20 +617,20 @@ function decorateLanguageService(language, languageService) {
621
617
  });
622
618
  const resolved = unresolved
623
619
  .flat()
624
- .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isReferencesEnabled))
625
- .filter(utils_1.notEmpty);
620
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
621
+ .filter(s => !!s);
626
622
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
627
623
  };
628
624
  languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
629
625
  const fileName = filePath.replace(windowsPathReg, '/');
630
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
631
- if (sourceScript?.associatedOnly) {
626
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
627
+ if (targetScript?.associatedOnly) {
632
628
  return undefined;
633
629
  }
634
630
  if (serviceScript) {
635
631
  const results = [];
636
632
  for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
637
- const result = getCompletionsAtPosition(sourceScript.id, generatedOffset, options, formattingSettings);
633
+ const result = getCompletionsAtPosition(targetScript.id, generatedOffset, options, formattingSettings);
638
634
  if (!result) {
639
635
  continue;
640
636
  }
@@ -670,14 +666,14 @@ function decorateLanguageService(language, languageService) {
670
666
  languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
671
667
  let details;
672
668
  const fileName = filePath.replace(windowsPathReg, '/');
673
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
674
- if (sourceScript?.associatedOnly) {
669
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
670
+ if (targetScript?.associatedOnly) {
675
671
  return undefined;
676
672
  }
677
673
  if (serviceScript) {
678
674
  const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
679
675
  if (generatePosition !== undefined) {
680
- details = getCompletionEntryDetails(sourceScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
676
+ details = getCompletionEntryDetails(targetScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
681
677
  }
682
678
  }
683
679
  else {
@@ -685,21 +681,21 @@ function decorateLanguageService(language, languageService) {
685
681
  }
686
682
  if (details?.codeActions) {
687
683
  for (const codeAction of details.codeActions) {
688
- codeAction.changes = (0, transform_1.transformFileTextChanges)(undefined, language, codeAction.changes, language_core_1.isCompletionEnabled);
684
+ codeAction.changes = (0, transform_1.transformFileTextChanges)(language, codeAction.changes, language_core_1.isCompletionEnabled);
689
685
  }
690
686
  }
691
687
  return details;
692
688
  };
693
689
  languageService.provideInlayHints = (filePath, span, preferences) => {
694
690
  const fileName = filePath.replace(windowsPathReg, '/');
695
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
696
- if (sourceScript?.associatedOnly) {
691
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
692
+ if (targetScript?.associatedOnly) {
697
693
  return [];
698
694
  }
699
695
  if (serviceScript) {
700
696
  let start;
701
697
  let end;
702
- const map = language.maps.get(serviceScript.code, sourceScript);
698
+ const map = language.maps.get(serviceScript.code, targetScript);
703
699
  for (const mapping of map.mappings) {
704
700
  if ((0, language_core_1.isInlayHintsEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
705
701
  start ??= mapping.generatedOffsets[0];
@@ -715,7 +711,7 @@ function decorateLanguageService(language, languageService) {
715
711
  const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
716
712
  start += mappingOffset;
717
713
  end += mappingOffset;
718
- const result = provideInlayHints(sourceScript.id, { start, length: end - start }, preferences);
714
+ const result = provideInlayHints(targetScript.id, { start, length: end - start }, preferences);
719
715
  const hints = [];
720
716
  for (const hint of result) {
721
717
  const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
@@ -736,17 +732,17 @@ function decorateLanguageService(language, languageService) {
736
732
  const fileName = filePath.replace(windowsPathReg, '/');
737
733
  const unresolved = getFileReferences(fileName);
738
734
  const resolved = unresolved
739
- .map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isReferencesEnabled))
740
- .filter(utils_1.notEmpty);
735
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
736
+ .filter(s => !!s);
741
737
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
742
738
  };
743
739
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
744
740
  const results = [];
745
741
  const processedFilePositions = new Set();
746
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
742
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
747
743
  if (serviceScript) {
748
744
  for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
749
- process(sourceScript.id, generatedOffset);
745
+ process(targetScript.id, generatedOffset);
750
746
  }
751
747
  }
752
748
  else {
@@ -781,7 +777,6 @@ function decorateLanguageService(language, languageService) {
781
777
  }
782
778
  }
783
779
  }
784
- exports.decorateLanguageService = decorateLanguageService;
785
780
  function displayPartsToString(displayParts) {
786
781
  if (displayParts) {
787
782
  return displayParts.map(displayPart => displayPart.text).join('');