@volar/typescript 2.1.6 → 2.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,14 +31,14 @@ function decorateLanguageService(files, languageService) {
31
31
  // methods
32
32
  const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
33
33
  languageService.getFormattingEditsForDocument = (fileName, options) => {
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
  if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
37
37
  return [];
38
38
  }
39
39
  const edits = getFormattingEditsForDocument(fileName, options);
40
40
  return edits
41
- .map(edit => (0, transform_1.transformTextChange)(sourceFile, map, edit, language_core_1.isFormattingEnabled))
41
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
42
42
  .filter(utils_1.notEmpty);
43
43
  }
44
44
  else {
@@ -46,14 +46,14 @@ function decorateLanguageService(files, languageService) {
46
46
  }
47
47
  };
48
48
  languageService.getFormattingEditsForRange = (fileName, start, end, options) => {
49
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
50
- if (virtualCode) {
51
- const generateStart = (0, transform_1.toGeneratedOffset)(sourceFile, map, start, language_core_1.isFormattingEnabled);
52
- const generateEnd = (0, transform_1.toGeneratedOffset)(sourceFile, map, end, language_core_1.isFormattingEnabled);
49
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
50
+ if (serviceScript) {
51
+ const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
52
+ const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
53
53
  if (generateStart !== undefined && generateEnd !== undefined) {
54
54
  const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
55
55
  return edits
56
- .map(edit => (0, transform_1.transformTextChange)(sourceFile, map, edit, language_core_1.isFormattingEnabled))
56
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
57
57
  .filter(utils_1.notEmpty);
58
58
  }
59
59
  return [];
@@ -63,13 +63,13 @@ function decorateLanguageService(files, languageService) {
63
63
  }
64
64
  };
65
65
  languageService.getFormattingEditsAfterKeystroke = (fileName, position, key, options) => {
66
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
67
- if (virtualCode) {
68
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isFormattingEnabled);
66
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
67
+ if (serviceScript) {
68
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
69
69
  if (generatePosition !== undefined) {
70
70
  const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
71
71
  return edits
72
- .map(edit => (0, transform_1.transformTextChange)(sourceFile, map, edit, language_core_1.isFormattingEnabled))
72
+ .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
73
73
  .filter(utils_1.notEmpty);
74
74
  }
75
75
  return [];
@@ -81,19 +81,19 @@ function decorateLanguageService(files, languageService) {
81
81
  languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
82
82
  const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
83
83
  return edits
84
- .map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isRenameEnabled))
84
+ .map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
85
85
  .filter(utils_1.notEmpty);
86
86
  };
87
87
  languageService.getLinkedEditingRangeAtPosition = (fileName, position) => {
88
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
89
- if (virtualCode) {
90
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isLinkedEditingEnabled);
88
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
89
+ if (serviceScript) {
90
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
91
91
  if (generatePosition !== undefined) {
92
92
  const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
93
93
  if (info) {
94
94
  return {
95
95
  ranges: info.ranges
96
- .map(span => (0, transform_1.transformTextSpan)(sourceFile, map, span, language_core_1.isLinkedEditingEnabled))
96
+ .map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
97
97
  .filter(utils_1.notEmpty),
98
98
  wordPattern: info.wordPattern,
99
99
  };
@@ -105,16 +105,16 @@ function decorateLanguageService(files, languageService) {
105
105
  }
106
106
  };
107
107
  languageService.prepareCallHierarchy = (fileName, position) => {
108
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
109
- if (virtualCode) {
110
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isCallHierarchyEnabled);
108
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
109
+ if (serviceScript) {
110
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
111
111
  if (generatePosition !== undefined) {
112
112
  const item = prepareCallHierarchy(fileName, generatePosition);
113
113
  if (Array.isArray(item)) {
114
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled));
114
+ return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
115
115
  }
116
116
  else if (item) {
117
- return (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled);
117
+ return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
118
118
  }
119
119
  }
120
120
  }
@@ -124,9 +124,9 @@ function decorateLanguageService(files, languageService) {
124
124
  };
125
125
  languageService.provideCallHierarchyIncomingCalls = (fileName, position) => {
126
126
  let calls = [];
127
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
128
- if (virtualCode) {
129
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isCallHierarchyEnabled);
127
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
128
+ if (serviceScript) {
129
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
130
130
  if (generatePosition !== undefined) {
131
131
  calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
132
132
  }
@@ -136,9 +136,9 @@ function decorateLanguageService(files, languageService) {
136
136
  }
137
137
  return calls
138
138
  .map(call => {
139
- const from = (0, transform_1.transformCallHierarchyItem)(files, call.from, language_core_1.isCallHierarchyEnabled);
139
+ const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
140
140
  const fromSpans = call.fromSpans
141
- .map(span => (0, transform_1.transformSpan)(files, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
141
+ .map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
142
142
  .filter(utils_1.notEmpty);
143
143
  return {
144
144
  from,
@@ -148,9 +148,9 @@ function decorateLanguageService(files, languageService) {
148
148
  };
149
149
  languageService.provideCallHierarchyOutgoingCalls = (fileName, position) => {
150
150
  let calls = [];
151
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
152
- if (virtualCode) {
153
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isCallHierarchyEnabled);
151
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
152
+ if (serviceScript) {
153
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
154
154
  if (generatePosition !== undefined) {
155
155
  calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
156
156
  }
@@ -160,10 +160,10 @@ function decorateLanguageService(files, languageService) {
160
160
  }
161
161
  return calls
162
162
  .map(call => {
163
- const to = (0, transform_1.transformCallHierarchyItem)(files, call.to, language_core_1.isCallHierarchyEnabled);
163
+ const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
164
164
  const fromSpans = call.fromSpans
165
- .map(span => sourceFile
166
- ? (0, transform_1.transformTextSpan)(sourceFile, map, span, language_core_1.isCallHierarchyEnabled)
165
+ .map(span => sourceScript
166
+ ? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
167
167
  : span)
168
168
  .filter(utils_1.notEmpty);
169
169
  return {
@@ -175,18 +175,18 @@ function decorateLanguageService(files, languageService) {
175
175
  languageService.organizeImports = (args, formatOptions, preferences) => {
176
176
  const unresolved = organizeImports(args, formatOptions, preferences);
177
177
  const resolved = unresolved
178
- .map(changes => (0, transform_1.transformFileTextChanges)(files, changes, language_core_1.isCodeActionsEnabled))
178
+ .map(changes => (0, transform_1.transformFileTextChanges)(language, changes, language_core_1.isCodeActionsEnabled))
179
179
  .filter(utils_1.notEmpty);
180
180
  return resolved;
181
181
  };
182
182
  languageService.getQuickInfoAtPosition = (fileName, position) => {
183
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
184
- if (virtualCode) {
185
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isHoverEnabled);
183
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
184
+ if (serviceScript) {
185
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isHoverEnabled);
186
186
  if (generatePosition !== undefined) {
187
187
  const result = getQuickInfoAtPosition(fileName, generatePosition);
188
188
  if (result) {
189
- const textSpan = (0, transform_1.transformTextSpan)(sourceFile, map, result.textSpan, language_core_1.isHoverEnabled);
189
+ const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.textSpan, language_core_1.isHoverEnabled);
190
190
  if (textSpan) {
191
191
  return {
192
192
  ...result,
@@ -215,11 +215,11 @@ function decorateLanguageService(files, languageService) {
215
215
  ...highlights,
216
216
  highlightSpans: highlights.highlightSpans
217
217
  .map(span => {
218
- const textSpan = (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
218
+ const textSpan = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
219
219
  if (textSpan) {
220
220
  return {
221
221
  ...span,
222
- contextSpan: (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
222
+ contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
223
223
  textSpan,
224
224
  };
225
225
  }
@@ -230,9 +230,9 @@ function decorateLanguageService(files, languageService) {
230
230
  return resolved;
231
231
  };
232
232
  languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
233
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
234
- if (virtualCode) {
235
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
233
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
234
+ if (serviceScript) {
235
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
236
236
  if (generatePosition !== undefined) {
237
237
  const por = typeof positionOrRange === 'number'
238
238
  ? generatePosition
@@ -250,9 +250,9 @@ function decorateLanguageService(files, languageService) {
250
250
  };
251
251
  languageService.getEditsForRefactor = (fileName, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
252
252
  let edits;
253
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
254
- if (virtualCode) {
255
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, typeof positionOrRange === 'number'
253
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
254
+ if (serviceScript) {
255
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
256
256
  ? positionOrRange
257
257
  : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
258
258
  if (generatePosition !== undefined) {
@@ -270,19 +270,19 @@ function decorateLanguageService(files, languageService) {
270
270
  }
271
271
  if (edits) {
272
272
  edits.edits = edits.edits
273
- .map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled))
273
+ .map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled))
274
274
  .filter(utils_1.notEmpty);
275
275
  return edits;
276
276
  }
277
277
  };
278
278
  languageService.getRenameInfo = (fileName, position, options) => {
279
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
280
- if (virtualCode) {
281
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isRenameEnabled);
279
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
280
+ if (serviceScript) {
281
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isRenameEnabled);
282
282
  if (generatePosition !== undefined) {
283
283
  const info = getRenameInfo(fileName, generatePosition, options);
284
284
  if (info.canRename) {
285
- const span = (0, transform_1.transformTextSpan)(sourceFile, map, info.triggerSpan, language_core_1.isRenameEnabled);
285
+ const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
286
286
  if (span) {
287
287
  info.triggerSpan = span;
288
288
  return info;
@@ -303,10 +303,10 @@ function decorateLanguageService(files, languageService) {
303
303
  };
304
304
  languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
305
305
  let fixes = [];
306
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
307
- if (virtualCode) {
308
- const generateStart = (0, transform_1.toGeneratedOffset)(sourceFile, map, start, language_core_1.isCodeActionsEnabled);
309
- const generateEnd = (0, transform_1.toGeneratedOffset)(sourceFile, map, end, language_core_1.isCodeActionsEnabled);
306
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
307
+ if (serviceScript) {
308
+ const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
309
+ const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
310
310
  if (generateStart !== undefined && generateEnd !== undefined) {
311
311
  fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
312
312
  }
@@ -315,14 +315,14 @@ function decorateLanguageService(files, languageService) {
315
315
  fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
316
316
  }
317
317
  fixes = fixes.map(fix => {
318
- fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
318
+ fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
319
319
  return fix;
320
320
  });
321
321
  return fixes;
322
322
  };
323
323
  languageService.getEncodedSemanticClassifications = (fileName, span, format) => {
324
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
325
- if (virtualCode) {
324
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
325
+ if (serviceScript) {
326
326
  let start;
327
327
  let end;
328
328
  for (const mapping of map.mappings) {
@@ -335,14 +335,14 @@ function decorateLanguageService(files, languageService) {
335
335
  }
336
336
  }
337
337
  start ??= 0;
338
- end ??= sourceFile.snapshot.getLength();
339
- start += sourceFile.snapshot.getLength();
340
- end += sourceFile.snapshot.getLength();
338
+ end ??= sourceScript.snapshot.getLength();
339
+ start += sourceScript.snapshot.getLength();
340
+ end += sourceScript.snapshot.getLength();
341
341
  const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
342
342
  const spans = [];
343
343
  for (let i = 0; i < result.spans.length; i += 3) {
344
- const sourceStart = (0, transform_1.toSourceOffset)(sourceFile, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
345
- const sourceEnd = (0, transform_1.toSourceOffset)(sourceFile, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
344
+ const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
345
+ const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
346
346
  if (sourceStart !== undefined && sourceEnd !== undefined) {
347
347
  spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
348
348
  }
@@ -356,17 +356,17 @@ function decorateLanguageService(files, languageService) {
356
356
  };
357
357
  languageService.getSyntacticDiagnostics = fileName => {
358
358
  return getSyntacticDiagnostics(fileName)
359
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
359
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
360
360
  .filter(utils_1.notEmpty);
361
361
  };
362
362
  languageService.getSemanticDiagnostics = fileName => {
363
363
  return getSemanticDiagnostics(fileName)
364
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
364
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
365
365
  .filter(utils_1.notEmpty);
366
366
  };
367
367
  languageService.getSuggestionDiagnostics = fileName => {
368
368
  return getSuggestionDiagnostics(fileName)
369
- .map(d => (0, transform_1.transformDiagnostic)(files, d))
369
+ .map(d => (0, transform_1.transformDiagnostic)(language, d))
370
370
  .filter(utils_1.notEmpty);
371
371
  };
372
372
  languageService.getDefinitionAndBoundSpan = (fileName, position) => {
@@ -376,14 +376,14 @@ function decorateLanguageService(files, languageService) {
376
376
  }
377
377
  });
378
378
  const textSpan = unresolved
379
- .map(s => (0, transform_1.transformSpan)(files, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
379
+ .map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
380
380
  .filter(utils_1.notEmpty)[0];
381
381
  if (!textSpan) {
382
382
  return;
383
383
  }
384
384
  const definitions = unresolved
385
385
  .map(s => s.definitions
386
- ?.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
386
+ ?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
387
387
  .filter(utils_1.notEmpty))
388
388
  .filter(utils_1.notEmpty)
389
389
  .flat();
@@ -403,12 +403,12 @@ function decorateLanguageService(files, languageService) {
403
403
  const resolved = unresolved
404
404
  .flat()
405
405
  .map(symbol => {
406
- const definition = (0, transform_1.transformDocumentSpan)(files, symbol.definition, language_core_1.isDefinitionEnabled);
406
+ const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled);
407
407
  if (definition) {
408
408
  return {
409
409
  definition,
410
410
  references: symbol.references
411
- .map(r => (0, transform_1.transformDocumentSpan)(files, r, language_core_1.isReferencesEnabled))
411
+ .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
412
412
  .filter(utils_1.notEmpty),
413
413
  };
414
414
  }
@@ -424,7 +424,7 @@ function decorateLanguageService(files, languageService) {
424
424
  });
425
425
  const resolved = unresolved
426
426
  .flat()
427
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
427
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
428
428
  .filter(utils_1.notEmpty);
429
429
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
430
430
  };
@@ -436,7 +436,7 @@ function decorateLanguageService(files, languageService) {
436
436
  });
437
437
  const resolved = unresolved
438
438
  .flat()
439
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isTypeDefinitionEnabled))
439
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
440
440
  .filter(utils_1.notEmpty);
441
441
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
442
442
  };
@@ -448,7 +448,7 @@ function decorateLanguageService(files, languageService) {
448
448
  });
449
449
  const resolved = unresolved
450
450
  .flat()
451
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isImplementationEnabled))
451
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
452
452
  .filter(utils_1.notEmpty);
453
453
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
454
454
  };
@@ -460,7 +460,7 @@ function decorateLanguageService(files, languageService) {
460
460
  });
461
461
  const resolved = unresolved
462
462
  .flat()
463
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isRenameEnabled))
463
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
464
464
  .filter(utils_1.notEmpty);
465
465
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
466
466
  };
@@ -472,17 +472,17 @@ function decorateLanguageService(files, languageService) {
472
472
  });
473
473
  const resolved = unresolved
474
474
  .flat()
475
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
475
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
476
476
  .filter(utils_1.notEmpty);
477
477
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
478
478
  };
479
479
  languageService.getCompletionsAtPosition = (fileName, position, options, formattingSettings) => {
480
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
481
- if (virtualCode) {
480
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
481
+ if (serviceScript) {
482
482
  let mainResult;
483
483
  let additionalResults = [];
484
484
  let isAdditional;
485
- const generatedOffset = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, data => {
485
+ const generatedOffset = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, data => {
486
486
  if (!(0, language_core_1.isCompletionEnabled)(data)) {
487
487
  return false;
488
488
  }
@@ -496,9 +496,9 @@ function decorateLanguageService(files, languageService) {
496
496
  const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
497
497
  if (result) {
498
498
  for (const entry of result.entries) {
499
- entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceFile, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
499
+ entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
500
500
  }
501
- result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(sourceFile, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
501
+ result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
502
502
  if (isAdditional) {
503
503
  additionalResults.push(result);
504
504
  }
@@ -526,9 +526,9 @@ function decorateLanguageService(files, languageService) {
526
526
  };
527
527
  languageService.getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
528
528
  let details;
529
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
530
- if (virtualCode) {
531
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceFile, map, position, language_core_1.isCompletionEnabled);
529
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
530
+ if (serviceScript) {
531
+ const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
532
532
  if (generatePosition !== undefined) {
533
533
  details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
534
534
  }
@@ -538,14 +538,14 @@ function decorateLanguageService(files, languageService) {
538
538
  }
539
539
  if (details?.codeActions) {
540
540
  for (const codeAction of details.codeActions) {
541
- codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
541
+ codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
542
542
  }
543
543
  }
544
544
  return details;
545
545
  };
546
546
  languageService.provideInlayHints = (fileName, span, preferences) => {
547
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
548
- if (virtualCode) {
547
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
548
+ if (serviceScript) {
549
549
  let start;
550
550
  let end;
551
551
  for (const mapping of map.mappings) {
@@ -560,12 +560,12 @@ function decorateLanguageService(files, languageService) {
560
560
  start = 0;
561
561
  end = 0;
562
562
  }
563
- start += sourceFile.snapshot.getLength();
564
- end += sourceFile.snapshot.getLength();
563
+ start += sourceScript.snapshot.getLength();
564
+ end += sourceScript.snapshot.getLength();
565
565
  const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
566
566
  const hints = [];
567
567
  for (const hint of result) {
568
- const sourcePosition = (0, transform_1.toSourceOffset)(sourceFile, map, hint.position, language_core_1.isInlayHintsEnabled);
568
+ const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
569
569
  if (sourcePosition !== undefined) {
570
570
  hints.push({
571
571
  ...hint,
@@ -582,18 +582,18 @@ function decorateLanguageService(files, languageService) {
582
582
  languageService.getFileReferences = fileName => {
583
583
  const unresolved = getFileReferences(fileName);
584
584
  const resolved = unresolved
585
- .map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
585
+ .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
586
586
  .filter(utils_1.notEmpty);
587
587
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
588
588
  };
589
589
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
590
590
  let results = [];
591
591
  const processedFilePositions = new Set();
592
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
593
- if (virtualCode) {
592
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
593
+ if (serviceScript) {
594
594
  for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
595
595
  if (filter(mapping.data)) {
596
- process(fileName, generatedOffset + sourceFile.snapshot.getLength());
596
+ process(fileName, generatedOffset + sourceScript.snapshot.getLength());
597
597
  }
598
598
  }
599
599
  }
@@ -613,16 +613,16 @@ function decorateLanguageService(files, languageService) {
613
613
  results = results.concat(result);
614
614
  for (const ref of getLinkedCodes(result)) {
615
615
  processedFilePositions.add(ref[0] + ':' + ref[1]);
616
- const [virtualFile, sourceFile] = (0, utils_1.getVirtualFileAndMap)(files, ref[0]);
616
+ const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
617
617
  if (!virtualFile) {
618
618
  continue;
619
619
  }
620
- const linkedCodeMap = files.getLinkedCodeMap(virtualFile.code);
620
+ const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
621
621
  if (!linkedCodeMap) {
622
622
  continue;
623
623
  }
624
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceFile.snapshot.getLength())) {
625
- process(ref[0], linkedCodeOffset + sourceFile.snapshot.getLength());
624
+ for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceScript.snapshot.getLength())) {
625
+ process(ref[0], linkedCodeOffset + sourceScript.snapshot.getLength());
626
626
  }
627
627
  }
628
628
  }
@@ -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)))) {
@@ -82,25 +81,25 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
82
81
  const snapshot = getScriptSnapshot(fileName);
83
82
  if (snapshot) {
84
83
  extraProjectVersion++;
85
- const sourceFile = virtualFiles.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
86
- if (sourceFile.generated) {
84
+ const sourceScript = language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
85
+ if (sourceScript.generated) {
87
86
  const text = snapshot.getText(0, snapshot.getLength());
88
87
  let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
89
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
90
- if (script) {
91
- extension = script.extension;
92
- scriptKind = script.scriptKind;
93
- patchedText += script.code.snapshot.getText(0, script.code.snapshot.getLength());
88
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
89
+ if (serviceScript) {
90
+ extension = serviceScript.extension;
91
+ scriptKind = serviceScript.scriptKind;
92
+ patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
94
93
  }
95
94
  snapshotSnapshot = ts.ScriptSnapshot.fromString(patchedText);
96
- if (sourceFile.generated.languagePlugin.typescript?.getExtraScripts) {
95
+ if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
97
96
  console.warn('getExtraScripts() is not available in this use case.');
98
97
  }
99
98
  }
100
99
  }
101
- else if (virtualFiles.get(fileName)) {
100
+ else if (language.scripts.get(fileName)) {
102
101
  extraProjectVersion++;
103
- virtualFiles.delete(fileName);
102
+ language.scripts.delete(fileName);
104
103
  }
105
104
  if (snapshotSnapshot) {
106
105
  scripts.set(fileName, [
@@ -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;