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

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.
@@ -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] = (0, utils_1.getServiceScript)(language, fileName);
15
- if (serviceScript) {
16
- const tree = getNavigationTree(fileName);
14
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
15
+ if (serviceScript || sourceScript?.associatedOnly) {
16
+ const tree = getNavigationTree(sourceScript.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, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
27
+ if (serviceScript || sourceScript?.associatedOnly) {
28
28
  return [];
29
29
  }
30
30
  else {
@@ -36,13 +36,16 @@ function decorateLanguageService(language, languageService) {
36
36
  languageService.getFormattingEditsForDocument = (filePath, options) => {
37
37
  const fileName = filePath.replace(windowsPathReg, '/');
38
38
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
39
+ if (sourceScript?.associatedOnly) {
40
+ return [];
41
+ }
39
42
  if (serviceScript) {
40
43
  if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
41
44
  return [];
42
45
  }
43
- const edits = getFormattingEditsForDocument(fileName, options);
46
+ const edits = getFormattingEditsForDocument(sourceScript.id, options);
44
47
  return edits
45
- .map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
48
+ .map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
46
49
  .filter(utils_1.notEmpty);
47
50
  }
48
51
  else {
@@ -52,13 +55,16 @@ function decorateLanguageService(language, languageService) {
52
55
  languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
53
56
  const fileName = filePath.replace(windowsPathReg, '/');
54
57
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
58
+ if (sourceScript?.associatedOnly) {
59
+ return [];
60
+ }
55
61
  if (serviceScript) {
56
62
  const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isFormattingEnabled);
57
63
  const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isFormattingEnabled);
58
64
  if (generateStart !== undefined && generateEnd !== undefined) {
59
- const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
65
+ const edits = getFormattingEditsForRange(sourceScript.id, generateStart, generateEnd, options);
60
66
  return edits
61
- .map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
67
+ .map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
62
68
  .filter(utils_1.notEmpty);
63
69
  }
64
70
  return [];
@@ -70,12 +76,15 @@ function decorateLanguageService(language, languageService) {
70
76
  languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
71
77
  const fileName = filePath.replace(windowsPathReg, '/');
72
78
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
79
+ if (sourceScript?.associatedOnly) {
80
+ return [];
81
+ }
73
82
  if (serviceScript) {
74
83
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isFormattingEnabled);
75
84
  if (generatePosition !== undefined) {
76
- const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
85
+ const edits = getFormattingEditsAfterKeystroke(sourceScript.id, generatePosition, key, options);
77
86
  return edits
78
- .map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
87
+ .map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
79
88
  .filter(utils_1.notEmpty);
80
89
  }
81
90
  return [];
@@ -86,21 +95,22 @@ function decorateLanguageService(language, languageService) {
86
95
  };
87
96
  languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
88
97
  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);
98
+ return (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, edits, language_core_1.isRenameEnabled);
92
99
  };
93
100
  languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
94
101
  const fileName = filePath.replace(windowsPathReg, '/');
95
102
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
103
+ if (sourceScript?.associatedOnly) {
104
+ return undefined;
105
+ }
96
106
  if (serviceScript) {
97
107
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
98
108
  if (generatePosition !== undefined) {
99
- const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
109
+ const info = getLinkedEditingRangeAtPosition(sourceScript.id, generatePosition);
100
110
  if (info) {
101
111
  return {
102
112
  ranges: info.ranges
103
- .map(span => (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
113
+ .map(span => (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
104
114
  .filter(utils_1.notEmpty),
105
115
  wordPattern: info.wordPattern,
106
116
  };
@@ -114,15 +124,18 @@ function decorateLanguageService(language, languageService) {
114
124
  languageService.prepareCallHierarchy = (filePath, position) => {
115
125
  const fileName = filePath.replace(windowsPathReg, '/');
116
126
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
127
+ if (sourceScript?.associatedOnly) {
128
+ return undefined;
129
+ }
117
130
  if (serviceScript) {
118
131
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
119
132
  if (generatePosition !== undefined) {
120
- const item = prepareCallHierarchy(fileName, generatePosition);
133
+ const item = prepareCallHierarchy(sourceScript.id, generatePosition);
121
134
  if (Array.isArray(item)) {
122
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
135
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, item, language_core_1.isCallHierarchyEnabled));
123
136
  }
124
137
  else if (item) {
125
- return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
138
+ return (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, item, language_core_1.isCallHierarchyEnabled);
126
139
  }
127
140
  }
128
141
  }
@@ -134,10 +147,13 @@ function decorateLanguageService(language, languageService) {
134
147
  let calls = [];
135
148
  const fileName = filePath.replace(windowsPathReg, '/');
136
149
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
150
+ if (sourceScript?.associatedOnly) {
151
+ return [];
152
+ }
137
153
  if (serviceScript) {
138
154
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
139
155
  if (generatePosition !== undefined) {
140
- calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
156
+ calls = provideCallHierarchyIncomingCalls(sourceScript.id, generatePosition);
141
157
  }
142
158
  }
143
159
  else {
@@ -145,9 +161,9 @@ function decorateLanguageService(language, languageService) {
145
161
  }
146
162
  return calls
147
163
  .map(call => {
148
- const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
164
+ const from = (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, call.from, language_core_1.isCallHierarchyEnabled);
149
165
  const fromSpans = call.fromSpans
150
- .map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
166
+ .map(span => (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
151
167
  .filter(utils_1.notEmpty);
152
168
  return {
153
169
  from,
@@ -159,6 +175,9 @@ function decorateLanguageService(language, languageService) {
159
175
  let calls = [];
160
176
  const fileName = filePath.replace(windowsPathReg, '/');
161
177
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
178
+ if (sourceScript?.associatedOnly) {
179
+ return [];
180
+ }
162
181
  if (serviceScript) {
163
182
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
164
183
  if (generatePosition !== undefined) {
@@ -170,10 +189,10 @@ function decorateLanguageService(language, languageService) {
170
189
  }
171
190
  return calls
172
191
  .map(call => {
173
- const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
192
+ const to = (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, call.to, language_core_1.isCallHierarchyEnabled);
174
193
  const fromSpans = call.fromSpans
175
- .map(span => sourceScript
176
- ? (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
194
+ .map(span => serviceScript
195
+ ? (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
177
196
  : span)
178
197
  .filter(utils_1.notEmpty);
179
198
  return {
@@ -184,27 +203,24 @@ function decorateLanguageService(language, languageService) {
184
203
  };
185
204
  languageService.organizeImports = (args, formatOptions, preferences) => {
186
205
  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;
206
+ return (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, unresolved, language_core_1.isCodeActionsEnabled);
191
207
  };
192
208
  languageService.getQuickInfoAtPosition = (filePath, position) => {
193
209
  const fileName = filePath.replace(windowsPathReg, '/');
194
210
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
211
+ if (sourceScript?.associatedOnly) {
212
+ return undefined;
213
+ }
195
214
  if (serviceScript) {
196
215
  const infos = [];
197
- for (const [generatePosition, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
198
- if (!(0, language_core_1.isHoverEnabled)(mapping.data)) {
199
- continue;
200
- }
201
- const info = getQuickInfoAtPosition(fileName, generatePosition);
216
+ for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isHoverEnabled)) {
217
+ const info = getQuickInfoAtPosition(sourceScript.id, generatePosition);
202
218
  if (info) {
203
- const textSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, info.textSpan, language_core_1.isHoverEnabled);
219
+ const textSpan = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
204
220
  if (textSpan) {
205
221
  infos.push({
206
222
  ...info,
207
- textSpan,
223
+ textSpan: textSpan,
208
224
  });
209
225
  }
210
226
  }
@@ -255,12 +271,15 @@ function decorateLanguageService(language, languageService) {
255
271
  languageService.getSignatureHelpItems = (filePath, position, options) => {
256
272
  const fileName = filePath.replace(windowsPathReg, '/');
257
273
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
274
+ if (sourceScript?.associatedOnly) {
275
+ return undefined;
276
+ }
258
277
  if (serviceScript) {
259
278
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
260
279
  if (generatePosition !== undefined) {
261
- const result = getSignatureHelpItems(fileName, generatePosition, options);
280
+ const result = getSignatureHelpItems(sourceScript.id, generatePosition, options);
262
281
  if (result) {
263
- const applicableSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
282
+ const applicableSpan = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
264
283
  if (applicableSpan) {
265
284
  return {
266
285
  ...result,
@@ -276,7 +295,7 @@ function decorateLanguageService(language, languageService) {
276
295
  };
277
296
  languageService.getDocumentHighlights = (filePath, position, filesToSearch) => {
278
297
  const fileName = filePath.replace(windowsPathReg, '/');
279
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, position => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
298
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
280
299
  for (const ref of result) {
281
300
  for (const reference of ref.highlightSpans) {
282
301
  yield [reference.fileName ?? ref.fileName, reference.textSpan.start];
@@ -290,11 +309,11 @@ function decorateLanguageService(language, languageService) {
290
309
  ...highlights,
291
310
  highlightSpans: highlights.highlightSpans
292
311
  .map(span => {
293
- const textSpan = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
312
+ const { textSpan } = (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
294
313
  if (textSpan) {
295
314
  return {
296
315
  ...span,
297
- contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
316
+ contextSpan: (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
298
317
  textSpan,
299
318
  };
300
319
  }
@@ -307,6 +326,9 @@ function decorateLanguageService(language, languageService) {
307
326
  languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
308
327
  const fileName = filePath.replace(windowsPathReg, '/');
309
328
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
329
+ if (sourceScript?.associatedOnly) {
330
+ return [];
331
+ }
310
332
  if (serviceScript) {
311
333
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
312
334
  if (generatePosition !== undefined) {
@@ -316,7 +338,7 @@ function decorateLanguageService(language, languageService) {
316
338
  pos: generatePosition,
317
339
  end: generatePosition + positionOrRange.end - positionOrRange.pos,
318
340
  };
319
- return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
341
+ return getApplicableRefactors(sourceScript.id, por, preferences, triggerReason, kind, includeInteractiveActions);
320
342
  }
321
343
  return [];
322
344
  }
@@ -328,6 +350,9 @@ function decorateLanguageService(language, languageService) {
328
350
  let edits;
329
351
  const fileName = filePath.replace(windowsPathReg, '/');
330
352
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
353
+ if (sourceScript?.associatedOnly) {
354
+ return undefined;
355
+ }
331
356
  if (serviceScript) {
332
357
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number'
333
358
  ? positionOrRange
@@ -339,31 +364,32 @@ function decorateLanguageService(language, languageService) {
339
364
  pos: generatePosition,
340
365
  end: generatePosition + positionOrRange.end - positionOrRange.pos,
341
366
  };
342
- edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
367
+ edits = getEditsForRefactor(sourceScript.id, formatOptions, por, refactorName, actionName, preferences);
343
368
  }
344
369
  }
345
370
  else {
346
371
  edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
347
372
  }
348
373
  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);
374
+ edits.edits = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, edits.edits, language_core_1.isCodeActionsEnabled);
352
375
  return edits;
353
376
  }
354
377
  };
355
378
  languageService.getRenameInfo = (filePath, position, options) => {
356
379
  const fileName = filePath.replace(windowsPathReg, '/');
357
380
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
381
+ if (sourceScript?.associatedOnly) {
382
+ return {
383
+ canRename: false,
384
+ localizedErrorMessage: "Cannot rename"
385
+ };
386
+ }
358
387
  if (serviceScript) {
359
388
  let failed;
360
- for (const [generateOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
361
- if (!(0, language_core_1.isRenameEnabled)(mapping.data)) {
362
- continue;
363
- }
364
- const info = getRenameInfo(fileName, generateOffset, options);
389
+ for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isRenameEnabled)) {
390
+ const info = getRenameInfo(sourceScript.id, generateOffset, options);
365
391
  if (info.canRename) {
366
- const span = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
392
+ const span = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
367
393
  if (span) {
368
394
  info.triggerSpan = span;
369
395
  return info;
@@ -389,18 +415,21 @@ function decorateLanguageService(language, languageService) {
389
415
  let fixes = [];
390
416
  const fileName = filePath.replace(windowsPathReg, '/');
391
417
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
418
+ if (sourceScript?.associatedOnly) {
419
+ return [];
420
+ }
392
421
  if (serviceScript) {
393
422
  const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isCodeActionsEnabled);
394
423
  const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isCodeActionsEnabled);
395
424
  if (generateStart !== undefined && generateEnd !== undefined) {
396
- fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
425
+ fixes = getCodeFixesAtPosition(sourceScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
397
426
  }
398
427
  }
399
428
  else {
400
429
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
401
430
  }
402
431
  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);
432
+ fix.changes = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, fix.changes, language_core_1.isCodeActionsEnabled);
404
433
  return fix;
405
434
  });
406
435
  return fixes;
@@ -408,6 +437,12 @@ function decorateLanguageService(language, languageService) {
408
437
  languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
409
438
  const fileName = filePath.replace(windowsPathReg, '/');
410
439
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
440
+ if (sourceScript?.associatedOnly) {
441
+ return {
442
+ spans: [],
443
+ endOfLineState: 0
444
+ };
445
+ }
411
446
  if (serviceScript) {
412
447
  let start;
413
448
  let end;
@@ -425,13 +460,19 @@ function decorateLanguageService(language, languageService) {
425
460
  const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
426
461
  start += mappingOffset;
427
462
  end += mappingOffset;
428
- const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
463
+ const result = getEncodedSemanticClassifications(sourceScript.id, { start, length: end - start }, format);
429
464
  const spans = [];
430
465
  for (let i = 0; i < result.spans.length; i += 3) {
431
- const sourceStart = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
432
- const sourceEnd = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
433
- if (sourceStart !== undefined && sourceEnd !== undefined) {
434
- spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
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
+ if (sourceStart[0] === sourceEnd[0] && sourceEnd[1] >= sourceStart[1]) {
469
+ spans.push(sourceStart[1], sourceEnd[1] - sourceStart[1], result.spans[i + 2]);
470
+ break;
471
+ }
472
+ }
473
+ if (spans.length) {
474
+ break;
475
+ }
435
476
  }
436
477
  }
437
478
  result.spans = spans;
@@ -443,38 +484,50 @@ function decorateLanguageService(language, languageService) {
443
484
  };
444
485
  languageService.getSyntacticDiagnostics = filePath => {
445
486
  const fileName = filePath.replace(windowsPathReg, '/');
487
+ const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
488
+ if (sourceScript?.associatedOnly) {
489
+ return [];
490
+ }
446
491
  return getSyntacticDiagnostics(fileName)
447
- .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
492
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
448
493
  .filter(utils_1.notEmpty);
449
494
  };
450
495
  languageService.getSemanticDiagnostics = filePath => {
451
496
  const fileName = filePath.replace(windowsPathReg, '/');
497
+ const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
498
+ if (sourceScript?.associatedOnly) {
499
+ return [];
500
+ }
452
501
  return getSemanticDiagnostics(fileName)
453
- .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
502
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
454
503
  .filter(utils_1.notEmpty);
455
504
  };
456
505
  languageService.getSuggestionDiagnostics = filePath => {
457
506
  const fileName = filePath.replace(windowsPathReg, '/');
507
+ const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
508
+ if (sourceScript?.associatedOnly) {
509
+ return [];
510
+ }
458
511
  return getSuggestionDiagnostics(fileName)
459
- .map(d => (0, transform_1.transformDiagnostic)(language, d, false))
512
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
460
513
  .filter(utils_1.notEmpty);
461
514
  };
462
515
  languageService.getDefinitionAndBoundSpan = (filePath, position) => {
463
516
  const fileName = filePath.replace(windowsPathReg, '/');
464
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAndBoundSpan(fileName, position), function* (result) {
517
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
465
518
  for (const ref of result.definitions ?? []) {
466
519
  yield [ref.fileName, ref.textSpan.start];
467
520
  }
468
521
  });
469
522
  const textSpan = unresolved
470
- .map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
523
+ .map(s => (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
471
524
  .filter(utils_1.notEmpty)[0];
472
525
  if (!textSpan) {
473
526
  return;
474
527
  }
475
528
  const definitions = unresolved
476
529
  .map(s => s.definitions
477
- ?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
530
+ ?.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
478
531
  .filter(utils_1.notEmpty))
479
532
  .filter(utils_1.notEmpty)
480
533
  .flat();
@@ -485,7 +538,7 @@ function decorateLanguageService(language, languageService) {
485
538
  };
486
539
  languageService.findReferences = (filePath, position) => {
487
540
  const fileName = filePath.replace(windowsPathReg, '/');
488
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => findReferences(fileName, position), function* (result) {
541
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
489
542
  for (const ref of result) {
490
543
  for (const reference of ref.references) {
491
544
  yield [reference.fileName, reference.textSpan.start];
@@ -495,11 +548,11 @@ function decorateLanguageService(language, languageService) {
495
548
  const resolved = unresolved
496
549
  .flat()
497
550
  .map(symbol => {
498
- const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
551
+ const definition = (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, symbol.definition, language_core_1.isDefinitionEnabled, true);
499
552
  return {
500
553
  definition,
501
554
  references: symbol.references
502
- .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
555
+ .map(r => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, r, language_core_1.isReferencesEnabled))
503
556
  .filter(utils_1.notEmpty),
504
557
  };
505
558
  });
@@ -507,79 +560,79 @@ function decorateLanguageService(language, languageService) {
507
560
  };
508
561
  languageService.getDefinitionAtPosition = (filePath, position) => {
509
562
  const fileName = filePath.replace(windowsPathReg, '/');
510
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAtPosition(fileName, position), function* (result) {
563
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
511
564
  for (const ref of result) {
512
565
  yield [ref.fileName, ref.textSpan.start];
513
566
  }
514
567
  });
515
568
  const resolved = unresolved
516
569
  .flat()
517
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
570
+ .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
518
571
  .filter(utils_1.notEmpty);
519
572
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
520
573
  };
521
574
  languageService.getTypeDefinitionAtPosition = (filePath, position) => {
522
575
  const fileName = filePath.replace(windowsPathReg, '/');
523
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, position => getTypeDefinitionAtPosition(fileName, position), function* (result) {
576
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
524
577
  for (const ref of result) {
525
578
  yield [ref.fileName, ref.textSpan.start];
526
579
  }
527
580
  });
528
581
  const resolved = unresolved
529
582
  .flat()
530
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
583
+ .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isTypeDefinitionEnabled))
531
584
  .filter(utils_1.notEmpty);
532
585
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
533
586
  };
534
587
  languageService.getImplementationAtPosition = (filePath, position) => {
535
588
  const fileName = filePath.replace(windowsPathReg, '/');
536
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, position => getImplementationAtPosition(fileName, position), function* (result) {
589
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
537
590
  for (const ref of result) {
538
591
  yield [ref.fileName, ref.textSpan.start];
539
592
  }
540
593
  });
541
594
  const resolved = unresolved
542
595
  .flat()
543
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
596
+ .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isImplementationEnabled))
544
597
  .filter(utils_1.notEmpty);
545
598
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
546
599
  };
547
600
  languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
548
601
  const fileName = filePath.replace(windowsPathReg, '/');
549
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, position => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
602
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
550
603
  for (const ref of result) {
551
604
  yield [ref.fileName, ref.textSpan.start];
552
605
  }
553
606
  });
554
607
  const resolved = unresolved
555
608
  .flat()
556
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
609
+ .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isRenameEnabled))
557
610
  .filter(utils_1.notEmpty);
558
611
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
559
612
  };
560
613
  languageService.getReferencesAtPosition = (filePath, position) => {
561
614
  const fileName = filePath.replace(windowsPathReg, '/');
562
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => getReferencesAtPosition(fileName, position), function* (result) {
615
+ const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
563
616
  for (const ref of result) {
564
617
  yield [ref.fileName, ref.textSpan.start];
565
618
  }
566
619
  });
567
620
  const resolved = unresolved
568
621
  .flat()
569
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
622
+ .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isReferencesEnabled))
570
623
  .filter(utils_1.notEmpty);
571
624
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
572
625
  };
573
626
  languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
574
627
  const fileName = filePath.replace(windowsPathReg, '/');
575
628
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
629
+ if (sourceScript?.associatedOnly) {
630
+ return undefined;
631
+ }
576
632
  if (serviceScript) {
577
633
  const results = [];
578
- for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
579
- if (!(0, language_core_1.isCompletionEnabled)(mapping.data)) {
580
- continue;
581
- }
582
- const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
634
+ for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled)) {
635
+ const result = getCompletionsAtPosition(sourceScript.id, generatedOffset, options, formattingSettings);
583
636
  if (!result) {
584
637
  continue;
585
638
  }
@@ -587,10 +640,10 @@ function decorateLanguageService(language, languageService) {
587
640
  result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
588
641
  }
589
642
  for (const entry of result.entries) {
590
- entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
643
+ entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
591
644
  }
592
645
  result.optionalReplacementSpan = result.optionalReplacementSpan
593
- && (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
646
+ && (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
594
647
  const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
595
648
  if (isAdditional) {
596
649
  results.push(result);
@@ -616,10 +669,13 @@ function decorateLanguageService(language, languageService) {
616
669
  let details;
617
670
  const fileName = filePath.replace(windowsPathReg, '/');
618
671
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
672
+ if (sourceScript?.associatedOnly) {
673
+ return undefined;
674
+ }
619
675
  if (serviceScript) {
620
676
  const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled);
621
677
  if (generatePosition !== undefined) {
622
- details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
678
+ details = getCompletionEntryDetails(sourceScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
623
679
  }
624
680
  }
625
681
  else {
@@ -627,7 +683,7 @@ function decorateLanguageService(language, languageService) {
627
683
  }
628
684
  if (details?.codeActions) {
629
685
  for (const codeAction of details.codeActions) {
630
- codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
686
+ codeAction.changes = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, codeAction.changes, language_core_1.isCompletionEnabled);
631
687
  }
632
688
  }
633
689
  return details;
@@ -635,6 +691,9 @@ function decorateLanguageService(language, languageService) {
635
691
  languageService.provideInlayHints = (filePath, span, preferences) => {
636
692
  const fileName = filePath.replace(windowsPathReg, '/');
637
693
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
694
+ if (sourceScript?.associatedOnly) {
695
+ return [];
696
+ }
638
697
  if (serviceScript) {
639
698
  let start;
640
699
  let end;
@@ -653,14 +712,14 @@ function decorateLanguageService(language, languageService) {
653
712
  const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
654
713
  start += mappingOffset;
655
714
  end += mappingOffset;
656
- const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
715
+ const result = provideInlayHints(sourceScript.id, { start, length: end - start }, preferences);
657
716
  const hints = [];
658
717
  for (const hint of result) {
659
- const sourcePosition = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
718
+ const sourcePosition = (0, transform_1.toSourceOffset)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, hint.position, language_core_1.isInlayHintsEnabled);
660
719
  if (sourcePosition !== undefined) {
661
720
  hints.push({
662
721
  ...hint,
663
- position: sourcePosition,
722
+ position: sourcePosition[1],
664
723
  });
665
724
  }
666
725
  }
@@ -674,7 +733,7 @@ function decorateLanguageService(language, languageService) {
674
733
  const fileName = filePath.replace(windowsPathReg, '/');
675
734
  const unresolved = getFileReferences(fileName);
676
735
  const resolved = unresolved
677
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
736
+ .map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isReferencesEnabled))
678
737
  .filter(utils_1.notEmpty);
679
738
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
680
739
  };
@@ -685,7 +744,7 @@ function decorateLanguageService(language, languageService) {
685
744
  if (serviceScript) {
686
745
  for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
687
746
  if (filter(mapping.data)) {
688
- process(fileName, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
747
+ process(sourceScript.id, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
689
748
  }
690
749
  }
691
750
  }
@@ -698,7 +757,7 @@ function decorateLanguageService(language, languageService) {
698
757
  return;
699
758
  }
700
759
  processedFilePositions.add(fileName + ':' + position);
701
- const result = worker(position);
760
+ const result = worker(fileName, position);
702
761
  if (!result) {
703
762
  return;
704
763
  }
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decorateProgram = void 0;
4
- const utils_1 = require("./utils");
5
4
  const transform_1 = require("./transform");
5
+ const utils_1 = require("./utils");
6
6
  function decorateProgram(language, program) {
7
7
  const emit = program.emit;
8
8
  // for tsc --noEmit
@@ -18,29 +18,44 @@ function decorateProgram(language, program) {
18
18
  return {
19
19
  ...result,
20
20
  diagnostics: result.diagnostics
21
- .map(d => (0, transform_1.transformDiagnostic)(language, d, true))
21
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.IncludeAssciated, language, d, program, true))
22
22
  .filter(utils_1.notEmpty),
23
23
  };
24
24
  };
25
25
  program.getSyntacticDiagnostics = (sourceFile, cancellationToken) => {
26
- return getSyntacticDiagnostics(sourceFile, cancellationToken)
27
- .map(d => (0, transform_1.transformDiagnostic)(language, d, true))
26
+ if (!sourceFile) {
27
+ return [];
28
+ }
29
+ const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
30
+ const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
31
+ return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
32
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
28
33
  .filter(utils_1.notEmpty);
29
34
  };
30
35
  program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
31
- return getSemanticDiagnostics(sourceFile, cancellationToken)
32
- .map(d => (0, transform_1.transformDiagnostic)(language, d, true))
36
+ if (!sourceFile) {
37
+ return [];
38
+ }
39
+ const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
40
+ const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
41
+ return getSemanticDiagnostics(actualSourceFile, cancellationToken)
42
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
33
43
  .filter(utils_1.notEmpty);
34
44
  };
35
45
  program.getGlobalDiagnostics = cancellationToken => {
36
46
  return getGlobalDiagnostics(cancellationToken)
37
- .map(d => (0, transform_1.transformDiagnostic)(language, d, true))
47
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.IncludeAssciated, language, d, program, true))
38
48
  .filter(utils_1.notEmpty);
39
49
  };
40
50
  // @ts-ignore
41
51
  program.getBindAndCheckDiagnostics = (sourceFile, cancellationToken) => {
42
- return getBindAndCheckDiagnostics(sourceFile, cancellationToken)
43
- .map(d => (0, transform_1.transformDiagnostic)(language, d, true))
52
+ if (!sourceFile) {
53
+ return [];
54
+ }
55
+ const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
56
+ const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
57
+ return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
58
+ .map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
44
59
  .filter(utils_1.notEmpty);
45
60
  };
46
61
  // fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
@@ -1,18 +1,23 @@
1
1
  import type { CodeInformation, SourceMap, 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 function transformCallHierarchyItem(language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
5
- export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language<string>, diagnostic: T, isTsc: boolean): T | undefined;
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;
6
10
  export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
7
- export declare function transformFileTextChanges(language: Language<string>, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
8
- export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
9
- export declare function transformSpan(language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
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): {
10
14
  fileName: string;
11
15
  textSpan: ts.TextSpan;
12
16
  } | undefined;
13
- export declare function transformTextChange(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
14
- export declare function transformTextSpan(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
15
- export declare function toSourceOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | 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]>;
16
21
  export declare function toGeneratedOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
17
- export declare function toGeneratedOffsets(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
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>;
18
23
  export declare function getMappingOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>): number;
@@ -1,41 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = 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 = exports.ToSourceMode = 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 = {}));
6
11
  const transformedDiagnostics = new WeakMap();
7
12
  const transformedSourceFile = new WeakSet();
8
- function transformCallHierarchyItem(language, item, filter) {
9
- const span = transformSpan(language, item.file, item.span, filter);
10
- const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
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);
11
16
  return {
12
17
  ...item,
18
+ file: span?.fileName ?? item.file,
13
19
  span: span?.textSpan ?? { start: 0, length: 0 },
14
20
  selectionSpan: selectionSpan?.textSpan ?? { start: 0, length: 0 },
15
21
  };
16
22
  }
17
23
  exports.transformCallHierarchyItem = transformCallHierarchyItem;
18
- function transformDiagnostic(language, diagnostic, isTsc) {
24
+ function transformDiagnostic(mode, language, diagnostic, program, isTsc) {
19
25
  if (!transformedDiagnostics.has(diagnostic)) {
20
26
  transformedDiagnostics.set(diagnostic, undefined);
21
27
  const { relatedInformation } = diagnostic;
22
28
  if (relatedInformation) {
23
29
  diagnostic.relatedInformation = relatedInformation
24
- .map(d => transformDiagnostic(language, d, isTsc))
30
+ .map(d => transformDiagnostic(mode, language, d, program, isTsc))
25
31
  .filter(utils_1.notEmpty);
26
32
  }
27
33
  if (diagnostic.file !== undefined
28
34
  && diagnostic.start !== undefined
29
35
  && diagnostic.length !== undefined) {
30
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
36
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
31
37
  if (serviceScript) {
32
- const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
33
- if (sourceSpan) {
38
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, {
39
+ start: diagnostic.start,
40
+ length: diagnostic.length
41
+ }, language_core_1.shouldReportDiagnostics) ?? [];
42
+ const actualDiagnosticFile = sourceSpanFileName
43
+ ? diagnostic.file.fileName === sourceSpanFileName
44
+ ? diagnostic.file
45
+ : program?.getSourceFile(sourceSpanFileName)
46
+ : undefined;
47
+ if (sourceSpan && actualDiagnosticFile) {
34
48
  if (isTsc) {
35
49
  fillSourceFileText(language, diagnostic.file);
36
50
  }
37
51
  transformedDiagnostics.set(diagnostic, {
38
52
  ...diagnostic,
53
+ file: actualDiagnosticFile,
39
54
  start: sourceSpan.start,
40
55
  length: sourceSpan.length,
41
56
  });
@@ -65,29 +80,42 @@ function fillSourceFileText(language, sourceFile) {
65
80
  }
66
81
  }
67
82
  exports.fillSourceFileText = fillSourceFileText;
68
- function transformFileTextChanges(language, changes, filter) {
69
- const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
70
- if (source) {
71
- return {
72
- ...changes,
73
- textChanges: changes.textChanges.map(c => {
74
- const span = transformSpan(language, changes.fileName, c.span, filter);
75
- if (span) {
76
- return {
77
- ...c,
78
- span: span.textSpan,
79
- };
83
+ function transformFileTextChanges(mode, language, changes, filter) {
84
+ const changesPerFile = {};
85
+ const newFiles = new Set();
86
+ for (const fileChanges of changes) {
87
+ const [_, source] = (0, utils_1.getServiceScript)(language, fileChanges.fileName);
88
+ if (source) {
89
+ fileChanges.textChanges.forEach(c => {
90
+ const { fileName, textSpan } = transformSpan(mode, language, fileChanges.fileName, c.span, filter) ?? {};
91
+ if (fileName && textSpan) {
92
+ (changesPerFile[fileName] ?? (changesPerFile[fileName] = [])).push({ ...c, span: textSpan });
80
93
  }
81
- }).filter(utils_1.notEmpty),
82
- };
94
+ });
95
+ }
96
+ else {
97
+ const list = (changesPerFile[fileChanges.fileName] ?? (changesPerFile[fileChanges.fileName] = []));
98
+ fileChanges.textChanges.forEach(c => {
99
+ list.push(c);
100
+ });
101
+ if (fileChanges.isNewFile) {
102
+ newFiles.add(fileChanges.fileName);
103
+ }
104
+ }
83
105
  }
84
- else {
85
- return changes;
106
+ const result = [];
107
+ for (const fileName in changesPerFile) {
108
+ result.push({
109
+ fileName,
110
+ isNewFile: newFiles.has(fileName),
111
+ textChanges: changesPerFile[fileName]
112
+ });
86
113
  }
114
+ return result;
87
115
  }
88
116
  exports.transformFileTextChanges = transformFileTextChanges;
89
- function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
90
- let textSpan = transformSpan(language, documentSpan.fileName, documentSpan.textSpan, filter);
117
+ function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallback) {
118
+ let textSpan = transformSpan(mode, language, documentSpan.fileName, documentSpan.textSpan, filter);
91
119
  if (!textSpan && shouldFallback) {
92
120
  textSpan = {
93
121
  fileName: documentSpan.fileName,
@@ -97,9 +125,9 @@ function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
97
125
  if (!textSpan) {
98
126
  return;
99
127
  }
100
- const contextSpan = transformSpan(language, documentSpan.fileName, documentSpan.contextSpan, filter);
101
- const originalTextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
102
- const originalContextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
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);
103
131
  return {
104
132
  ...documentSpan,
105
133
  fileName: textSpan.fileName,
@@ -111,16 +139,19 @@ function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
111
139
  };
112
140
  }
113
141
  exports.transformDocumentSpan = transformDocumentSpan;
114
- function transformSpan(language, fileName, textSpan, filter) {
142
+ function transformSpan(mode, language, fileName, textSpan, filter) {
115
143
  if (!fileName || !textSpan) {
116
144
  return;
117
145
  }
118
- const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
119
- if (serviceScript) {
120
- const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, textSpan, filter);
121
- if (sourceSpan) {
146
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
147
+ if (sourceScript?.associatedOnly) {
148
+ return;
149
+ }
150
+ else if (serviceScript) {
151
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, textSpan, filter) ?? [];
152
+ if (sourceSpan && sourceSpanFileName) {
122
153
  return {
123
- fileName,
154
+ fileName: sourceSpanFileName,
124
155
  textSpan: sourceSpan,
125
156
  };
126
157
  }
@@ -133,48 +164,70 @@ function transformSpan(language, fileName, textSpan, filter) {
133
164
  }
134
165
  }
135
166
  exports.transformSpan = transformSpan;
136
- function transformTextChange(serviceScript, sourceScript, map, textChange, filter) {
137
- const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, textChange.span, filter);
138
- if (sourceSpan) {
139
- return {
140
- newText: textChange.newText,
141
- span: sourceSpan,
142
- };
167
+ function transformTextChange(mode, language, serviceScript, sourceScript, textChange, filter) {
168
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, textChange.span, filter) ?? [];
169
+ if (sourceSpan && sourceSpanFileName) {
170
+ return [sourceSpanFileName, {
171
+ newText: textChange.newText,
172
+ span: sourceSpan,
173
+ }];
143
174
  }
175
+ return undefined;
144
176
  }
145
177
  exports.transformTextChange = transformTextChange;
146
- function transformTextSpan(serviceScript, sourceScript, map, textSpan, filter) {
178
+ function transformTextSpan(mode, language, serviceScript, sourceScript, textSpan, filter) {
147
179
  const start = textSpan.start;
148
180
  const end = textSpan.start + textSpan.length;
149
- const sourceStart = toSourceOffset(serviceScript, sourceScript, map, start, filter);
150
- const sourceEnd = toSourceOffset(serviceScript, sourceScript, map, end, filter);
151
- if (sourceStart !== undefined && sourceEnd !== undefined && sourceEnd >= sourceStart) {
152
- return {
153
- start: sourceStart,
154
- length: sourceEnd - sourceStart,
155
- };
181
+ for (const sourceStart of toSourceOffsets(mode, language, serviceScript, sourceScript, start, filter)) {
182
+ for (const sourceEnd of toSourceOffsets(mode, language, serviceScript, sourceScript, end, filter)) {
183
+ if (sourceStart[0] === sourceEnd[0]
184
+ && sourceEnd[1] >= sourceStart[1]) {
185
+ return [sourceStart[0], {
186
+ start: sourceStart[1],
187
+ length: sourceEnd[1] - sourceStart[1],
188
+ }];
189
+ }
190
+ }
156
191
  }
157
192
  }
158
193
  exports.transformTextSpan = transformTextSpan;
159
- function toSourceOffset(serviceScript, sourceScript, map, position, filter) {
160
- for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
161
- if (filter(mapping.data)) {
162
- return sourceOffset;
163
- }
194
+ function toSourceOffset(mode, language, serviceScript, sourceScript, position, filter) {
195
+ for (const source of toSourceOffsets(mode, language, serviceScript, sourceScript, position, filter)) {
196
+ return source;
164
197
  }
165
198
  }
166
199
  exports.toSourceOffset = toSourceOffset;
167
- function toGeneratedOffset(serviceScript, sourceScript, map, position, filter) {
168
- for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
169
- if (filter(mapping.data)) {
170
- return generateOffset + getMappingOffset(serviceScript, sourceScript);
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))) {
204
+ if (filter(mapping.data)) {
205
+ yield [sourceScript.id, sourceOffset];
206
+ }
207
+ }
208
+ }
209
+ else {
210
+ for (const [fileName, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
211
+ for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
212
+ if (filter(mapping.data)) {
213
+ yield [fileName, sourceOffset];
214
+ }
215
+ }
171
216
  }
172
217
  }
173
218
  }
219
+ exports.toSourceOffsets = toSourceOffsets;
220
+ function toGeneratedOffset(serviceScript, sourceScript, map, position, filter) {
221
+ for (const [generateOffset] of toGeneratedOffsets(serviceScript, sourceScript, map, position, filter)) {
222
+ return generateOffset;
223
+ }
224
+ }
174
225
  exports.toGeneratedOffset = toGeneratedOffset;
175
- function* toGeneratedOffsets(serviceScript, sourceScript, map, position) {
226
+ function* toGeneratedOffsets(serviceScript, sourceScript, map, position, filter) {
176
227
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
177
- yield [generateOffset + getMappingOffset(serviceScript, sourceScript), mapping];
228
+ if (filter(mapping.data)) {
229
+ yield [generateOffset + getMappingOffset(serviceScript, sourceScript), mapping];
230
+ }
178
231
  }
179
232
  }
180
233
  exports.toGeneratedOffsets = toGeneratedOffsets;
@@ -1,3 +1,3 @@
1
- import type { Language } from '@volar/language-core';
1
+ import type { CodeInformation, Language, SourceMap, 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): readonly [import("@volar/language-core").TypeScriptServiceScript, import("@volar/language-core").SourceScript<string>, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
3
+ export declare function getServiceScript(language: Language<string>, fileName: string): [TypeScriptServiceScript, SourceScript<string>, SourceMap<CodeInformation>] | [undefined, SourceScript<string>, undefined] | [undefined, undefined, undefined];
package/lib/node/utils.js CHANGED
@@ -6,7 +6,27 @@ function notEmpty(value) {
6
6
  }
7
7
  exports.notEmpty = notEmpty;
8
8
  function getServiceScript(language, fileName) {
9
- const sourceScript = language.scripts.get(fileName);
9
+ let sourceScript = language.scripts.get(fileName);
10
+ if (sourceScript?.targetIds && sourceScript?.targetIds.size > 0) {
11
+ const sourceId = sourceScript.id;
12
+ 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);
16
+ 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;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ if (sourceScript?.associatedOnly) {
28
+ return [undefined, sourceScript, undefined];
29
+ }
10
30
  if (sourceScript?.generated) {
11
31
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
12
32
  if (serviceScript) {
@@ -83,7 +83,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
83
83
  if (updateLevel >= (1)
84
84
  || !externalFiles.has(project)) {
85
85
  const oldFiles = externalFiles.get(project);
86
- const newFiles = (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions);
86
+ const newFiles = extensions.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
87
87
  externalFiles.set(project, newFiles);
88
88
  if (oldFiles && !(0, createLanguageServicePlugin_1.arrayItemsEqual)(oldFiles, newFiles)) {
89
89
  project.refreshDiagnostics();
@@ -52,7 +52,8 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
52
52
  if (updateLevel >= (1)
53
53
  || !externalFiles.has(project)) {
54
54
  const oldFiles = externalFiles.get(project);
55
- const newFiles = (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, projectExternalFileExtensions.get(project));
55
+ const extensions = projectExternalFileExtensions.get(project);
56
+ const newFiles = extensions?.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
56
57
  externalFiles.set(project, newFiles);
57
58
  if (oldFiles && !arrayItemsEqual(oldFiles, newFiles)) {
58
59
  project.refreshDiagnostics();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.3.0-alpha.7",
3
+ "version": "2.3.0-alpha.8",
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.7",
15
+ "@volar/language-core": "2.3.0-alpha.8",
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.7"
22
+ "@volar/language-service": "2.3.0-alpha.8"
23
23
  },
24
- "gitHead": "3cc2a62516113c5789e4f54766e25063099a13a5"
24
+ "gitHead": "377a0083ac697a476509805a6777a2339391dcaf"
25
25
  }