@volar/typescript 2.3.0-alpha.1 → 2.3.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,17 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decorateLanguageService = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const dedupe_1 = require("./dedupe");
6
- const utils_1 = require("./utils");
7
6
  const transform_1 = require("./transform");
7
+ const utils_1 = require("./utils");
8
8
  const windowsPathReg = /\\/g;
9
9
  function decorateLanguageService(language, languageService) {
10
10
  // ignored methods
11
11
  const { getNavigationTree, getOutliningSpans, } = languageService;
12
12
  languageService.getNavigationTree = filePath => {
13
13
  const fileName = filePath.replace(windowsPathReg, '/');
14
- const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
15
- if (serviceScript) {
16
- const tree = getNavigationTree(fileName);
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] = (0, utils_1.getServiceScript)(language, fileName);
27
- if (serviceScript) {
26
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
27
+ if (serviceScript || targetScript?.associatedOnly) {
28
28
  return [];
29
29
  }
30
30
  else {
@@ -35,14 +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, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
39
+ if (targetScript?.associatedOnly) {
40
+ return [];
41
+ }
39
42
  if (serviceScript) {
43
+ const map = language.maps.get(serviceScript.code, targetScript);
40
44
  if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
41
45
  return [];
42
46
  }
43
- const edits = getFormattingEditsForDocument(fileName, options);
47
+ const edits = getFormattingEditsForDocument(targetScript.id, options);
44
48
  return edits
45
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
49
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
46
50
  .filter(utils_1.notEmpty);
47
51
  }
48
52
  else {
@@ -51,14 +55,17 @@ function decorateLanguageService(language, languageService) {
51
55
  };
52
56
  languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
53
57
  const fileName = filePath.replace(windowsPathReg, '/');
54
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
58
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
59
+ if (targetScript?.associatedOnly) {
60
+ return [];
61
+ }
55
62
  if (serviceScript) {
56
- const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
57
- const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
63
+ const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, start, language_core_1.isFormattingEnabled);
64
+ const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, end, language_core_1.isFormattingEnabled);
58
65
  if (generateStart !== undefined && generateEnd !== undefined) {
59
- const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
66
+ const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
60
67
  return edits
61
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
68
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
62
69
  .filter(utils_1.notEmpty);
63
70
  }
64
71
  return [];
@@ -69,13 +76,16 @@ function decorateLanguageService(language, languageService) {
69
76
  };
70
77
  languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
71
78
  const fileName = filePath.replace(windowsPathReg, '/');
72
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
79
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
80
+ if (targetScript?.associatedOnly) {
81
+ return [];
82
+ }
73
83
  if (serviceScript) {
74
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
84
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isFormattingEnabled);
75
85
  if (generatePosition !== undefined) {
76
- const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
86
+ const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
77
87
  return edits
78
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
88
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
79
89
  .filter(utils_1.notEmpty);
80
90
  }
81
91
  return [];
@@ -86,21 +96,22 @@ function decorateLanguageService(language, languageService) {
86
96
  };
87
97
  languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
88
98
  const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
89
- return edits
90
- .map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
91
- .filter(utils_1.notEmpty);
99
+ return (0, transform_1.transformFileTextChanges)(language, edits, language_core_1.isRenameEnabled);
92
100
  };
93
101
  languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
94
102
  const fileName = filePath.replace(windowsPathReg, '/');
95
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
103
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
104
+ if (targetScript?.associatedOnly) {
105
+ return undefined;
106
+ }
96
107
  if (serviceScript) {
97
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
108
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isLinkedEditingEnabled);
98
109
  if (generatePosition !== undefined) {
99
- const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
110
+ const info = getLinkedEditingRangeAtPosition(targetScript.id, generatePosition);
100
111
  if (info) {
101
112
  return {
102
113
  ranges: info.ranges
103
- .map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
114
+ .map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
104
115
  .filter(utils_1.notEmpty),
105
116
  wordPattern: info.wordPattern,
106
117
  };
@@ -113,11 +124,14 @@ function decorateLanguageService(language, languageService) {
113
124
  };
114
125
  languageService.prepareCallHierarchy = (filePath, position) => {
115
126
  const fileName = filePath.replace(windowsPathReg, '/');
116
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
127
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
128
+ if (targetScript?.associatedOnly) {
129
+ return undefined;
130
+ }
117
131
  if (serviceScript) {
118
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
132
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCallHierarchyEnabled);
119
133
  if (generatePosition !== undefined) {
120
- const item = prepareCallHierarchy(fileName, generatePosition);
134
+ const item = prepareCallHierarchy(targetScript.id, generatePosition);
121
135
  if (Array.isArray(item)) {
122
136
  return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
123
137
  }
@@ -133,11 +147,14 @@ function decorateLanguageService(language, languageService) {
133
147
  languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
134
148
  let calls = [];
135
149
  const fileName = filePath.replace(windowsPathReg, '/');
136
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
150
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
151
+ if (targetScript?.associatedOnly) {
152
+ return [];
153
+ }
137
154
  if (serviceScript) {
138
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
155
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCallHierarchyEnabled);
139
156
  if (generatePosition !== undefined) {
140
- calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
157
+ calls = provideCallHierarchyIncomingCalls(targetScript.id, generatePosition);
141
158
  }
142
159
  }
143
160
  else {
@@ -158,9 +175,12 @@ function decorateLanguageService(language, languageService) {
158
175
  languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
159
176
  let calls = [];
160
177
  const fileName = filePath.replace(windowsPathReg, '/');
161
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
178
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
179
+ if (targetScript?.associatedOnly) {
180
+ return [];
181
+ }
162
182
  if (serviceScript) {
163
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
183
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCallHierarchyEnabled);
164
184
  if (generatePosition !== undefined) {
165
185
  calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
166
186
  }
@@ -172,8 +192,8 @@ function decorateLanguageService(language, languageService) {
172
192
  .map(call => {
173
193
  const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
174
194
  const fromSpans = call.fromSpans
175
- .map(span => sourceScript
176
- ? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
195
+ .map(span => serviceScript
196
+ ? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
177
197
  : span)
178
198
  .filter(utils_1.notEmpty);
179
199
  return {
@@ -184,27 +204,24 @@ function decorateLanguageService(language, languageService) {
184
204
  };
185
205
  languageService.organizeImports = (args, formatOptions, preferences) => {
186
206
  const unresolved = organizeImports(args, formatOptions, preferences);
187
- const resolved = unresolved
188
- .map(changes => (0, transform_1.transformFileTextChanges)(language, changes, language_core_1.isCodeActionsEnabled))
189
- .filter(utils_1.notEmpty);
190
- return resolved;
207
+ return (0, transform_1.transformFileTextChanges)(language, unresolved, language_core_1.isCodeActionsEnabled);
191
208
  };
192
209
  languageService.getQuickInfoAtPosition = (filePath, position) => {
193
210
  const fileName = filePath.replace(windowsPathReg, '/');
194
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
211
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
212
+ if (targetScript?.associatedOnly) {
213
+ return undefined;
214
+ }
195
215
  if (serviceScript) {
196
216
  const infos = [];
197
- for (const [generatePosition, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
198
- if (!(0, language_core_1.isHoverEnabled)(mapping.data)) {
199
- continue;
200
- }
201
- const info = getQuickInfoAtPosition(fileName, generatePosition);
217
+ for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isHoverEnabled)) {
218
+ const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
202
219
  if (info) {
203
- const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, info.textSpan, language_core_1.isHoverEnabled);
220
+ const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
204
221
  if (textSpan) {
205
222
  infos.push({
206
223
  ...info,
207
- textSpan,
224
+ textSpan: textSpan,
208
225
  });
209
226
  }
210
227
  }
@@ -254,13 +271,16 @@ function decorateLanguageService(language, languageService) {
254
271
  };
255
272
  languageService.getSignatureHelpItems = (filePath, position, options) => {
256
273
  const fileName = filePath.replace(windowsPathReg, '/');
257
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
274
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
275
+ if (targetScript?.associatedOnly) {
276
+ return undefined;
277
+ }
258
278
  if (serviceScript) {
259
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
279
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isSignatureHelpEnabled);
260
280
  if (generatePosition !== undefined) {
261
- const result = getSignatureHelpItems(fileName, generatePosition, options);
281
+ const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
262
282
  if (result) {
263
- const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
283
+ const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
264
284
  if (applicableSpan) {
265
285
  return {
266
286
  ...result,
@@ -276,7 +296,7 @@ function decorateLanguageService(language, languageService) {
276
296
  };
277
297
  languageService.getDocumentHighlights = (filePath, position, filesToSearch) => {
278
298
  const fileName = filePath.replace(windowsPathReg, '/');
279
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, position => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
299
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
280
300
  for (const ref of result) {
281
301
  for (const reference of ref.highlightSpans) {
282
302
  yield [reference.fileName ?? ref.fileName, reference.textSpan.start];
@@ -290,7 +310,7 @@ function decorateLanguageService(language, languageService) {
290
310
  ...highlights,
291
311
  highlightSpans: highlights.highlightSpans
292
312
  .map(span => {
293
- const textSpan = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
313
+ const { textSpan } = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
294
314
  if (textSpan) {
295
315
  return {
296
316
  ...span,
@@ -306,9 +326,12 @@ function decorateLanguageService(language, languageService) {
306
326
  };
307
327
  languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
308
328
  const fileName = filePath.replace(windowsPathReg, '/');
309
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
329
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
330
+ if (targetScript?.associatedOnly) {
331
+ return [];
332
+ }
310
333
  if (serviceScript) {
311
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
334
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
312
335
  if (generatePosition !== undefined) {
313
336
  const por = typeof positionOrRange === 'number'
314
337
  ? generatePosition
@@ -316,7 +339,7 @@ function decorateLanguageService(language, languageService) {
316
339
  pos: generatePosition,
317
340
  end: generatePosition + positionOrRange.end - positionOrRange.pos,
318
341
  };
319
- return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
342
+ return getApplicableRefactors(targetScript.id, por, preferences, triggerReason, kind, includeInteractiveActions);
320
343
  }
321
344
  return [];
322
345
  }
@@ -327,9 +350,12 @@ function decorateLanguageService(language, languageService) {
327
350
  languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
328
351
  let edits;
329
352
  const fileName = filePath.replace(windowsPathReg, '/');
330
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
353
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
354
+ if (targetScript?.associatedOnly) {
355
+ return undefined;
356
+ }
331
357
  if (serviceScript) {
332
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
358
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, typeof positionOrRange === 'number'
333
359
  ? positionOrRange
334
360
  : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
335
361
  if (generatePosition !== undefined) {
@@ -339,31 +365,32 @@ function decorateLanguageService(language, languageService) {
339
365
  pos: generatePosition,
340
366
  end: generatePosition + positionOrRange.end - positionOrRange.pos,
341
367
  };
342
- edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
368
+ edits = getEditsForRefactor(targetScript.id, formatOptions, por, refactorName, actionName, preferences);
343
369
  }
344
370
  }
345
371
  else {
346
372
  edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
347
373
  }
348
374
  if (edits) {
349
- edits.edits = edits.edits
350
- .map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled))
351
- .filter(utils_1.notEmpty);
375
+ edits.edits = (0, transform_1.transformFileTextChanges)(language, edits.edits, language_core_1.isCodeActionsEnabled);
352
376
  return edits;
353
377
  }
354
378
  };
355
379
  languageService.getRenameInfo = (filePath, position, options) => {
356
380
  const fileName = filePath.replace(windowsPathReg, '/');
357
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
381
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
382
+ if (targetScript?.associatedOnly) {
383
+ return {
384
+ canRename: false,
385
+ localizedErrorMessage: "Cannot rename"
386
+ };
387
+ }
358
388
  if (serviceScript) {
359
389
  let failed;
360
- for (const [generateOffset, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
361
- if (!(0, language_core_1.isRenameEnabled)(mapping.data)) {
362
- continue;
363
- }
364
- const info = getRenameInfo(fileName, generateOffset, options);
390
+ for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isRenameEnabled)) {
391
+ const info = getRenameInfo(targetScript.id, generateOffset, options);
365
392
  if (info.canRename) {
366
- const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
393
+ const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
367
394
  if (span) {
368
395
  info.triggerSpan = span;
369
396
  return info;
@@ -388,29 +415,39 @@ function decorateLanguageService(language, languageService) {
388
415
  languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
389
416
  let fixes = [];
390
417
  const fileName = filePath.replace(windowsPathReg, '/');
391
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
418
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
419
+ if (targetScript?.associatedOnly) {
420
+ return [];
421
+ }
392
422
  if (serviceScript) {
393
- const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
394
- const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
423
+ const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, start, language_core_1.isCodeActionsEnabled);
424
+ const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, end, language_core_1.isCodeActionsEnabled);
395
425
  if (generateStart !== undefined && generateEnd !== undefined) {
396
- fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
426
+ fixes = getCodeFixesAtPosition(targetScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
397
427
  }
398
428
  }
399
429
  else {
400
430
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
401
431
  }
402
432
  fixes = fixes.map(fix => {
403
- fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
433
+ fix.changes = (0, transform_1.transformFileTextChanges)(language, fix.changes, language_core_1.isCodeActionsEnabled);
404
434
  return fix;
405
435
  });
406
436
  return fixes;
407
437
  };
408
438
  languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
409
439
  const fileName = filePath.replace(windowsPathReg, '/');
410
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
440
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
441
+ if (targetScript?.associatedOnly) {
442
+ return {
443
+ spans: [],
444
+ endOfLineState: 0
445
+ };
446
+ }
411
447
  if (serviceScript) {
412
448
  let start;
413
449
  let end;
450
+ const map = language.maps.get(serviceScript.code, targetScript);
414
451
  for (const mapping of map.mappings) {
415
452
  // TODO reuse the logic from language service
416
453
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
@@ -421,16 +458,23 @@ function decorateLanguageService(language, languageService) {
421
458
  }
422
459
  }
423
460
  start ??= 0;
424
- end ??= sourceScript.snapshot.getLength();
425
- start += sourceScript.snapshot.getLength();
426
- end += sourceScript.snapshot.getLength();
427
- const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
461
+ end ??= targetScript.snapshot.getLength();
462
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
463
+ start += mappingOffset;
464
+ end += mappingOffset;
465
+ const result = getEncodedSemanticClassifications(targetScript.id, { start, length: end - start }, format);
428
466
  const spans = [];
429
467
  for (let i = 0; i < result.spans.length; i += 3) {
430
- const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
431
- const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
432
- if (sourceStart !== undefined && sourceEnd !== undefined) {
433
- spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
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
+ }
434
478
  }
435
479
  }
436
480
  result.spans = spans;
@@ -442,25 +486,37 @@ function decorateLanguageService(language, languageService) {
442
486
  };
443
487
  languageService.getSyntacticDiagnostics = filePath => {
444
488
  const fileName = filePath.replace(windowsPathReg, '/');
489
+ const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
490
+ if (targetScript?.associatedOnly) {
491
+ return [];
492
+ }
445
493
  return getSyntacticDiagnostics(fileName)
446
- .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
494
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
447
495
  .filter(utils_1.notEmpty);
448
496
  };
449
497
  languageService.getSemanticDiagnostics = filePath => {
450
498
  const fileName = filePath.replace(windowsPathReg, '/');
499
+ const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
500
+ if (targetScript?.associatedOnly) {
501
+ return [];
502
+ }
451
503
  return getSemanticDiagnostics(fileName)
452
- .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
504
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
453
505
  .filter(utils_1.notEmpty);
454
506
  };
455
507
  languageService.getSuggestionDiagnostics = filePath => {
456
508
  const fileName = filePath.replace(windowsPathReg, '/');
509
+ const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
510
+ if (targetScript?.associatedOnly) {
511
+ return [];
512
+ }
457
513
  return getSuggestionDiagnostics(fileName)
458
- .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
514
+ .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
459
515
  .filter(utils_1.notEmpty);
460
516
  };
461
517
  languageService.getDefinitionAndBoundSpan = (filePath, position) => {
462
518
  const fileName = filePath.replace(windowsPathReg, '/');
463
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAndBoundSpan(fileName, position), function* (result) {
519
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
464
520
  for (const ref of result.definitions ?? []) {
465
521
  yield [ref.fileName, ref.textSpan.start];
466
522
  }
@@ -484,7 +540,7 @@ function decorateLanguageService(language, languageService) {
484
540
  };
485
541
  languageService.findReferences = (filePath, position) => {
486
542
  const fileName = filePath.replace(windowsPathReg, '/');
487
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => findReferences(fileName, position), function* (result) {
543
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
488
544
  for (const ref of result) {
489
545
  for (const reference of ref.references) {
490
546
  yield [reference.fileName, reference.textSpan.start];
@@ -506,7 +562,7 @@ function decorateLanguageService(language, languageService) {
506
562
  };
507
563
  languageService.getDefinitionAtPosition = (filePath, position) => {
508
564
  const fileName = filePath.replace(windowsPathReg, '/');
509
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAtPosition(fileName, position), function* (result) {
565
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
510
566
  for (const ref of result) {
511
567
  yield [ref.fileName, ref.textSpan.start];
512
568
  }
@@ -519,7 +575,7 @@ function decorateLanguageService(language, languageService) {
519
575
  };
520
576
  languageService.getTypeDefinitionAtPosition = (filePath, position) => {
521
577
  const fileName = filePath.replace(windowsPathReg, '/');
522
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, position => getTypeDefinitionAtPosition(fileName, position), function* (result) {
578
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
523
579
  for (const ref of result) {
524
580
  yield [ref.fileName, ref.textSpan.start];
525
581
  }
@@ -532,7 +588,7 @@ function decorateLanguageService(language, languageService) {
532
588
  };
533
589
  languageService.getImplementationAtPosition = (filePath, position) => {
534
590
  const fileName = filePath.replace(windowsPathReg, '/');
535
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, position => getImplementationAtPosition(fileName, position), function* (result) {
591
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
536
592
  for (const ref of result) {
537
593
  yield [ref.fileName, ref.textSpan.start];
538
594
  }
@@ -545,7 +601,7 @@ function decorateLanguageService(language, languageService) {
545
601
  };
546
602
  languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
547
603
  const fileName = filePath.replace(windowsPathReg, '/');
548
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, position => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
604
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
549
605
  for (const ref of result) {
550
606
  yield [ref.fileName, ref.textSpan.start];
551
607
  }
@@ -558,7 +614,7 @@ function decorateLanguageService(language, languageService) {
558
614
  };
559
615
  languageService.getReferencesAtPosition = (filePath, position) => {
560
616
  const fileName = filePath.replace(windowsPathReg, '/');
561
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => getReferencesAtPosition(fileName, position), function* (result) {
617
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
562
618
  for (const ref of result) {
563
619
  yield [ref.fileName, ref.textSpan.start];
564
620
  }
@@ -571,14 +627,14 @@ function decorateLanguageService(language, languageService) {
571
627
  };
572
628
  languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
573
629
  const fileName = filePath.replace(windowsPathReg, '/');
574
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
630
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
631
+ if (targetScript?.associatedOnly) {
632
+ return undefined;
633
+ }
575
634
  if (serviceScript) {
576
635
  const results = [];
577
- for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
578
- if (!(0, language_core_1.isCompletionEnabled)(mapping.data)) {
579
- continue;
580
- }
581
- const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
636
+ for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isCompletionEnabled)) {
637
+ const result = getCompletionsAtPosition(targetScript.id, generatedOffset, options, formattingSettings);
582
638
  if (!result) {
583
639
  continue;
584
640
  }
@@ -586,10 +642,10 @@ function decorateLanguageService(language, languageService) {
586
642
  result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
587
643
  }
588
644
  for (const entry of result.entries) {
589
- entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
645
+ entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
590
646
  }
591
647
  result.optionalReplacementSpan = result.optionalReplacementSpan
592
- && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
648
+ && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
593
649
  const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
594
650
  if (isAdditional) {
595
651
  results.push(result);
@@ -614,11 +670,14 @@ function decorateLanguageService(language, languageService) {
614
670
  languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
615
671
  let details;
616
672
  const fileName = filePath.replace(windowsPathReg, '/');
617
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
673
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
674
+ if (targetScript?.associatedOnly) {
675
+ return undefined;
676
+ }
618
677
  if (serviceScript) {
619
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
678
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCompletionEnabled);
620
679
  if (generatePosition !== undefined) {
621
- details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
680
+ details = getCompletionEntryDetails(targetScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
622
681
  }
623
682
  }
624
683
  else {
@@ -626,17 +685,21 @@ function decorateLanguageService(language, languageService) {
626
685
  }
627
686
  if (details?.codeActions) {
628
687
  for (const codeAction of details.codeActions) {
629
- codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
688
+ codeAction.changes = (0, transform_1.transformFileTextChanges)(language, codeAction.changes, language_core_1.isCompletionEnabled);
630
689
  }
631
690
  }
632
691
  return details;
633
692
  };
634
693
  languageService.provideInlayHints = (filePath, span, preferences) => {
635
694
  const fileName = filePath.replace(windowsPathReg, '/');
636
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
695
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
696
+ if (targetScript?.associatedOnly) {
697
+ return [];
698
+ }
637
699
  if (serviceScript) {
638
700
  let start;
639
701
  let end;
702
+ const map = language.maps.get(serviceScript.code, targetScript);
640
703
  for (const mapping of map.mappings) {
641
704
  if ((0, language_core_1.isInlayHintsEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
642
705
  start ??= mapping.generatedOffsets[0];
@@ -649,16 +712,17 @@ function decorateLanguageService(language, languageService) {
649
712
  start = 0;
650
713
  end = 0;
651
714
  }
652
- start += sourceScript.snapshot.getLength();
653
- end += sourceScript.snapshot.getLength();
654
- const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
715
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
716
+ start += mappingOffset;
717
+ end += mappingOffset;
718
+ const result = provideInlayHints(targetScript.id, { start, length: end - start }, preferences);
655
719
  const hints = [];
656
720
  for (const hint of result) {
657
- const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
721
+ const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
658
722
  if (sourcePosition !== undefined) {
659
723
  hints.push({
660
724
  ...hint,
661
- position: sourcePosition,
725
+ position: sourcePosition[1],
662
726
  });
663
727
  }
664
728
  }
@@ -679,12 +743,10 @@ function decorateLanguageService(language, languageService) {
679
743
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
680
744
  const results = [];
681
745
  const processedFilePositions = new Set();
682
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
746
+ const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
683
747
  if (serviceScript) {
684
- for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
685
- if (filter(mapping.data)) {
686
- process(fileName, generatedOffset + sourceScript.snapshot.getLength());
687
- }
748
+ for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, filter)) {
749
+ process(targetScript.id, generatedOffset);
688
750
  }
689
751
  }
690
752
  else {
@@ -696,23 +758,24 @@ function decorateLanguageService(language, languageService) {
696
758
  return;
697
759
  }
698
760
  processedFilePositions.add(fileName + ':' + position);
699
- const result = worker(position);
761
+ const result = worker(fileName, position);
700
762
  if (!result) {
701
763
  return;
702
764
  }
703
765
  results.push(result);
704
766
  for (const ref of getLinkedCodes(result)) {
705
767
  processedFilePositions.add(ref[0] + ':' + ref[1]);
706
- const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
707
- if (!virtualFile) {
768
+ const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
769
+ if (!serviceScript) {
708
770
  continue;
709
771
  }
710
- const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
772
+ const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
711
773
  if (!linkedCodeMap) {
712
774
  continue;
713
775
  }
714
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceScript.snapshot.getLength())) {
715
- process(ref[0], linkedCodeOffset + sourceScript.snapshot.getLength());
776
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
777
+ for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
778
+ process(ref[0], linkedCodeOffset + mappingOffset);
716
779
  }
717
780
  }
718
781
  }