@volar/typescript 2.1.4 → 2.2.0-alpha.0

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.
package/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './lib/documentRegistry';
2
1
  export * from './lib/node/decorateLanguageService';
3
2
  export * from './lib/node/decorateLanguageServiceHost';
4
3
  export * from './lib/node/decorateProgram';
package/index.js CHANGED
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./lib/documentRegistry"), exports);
18
17
  __exportStar(require("./lib/node/decorateLanguageService"), exports);
19
18
  __exportStar(require("./lib/node/decorateLanguageServiceHost"), exports);
20
19
  __exportStar(require("./lib/node/decorateProgram"), exports);
@@ -1,3 +1,3 @@
1
- import { FileRegistry } from '@volar/language-core';
1
+ import { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageService(files: FileRegistry, languageService: ts.LanguageService): void;
3
+ export declare function decorateLanguageService(language: Language, languageService: ts.LanguageService): void;
@@ -5,12 +5,12 @@ const language_core_1 = require("@volar/language-core");
5
5
  const dedupe_1 = require("./dedupe");
6
6
  const utils_1 = require("./utils");
7
7
  const transform_1 = require("./transform");
8
- function decorateLanguageService(files, languageService) {
8
+ function decorateLanguageService(language, languageService) {
9
9
  // ignored methods
10
10
  const { getNavigationTree, getOutliningSpans, } = languageService;
11
11
  languageService.getNavigationTree = fileName => {
12
- const [virtualCode] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
13
- if (virtualCode) {
12
+ const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
13
+ if (serviceScript) {
14
14
  const tree = getNavigationTree(fileName);
15
15
  tree.childItems = undefined;
16
16
  return tree;
@@ -20,8 +20,8 @@ function decorateLanguageService(files, languageService) {
20
20
  }
21
21
  };
22
22
  languageService.getOutliningSpans = fileName => {
23
- const [virtualCode] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
24
- if (virtualCode) {
23
+ const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
24
+ if (serviceScript) {
25
25
  return [];
26
26
  }
27
27
  else {
@@ -31,16 +31,16 @@ function decorateLanguageService(files, languageService) {
31
31
  // methods
32
32
  const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getImplementationAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
33
33
  languageService.prepareCallHierarchy = (fileName, position) => {
34
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
35
- if (virtualCode) {
34
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
35
+ if (serviceScript) {
36
36
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
37
37
  if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
38
- const item = prepareCallHierarchy(fileName, generateOffset + sourceFile.snapshot.getLength());
38
+ const item = prepareCallHierarchy(fileName, generateOffset + sourceScript.snapshot.getLength());
39
39
  if (Array.isArray(item)) {
40
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled));
40
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
41
41
  }
42
42
  else if (item) {
43
- return (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled);
43
+ return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
44
44
  }
45
45
  }
46
46
  }
@@ -51,11 +51,11 @@ function decorateLanguageService(files, languageService) {
51
51
  };
52
52
  languageService.provideCallHierarchyIncomingCalls = (fileName, position) => {
53
53
  let calls = [];
54
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
55
- if (virtualCode) {
54
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
55
+ if (serviceScript) {
56
56
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
57
57
  if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
58
- calls = provideCallHierarchyIncomingCalls(fileName, generateOffset + sourceFile.snapshot.getLength());
58
+ calls = provideCallHierarchyIncomingCalls(fileName, generateOffset + sourceScript.snapshot.getLength());
59
59
  }
60
60
  }
61
61
  }
@@ -64,9 +64,9 @@ function decorateLanguageService(files, languageService) {
64
64
  }
65
65
  return calls
66
66
  .map(call => {
67
- const from = (0, transform_1.transformCallHierarchyItem)(files, call.from, language_core_1.isCallHierarchyEnabled);
67
+ const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
68
68
  const fromSpans = call.fromSpans
69
- .map(span => (0, transform_1.transformSpan)(files, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
69
+ .map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
70
70
  .filter(utils_1.notEmpty);
71
71
  return {
72
72
  from,
@@ -76,11 +76,11 @@ function decorateLanguageService(files, languageService) {
76
76
  };
77
77
  languageService.provideCallHierarchyOutgoingCalls = (fileName, position) => {
78
78
  let calls = [];
79
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
80
- if (virtualCode) {
79
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
80
+ if (serviceScript) {
81
81
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
82
82
  if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
83
- calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset + sourceFile.snapshot.getLength());
83
+ calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset + sourceScript.snapshot.getLength());
84
84
  }
85
85
  }
86
86
  }
@@ -89,9 +89,9 @@ function decorateLanguageService(files, languageService) {
89
89
  }
90
90
  return calls
91
91
  .map(call => {
92
- const to = (0, transform_1.transformCallHierarchyItem)(files, call.to, language_core_1.isCallHierarchyEnabled);
92
+ const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
93
93
  const fromSpans = call.fromSpans
94
- .map(span => (0, transform_1.transformSpan)(files, fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
94
+ .map(span => (0, transform_1.transformSpan)(language, fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
95
95
  .filter(utils_1.notEmpty);
96
96
  return {
97
97
  to,
@@ -102,18 +102,18 @@ function decorateLanguageService(files, languageService) {
102
102
  languageService.organizeImports = (args, formatOptions, preferences) => {
103
103
  const unresolved = organizeImports(args, formatOptions, preferences);
104
104
  const resolved = unresolved
105
- .map(changes => (0, transform_1.transformFileTextChanges)(files, changes, language_core_1.isCodeActionsEnabled))
105
+ .map(changes => (0, transform_1.transformFileTextChanges)(language, changes, language_core_1.isCodeActionsEnabled))
106
106
  .filter(utils_1.notEmpty);
107
107
  return resolved;
108
108
  };
109
109
  languageService.getQuickInfoAtPosition = (fileName, position) => {
110
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
111
- if (virtualCode) {
110
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
111
+ if (serviceScript) {
112
112
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
113
113
  if ((0, language_core_1.isHoverEnabled)(mapping.data)) {
114
- const result = getQuickInfoAtPosition(fileName, generateOffset + sourceFile.snapshot.getLength());
114
+ const result = getQuickInfoAtPosition(fileName, generateOffset + sourceScript.snapshot.getLength());
115
115
  if (result) {
116
- const textSpan = (0, transform_1.transformSpan)(files, fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
116
+ const textSpan = (0, transform_1.transformSpan)(language, fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
117
117
  if (textSpan) {
118
118
  return {
119
119
  ...result,
@@ -143,11 +143,11 @@ function decorateLanguageService(files, languageService) {
143
143
  ...highlights,
144
144
  highlightSpans: highlights.highlightSpans
145
145
  .map(span => {
146
- const textSpan = (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
146
+ const textSpan = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
147
147
  if (textSpan) {
148
148
  return {
149
149
  ...span,
150
- contextSpan: (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
150
+ contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
151
151
  textSpan,
152
152
  };
153
153
  }
@@ -158,15 +158,15 @@ function decorateLanguageService(files, languageService) {
158
158
  return resolved;
159
159
  };
160
160
  languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
161
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
162
- if (virtualCode) {
161
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
162
+ if (serviceScript) {
163
163
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
164
164
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
165
165
  const por = typeof positionOrRange === 'number'
166
- ? generateOffset + sourceFile.snapshot.getLength()
166
+ ? generateOffset + sourceScript.snapshot.getLength()
167
167
  : {
168
- pos: generateOffset + sourceFile.snapshot.getLength(),
169
- end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceFile.snapshot.getLength(),
168
+ pos: generateOffset + sourceScript.snapshot.getLength(),
169
+ end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceScript.snapshot.getLength(),
170
170
  };
171
171
  return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
172
172
  }
@@ -179,15 +179,15 @@ function decorateLanguageService(files, languageService) {
179
179
  };
180
180
  languageService.getEditsForRefactor = (fileName, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
181
181
  let edits;
182
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
183
- if (virtualCode) {
182
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
183
+ if (serviceScript) {
184
184
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
185
185
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
186
186
  const por = typeof positionOrRange === 'number'
187
- ? generateOffset + sourceFile.snapshot.getLength()
187
+ ? generateOffset + sourceScript.snapshot.getLength()
188
188
  : {
189
- pos: generateOffset + sourceFile.snapshot.getLength(),
190
- end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceFile.snapshot.getLength(),
189
+ pos: generateOffset + sourceScript.snapshot.getLength(),
190
+ end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceScript.snapshot.getLength(),
191
191
  };
192
192
  edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
193
193
  }
@@ -198,19 +198,19 @@ function decorateLanguageService(files, languageService) {
198
198
  }
199
199
  if (edits) {
200
200
  edits.edits = edits.edits
201
- .map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled))
201
+ .map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled))
202
202
  .filter(utils_1.notEmpty);
203
203
  return edits;
204
204
  }
205
205
  };
206
206
  languageService.getRenameInfo = (fileName, position, options) => {
207
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
208
- if (virtualCode) {
207
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
208
+ if (serviceScript) {
209
209
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
210
210
  if ((0, language_core_1.isRenameEnabled)(mapping.data)) {
211
- const info = getRenameInfo(fileName, generateOffset + sourceFile.snapshot.getLength(), options);
211
+ const info = getRenameInfo(fileName, generateOffset + sourceScript.snapshot.getLength(), options);
212
212
  if (info.canRename) {
213
- const span = (0, transform_1.transformSpan)(files, fileName, info.triggerSpan, language_core_1.isRenameEnabled);
213
+ const span = (0, transform_1.transformSpan)(language, fileName, info.triggerSpan, language_core_1.isRenameEnabled);
214
214
  if (span) {
215
215
  info.triggerSpan = span.textSpan;
216
216
  return info;
@@ -232,13 +232,13 @@ function decorateLanguageService(files, languageService) {
232
232
  };
233
233
  languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
234
234
  let fixes = [];
235
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
236
- if (virtualCode) {
235
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
236
+ if (serviceScript) {
237
237
  for (const [generateStart, mapping] of map.getGeneratedOffsets(start)) {
238
238
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
239
239
  for (const [generateEnd, mapping] of map.getGeneratedOffsets(end)) {
240
240
  if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
241
- fixes = getCodeFixesAtPosition(fileName, generateStart + sourceFile.snapshot.getLength(), generateEnd + sourceFile.snapshot.getLength(), errorCodes, formatOptions, preferences);
241
+ fixes = getCodeFixesAtPosition(fileName, generateStart + sourceScript.snapshot.getLength(), generateEnd + sourceScript.snapshot.getLength(), errorCodes, formatOptions, preferences);
242
242
  break;
243
243
  }
244
244
  }
@@ -250,14 +250,14 @@ function decorateLanguageService(files, languageService) {
250
250
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
251
251
  }
252
252
  fixes = fixes.map(fix => {
253
- fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
253
+ fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
254
254
  return fix;
255
255
  });
256
256
  return fixes;
257
257
  };
258
258
  languageService.getEncodedSemanticClassifications = (fileName, span, format) => {
259
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
260
- if (virtualCode) {
259
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
260
+ if (serviceScript) {
261
261
  let start;
262
262
  let end;
263
263
  for (const mapping of map.mappings) {
@@ -272,14 +272,14 @@ function decorateLanguageService(files, languageService) {
272
272
  start = 0;
273
273
  end = 0;
274
274
  }
275
- start += sourceFile.snapshot.getLength();
276
- end += sourceFile.snapshot.getLength();
275
+ start += sourceScript.snapshot.getLength();
276
+ end += sourceScript.snapshot.getLength();
277
277
  const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
278
278
  const spans = [];
279
279
  for (let i = 0; i < result.spans.length; i += 3) {
280
- for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] - sourceFile.snapshot.getLength())) {
280
+ for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] - sourceScript.snapshot.getLength())) {
281
281
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
282
- for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] - sourceFile.snapshot.getLength())) {
282
+ for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] - sourceScript.snapshot.getLength())) {
283
283
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
284
284
  spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
285
285
  break;
@@ -298,17 +298,17 @@ function decorateLanguageService(files, languageService) {
298
298
  };
299
299
  languageService.getSyntacticDiagnostics = fileName => {
300
300
  return getSyntacticDiagnostics(fileName)
301
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
301
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
302
302
  .filter(utils_1.notEmpty);
303
303
  };
304
304
  languageService.getSemanticDiagnostics = fileName => {
305
305
  return getSemanticDiagnostics(fileName)
306
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
306
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
307
307
  .filter(utils_1.notEmpty);
308
308
  };
309
309
  languageService.getSuggestionDiagnostics = fileName => {
310
310
  return getSuggestionDiagnostics(fileName)
311
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
311
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
312
312
  .filter(utils_1.notEmpty);
313
313
  };
314
314
  languageService.getDefinitionAndBoundSpan = (fileName, position) => {
@@ -318,14 +318,14 @@ function decorateLanguageService(files, languageService) {
318
318
  }
319
319
  });
320
320
  const textSpan = unresolved
321
- .map(s => (0, transform_1.transformSpan)(files, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
321
+ .map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
322
322
  .filter(utils_1.notEmpty)[0];
323
323
  if (!textSpan) {
324
324
  return;
325
325
  }
326
326
  const definitions = unresolved
327
327
  .map(s => s.definitions
328
- ?.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
328
+ ?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
329
329
  .filter(utils_1.notEmpty))
330
330
  .filter(utils_1.notEmpty)
331
331
  .flat();
@@ -345,12 +345,12 @@ function decorateLanguageService(files, languageService) {
345
345
  const resolved = unresolved
346
346
  .flat()
347
347
  .map(symbol => {
348
- const definition = (0, transform_1.transformDocumentSpan)(files, symbol.definition, language_core_1.isDefinitionEnabled);
348
+ const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled);
349
349
  if (definition) {
350
350
  return {
351
351
  definition,
352
352
  references: symbol.references
353
- .map(r => (0, transform_1.transformDocumentSpan)(files, r, language_core_1.isReferencesEnabled))
353
+ .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
354
354
  .filter(utils_1.notEmpty),
355
355
  };
356
356
  }
@@ -366,7 +366,7 @@ function decorateLanguageService(files, languageService) {
366
366
  });
367
367
  const resolved = unresolved
368
368
  .flat()
369
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
369
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
370
370
  .filter(utils_1.notEmpty);
371
371
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
372
372
  };
@@ -378,7 +378,7 @@ function decorateLanguageService(files, languageService) {
378
378
  });
379
379
  const resolved = unresolved
380
380
  .flat()
381
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isTypeDefinitionEnabled))
381
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
382
382
  .filter(utils_1.notEmpty);
383
383
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
384
384
  };
@@ -390,7 +390,7 @@ function decorateLanguageService(files, languageService) {
390
390
  });
391
391
  const resolved = unresolved
392
392
  .flat()
393
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isImplementationEnabled))
393
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
394
394
  .filter(utils_1.notEmpty);
395
395
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
396
396
  };
@@ -402,7 +402,7 @@ function decorateLanguageService(files, languageService) {
402
402
  });
403
403
  const resolved = unresolved
404
404
  .flat()
405
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isRenameEnabled))
405
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
406
406
  .filter(utils_1.notEmpty);
407
407
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
408
408
  };
@@ -414,13 +414,13 @@ function decorateLanguageService(files, languageService) {
414
414
  });
415
415
  const resolved = unresolved
416
416
  .flat()
417
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
417
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
418
418
  .filter(utils_1.notEmpty);
419
419
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
420
420
  };
421
421
  languageService.getCompletionsAtPosition = (fileName, position, options, formattingSettings) => {
422
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
423
- if (virtualCode) {
422
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
423
+ if (serviceScript) {
424
424
  let mainResult;
425
425
  let additionalResults = [];
426
426
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
@@ -429,12 +429,12 @@ function decorateLanguageService(files, languageService) {
429
429
  if (!isAdditional && mainResult) {
430
430
  continue;
431
431
  }
432
- const result = getCompletionsAtPosition(fileName, generateOffset + sourceFile.snapshot.getLength(), options, formattingSettings);
432
+ const result = getCompletionsAtPosition(fileName, generateOffset + sourceScript.snapshot.getLength(), options, formattingSettings);
433
433
  if (result) {
434
434
  for (const entry of result.entries) {
435
- entry.replacementSpan = (0, transform_1.transformSpan)(files, fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
435
+ entry.replacementSpan = (0, transform_1.transformSpan)(language, fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
436
436
  }
437
- result.optionalReplacementSpan = (0, transform_1.transformSpan)(files, fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
437
+ result.optionalReplacementSpan = (0, transform_1.transformSpan)(language, fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
438
438
  if (isAdditional) {
439
439
  additionalResults.push(result);
440
440
  }
@@ -463,11 +463,11 @@ function decorateLanguageService(files, languageService) {
463
463
  };
464
464
  languageService.getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
465
465
  let details;
466
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
467
- if (virtualCode) {
466
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
467
+ if (serviceScript) {
468
468
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
469
469
  if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
470
- details = getCompletionEntryDetails(fileName, generateOffset + sourceFile.snapshot.getLength(), entryName, formatOptions, source, preferences, data);
470
+ details = getCompletionEntryDetails(fileName, generateOffset + sourceScript.snapshot.getLength(), entryName, formatOptions, source, preferences, data);
471
471
  break;
472
472
  }
473
473
  }
@@ -477,14 +477,14 @@ function decorateLanguageService(files, languageService) {
477
477
  }
478
478
  if (details?.codeActions) {
479
479
  for (const codeAction of details.codeActions) {
480
- codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
480
+ codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
481
481
  }
482
482
  }
483
483
  return details;
484
484
  };
485
485
  languageService.provideInlayHints = (fileName, span, preferences) => {
486
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
487
- if (virtualCode) {
486
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
487
+ if (serviceScript) {
488
488
  let start;
489
489
  let end;
490
490
  for (const mapping of map.mappings) {
@@ -499,12 +499,12 @@ function decorateLanguageService(files, languageService) {
499
499
  start = 0;
500
500
  end = 0;
501
501
  }
502
- start += sourceFile.snapshot.getLength();
503
- end += sourceFile.snapshot.getLength();
502
+ start += sourceScript.snapshot.getLength();
503
+ end += sourceScript.snapshot.getLength();
504
504
  const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
505
505
  const hints = [];
506
506
  for (const hint of result) {
507
- for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position - sourceFile.snapshot.getLength())) {
507
+ for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position - sourceScript.snapshot.getLength())) {
508
508
  if ((0, language_core_1.isInlayHintsEnabled)(mapping.data)) {
509
509
  hints.push({
510
510
  ...hint,
@@ -523,18 +523,18 @@ function decorateLanguageService(files, languageService) {
523
523
  languageService.getFileReferences = fileName => {
524
524
  const unresolved = getFileReferences(fileName);
525
525
  const resolved = unresolved
526
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
526
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
527
527
  .filter(utils_1.notEmpty);
528
528
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
529
529
  };
530
530
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
531
531
  let results = [];
532
532
  const processedFilePositions = new Set();
533
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
534
- if (virtualCode) {
533
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
534
+ if (serviceScript) {
535
535
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
536
536
  if (filter(mapping.data)) {
537
- process(fileName, generateOffset + sourceFile.snapshot.getLength());
537
+ process(fileName, generateOffset + sourceScript.snapshot.getLength());
538
538
  }
539
539
  }
540
540
  }
@@ -554,16 +554,16 @@ function decorateLanguageService(files, languageService) {
554
554
  results = results.concat(result);
555
555
  for (const ref of getLinkedCodes(result)) {
556
556
  processedFilePositions.add(ref[0] + ':' + ref[1]);
557
- const [virtualFile, sourceFile] = (0, utils_1.getVirtualFileAndMap)(files, ref[0]);
558
- if (!virtualFile) {
557
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
558
+ if (!serviceScript) {
559
559
  continue;
560
560
  }
561
- const linkedCodeMap = files.getLinkedCodeMap(virtualFile.code);
561
+ const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
562
562
  if (!linkedCodeMap) {
563
563
  continue;
564
564
  }
565
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceFile.snapshot.getLength())) {
566
- process(ref[0], linkedCodeOffset + sourceFile.snapshot.getLength());
565
+ for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceScript.snapshot.getLength())) {
566
+ process(ref[0], linkedCodeOffset + sourceScript.snapshot.getLength());
567
567
  }
568
568
  }
569
569
  }
@@ -1,4 +1,4 @@
1
- import { type FileRegistry } from '@volar/language-core';
1
+ import { type Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageServiceHost(virtualFiles: FileRegistry, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
3
+ export declare function decorateLanguageServiceHost(language: Language, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
4
4
  export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
@@ -3,10 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const resolveModuleName_1 = require("../resolveModuleName");
6
- function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
6
+ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
7
7
  let extraProjectVersion = 0;
8
- const { languagePlugins } = virtualFiles;
9
- const exts = languagePlugins
8
+ const exts = language.plugins
10
9
  .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
11
10
  .flat();
12
11
  const scripts = new Map();
@@ -29,8 +28,8 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
29
28
  return readDirectory(path, extensions, exclude, include, depth);
30
29
  };
31
30
  }
32
- if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
33
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => virtualFiles.get(fileName));
31
+ if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
32
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(fileName));
34
33
  if (resolveModuleNameLiterals) {
35
34
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
36
35
  if (moduleLiterals.every(name => !exts.some(ext => name.text.endsWith(ext)))) {
@@ -86,25 +85,25 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
86
85
  const snapshot = getScriptSnapshot(fileName);
87
86
  if (snapshot) {
88
87
  extraProjectVersion++;
89
- const sourceFile = virtualFiles.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
90
- if (sourceFile.generated) {
88
+ const sourceScript = language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
89
+ if (sourceScript.generated) {
91
90
  const text = snapshot.getText(0, snapshot.getLength());
92
91
  let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
93
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
94
- if (script) {
95
- extension = script.extension;
96
- scriptKind = script.scriptKind;
97
- patchedText += script.code.snapshot.getText(0, script.code.snapshot.getLength());
92
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
93
+ if (serviceScript) {
94
+ extension = serviceScript.extension;
95
+ scriptKind = serviceScript.scriptKind;
96
+ patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
98
97
  }
99
98
  snapshotSnapshot = ts.ScriptSnapshot.fromString(patchedText);
100
- if (sourceFile.generated.languagePlugin.typescript?.getExtraScripts) {
99
+ if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
101
100
  console.warn('getExtraScripts() is not available in this use case.');
102
101
  }
103
102
  }
104
103
  }
105
- else if (virtualFiles.get(fileName)) {
104
+ else if (language.scripts.get(fileName)) {
106
105
  extraProjectVersion++;
107
- virtualFiles.delete(fileName);
106
+ language.scripts.delete(fileName);
108
107
  }
109
108
  scripts.set(fileName, {
110
109
  version,
@@ -1,3 +1,3 @@
1
- import type { FileRegistry } from '@volar/language-core';
1
+ import type { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateProgram(files: FileRegistry, program: ts.Program): void;
3
+ export declare function decorateProgram(language: Language, program: ts.Program): void;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decorateProgram = void 0;
4
4
  const utils_1 = require("./utils");
5
5
  const transform_1 = require("./transform");
6
- function decorateProgram(files, program) {
6
+ function decorateProgram(language, program) {
7
7
  const emit = program.emit;
8
8
  // for tsc --noEmit
9
9
  const getSyntacticDiagnostics = program.getSyntacticDiagnostics;
@@ -17,29 +17,29 @@ function decorateProgram(files, program) {
17
17
  return {
18
18
  ...result,
19
19
  diagnostics: result.diagnostics
20
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
20
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
21
21
  .filter(utils_1.notEmpty),
22
22
  };
23
23
  };
24
24
  program.getSyntacticDiagnostics = (sourceFile, cancellationToken) => {
25
25
  return getSyntacticDiagnostics(sourceFile, cancellationToken)
26
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
26
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
27
27
  .filter(utils_1.notEmpty);
28
28
  };
29
29
  program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
30
30
  return getSemanticDiagnostics(sourceFile, cancellationToken)
31
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
31
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
32
32
  .filter(utils_1.notEmpty);
33
33
  };
34
34
  program.getGlobalDiagnostics = cancellationToken => {
35
35
  return getGlobalDiagnostics(cancellationToken)
36
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
36
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
37
37
  .filter(utils_1.notEmpty);
38
38
  };
39
39
  // @ts-ignore
40
40
  program.getBindAndCheckDiagnostics = (sourceFile, cancellationToken) => {
41
41
  return getBindAndCheckDiagnostics(sourceFile, cancellationToken)
42
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
42
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
43
43
  .filter(utils_1.notEmpty);
44
44
  };
45
45
  }