@volar/typescript 2.1.5 → 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
  }
@@ -9,7 +9,7 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
9
9
  const options = args[0];
10
10
  assert(!!options.host, '!!options.host');
11
11
  const sourceFileToSnapshotMap = new WeakMap();
12
- const files = (0, language_core_1.createFileRegistry)(getLanguagePlugins(ts, options), ts.sys.useCaseSensitiveFileNames, fileName => {
12
+ const language = (0, language_core_1.createLanguage)(getLanguagePlugins(ts, options), ts.sys.useCaseSensitiveFileNames, fileName => {
13
13
  let snapshot;
14
14
  assert(originalSourceFiles.has(fileName), `originalSourceFiles.has(${fileName})`);
15
15
  const sourceFile = originalSourceFiles.get(fileName);
@@ -31,10 +31,10 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
31
31
  }
32
32
  }
33
33
  if (snapshot) {
34
- files.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
34
+ language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
35
35
  }
36
36
  else {
37
- files.delete(fileName);
37
+ language.scripts.delete(fileName);
38
38
  }
39
39
  });
40
40
  const originalSourceFiles = new Map();
@@ -60,16 +60,16 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
60
60
  if (originalSourceFile && extensions.some(ext => fileName.endsWith(ext))) {
61
61
  let sourceFile2 = parsedSourceFiles.get(originalSourceFile);
62
62
  if (!sourceFile2) {
63
- const sourceFile = files.get(fileName);
64
- assert(!!sourceFile, '!!sourceFile');
63
+ const sourceScript = language.scripts.get(fileName);
64
+ assert(!!sourceScript, '!!sourceScript');
65
65
  let patchedText = originalSourceFile.text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
66
66
  let scriptKind = ts.ScriptKind.TS;
67
- if (sourceFile.generated?.languagePlugin.typescript) {
68
- const { getScript, getExtraScripts } = sourceFile.generated.languagePlugin.typescript;
69
- const script = getScript(sourceFile.generated.code);
70
- if (script) {
71
- scriptKind = script.scriptKind;
72
- patchedText += script.code.snapshot.getText(0, script.code.snapshot.getLength());
67
+ if (sourceScript.generated?.languagePlugin.typescript) {
68
+ const { getServiceScript: getScript, getExtraServiceScripts: getExtraScripts } = sourceScript.generated.languagePlugin.typescript;
69
+ const serviceScript = getScript(sourceScript.generated.root);
70
+ if (serviceScript) {
71
+ scriptKind = serviceScript.scriptKind;
72
+ patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
73
73
  }
74
74
  if (getExtraScripts) {
75
75
  console.warn('getExtraScripts() is not available in this use case.');
@@ -95,8 +95,9 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
95
95
  });
96
96
  };
97
97
  const program = Reflect.apply(target, thisArg, [options]);
98
- (0, decorateProgram_1.decorateProgram)(files, program);
99
- program.__volar__ = { files };
98
+ (0, decorateProgram_1.decorateProgram)(language, program);
99
+ // TODO: #128
100
+ program.__volar__ = { files: language };
100
101
  return program;
101
102
  function resolveModuleName(name, containingFile, options, redirectedReference) {
102
103
  const resolved = ts.resolveModuleName(name, containingFile, options, moduleResolutionHost, originalHost.getModuleResolutionCache?.(), redirectedReference);
@@ -1,10 +1,10 @@
1
- import { FileRegistry, CodeInformation } from '@volar/language-core';
1
+ import { Language, CodeInformation } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function transformCallHierarchyItem(files: FileRegistry, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
4
- export declare function transformDiagnostic<T extends ts.Diagnostic>(files: FileRegistry, diagnostic: T): T | undefined;
5
- export declare function transformFileTextChanges(files: FileRegistry, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
6
- export declare function transformDocumentSpan<T extends ts.DocumentSpan>(files: FileRegistry, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
7
- export declare function transformSpan(files: FileRegistry, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
3
+ export declare function transformCallHierarchyItem(files: Language, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
4
+ export declare function transformDiagnostic<T extends ts.Diagnostic>(files: Language, diagnostic: T): T | undefined;
5
+ export declare function transformFileTextChanges(files: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
6
+ export declare function transformDocumentSpan<T extends ts.DocumentSpan>(files: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
7
+ export declare function transformSpan(files: Language, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
8
8
  fileName: string;
9
9
  textSpan: ts.TextSpan;
10
10
  } | undefined;
@@ -26,9 +26,9 @@ function transformDiagnostic(files, diagnostic) {
26
26
  if (diagnostic.file !== undefined
27
27
  && diagnostic.start !== undefined
28
28
  && diagnostic.length !== undefined) {
29
- const [virtualCode, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, diagnostic.file.fileName);
29
+ const [virtualCode, sourceScript, map] = (0, utils_1.getServiceScript)(files, diagnostic.file.fileName);
30
30
  if (virtualCode) {
31
- const sourceRange = transformRange(sourceFile, map, diagnostic.start, diagnostic.start + diagnostic.length, language_core_1.shouldReportDiagnostics);
31
+ const sourceRange = transformRange(sourceScript, map, diagnostic.start, diagnostic.start + diagnostic.length, language_core_1.shouldReportDiagnostics);
32
32
  if (sourceRange) {
33
33
  transformedDiagnostics.set(diagnostic, {
34
34
  ...diagnostic,
@@ -49,7 +49,7 @@ function transformDiagnostic(files, diagnostic) {
49
49
  }
50
50
  exports.transformDiagnostic = transformDiagnostic;
51
51
  function transformFileTextChanges(files, changes, filter) {
52
- const [_, source] = (0, utils_1.getVirtualFileAndMap)(files, changes.fileName);
52
+ const [_, source] = (0, utils_1.getServiceScript)(files, changes.fileName);
53
53
  if (source) {
54
54
  return {
55
55
  ...changes,
@@ -72,7 +72,7 @@ exports.transformFileTextChanges = transformFileTextChanges;
72
72
  function transformDocumentSpan(files, documentSpan, filter, shouldFallback) {
73
73
  let textSpan = transformSpan(files, documentSpan.fileName, documentSpan.textSpan, filter);
74
74
  if (!textSpan && shouldFallback) {
75
- const [virtualCode] = (0, utils_1.getVirtualFileAndMap)(files, documentSpan.fileName);
75
+ const [virtualCode] = (0, utils_1.getServiceScript)(files, documentSpan.fileName);
76
76
  if (virtualCode) {
77
77
  textSpan = {
78
78
  fileName: documentSpan.fileName,
@@ -104,9 +104,9 @@ function transformSpan(files, fileName, textSpan, filter) {
104
104
  if (!textSpan) {
105
105
  return;
106
106
  }
107
- const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
107
+ const [virtualFile, sourceScript, map] = (0, utils_1.getServiceScript)(files, fileName);
108
108
  if (virtualFile) {
109
- const sourceRange = transformRange(sourceFile, map, textSpan.start, textSpan.start + textSpan.length, filter);
109
+ const sourceRange = transformRange(sourceScript, map, textSpan.start, textSpan.start + textSpan.length, filter);
110
110
  if (sourceRange) {
111
111
  return {
112
112
  fileName,
@@ -125,10 +125,10 @@ function transformSpan(files, fileName, textSpan, filter) {
125
125
  }
126
126
  }
127
127
  exports.transformSpan = transformSpan;
128
- function transformRange(sourceFile, map, start, end, filter) {
129
- for (const sourceStart of map.getSourceOffsets(start - sourceFile.snapshot.getLength())) {
128
+ function transformRange(sourceScript, map, start, end, filter) {
129
+ for (const sourceStart of map.getSourceOffsets(start - sourceScript.snapshot.getLength())) {
130
130
  if (filter(sourceStart[1].data)) {
131
- for (const sourceEnd of map.getSourceOffsets(end - sourceFile.snapshot.getLength())) {
131
+ for (const sourceEnd of map.getSourceOffsets(end - sourceScript.snapshot.getLength())) {
132
132
  if (sourceEnd[0] >= sourceStart[0] && filter(sourceEnd[1].data)) {
133
133
  return [sourceStart[0], sourceEnd[0]];
134
134
  }
@@ -1,3 +1,3 @@
1
- import type { FileRegistry } from '@volar/language-core';
1
+ import type { Language } from '@volar/language-core';
2
2
  export declare function notEmpty<T>(value: T | null | undefined): value is T;
3
- export declare function getVirtualFileAndMap(files: FileRegistry, fileName: string): readonly [import("@volar/language-core").ServiceScript, import("@volar/language-core").SourceFile, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
3
+ export declare function getServiceScript(language: Language, fileName: string): readonly [import("@volar/language-core").ServiceScript, import("@volar/language-core").SourceScript, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
package/lib/node/utils.js CHANGED
@@ -1,23 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getVirtualFileAndMap = exports.notEmpty = void 0;
3
+ exports.getServiceScript = exports.notEmpty = void 0;
4
4
  function notEmpty(value) {
5
5
  return value !== null && value !== undefined;
6
6
  }
7
7
  exports.notEmpty = notEmpty;
8
- function getVirtualFileAndMap(files, fileName) {
9
- const sourceFile = files.get(fileName);
10
- if (sourceFile?.generated) {
11
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
12
- if (script) {
13
- for (const map of files.getMaps(script.code)) {
14
- if (map[1][0] === sourceFile.snapshot) {
15
- return [script, sourceFile, map[1][1]];
16
- }
8
+ function getServiceScript(language, fileName) {
9
+ const sourceScript = language.scripts.get(fileName);
10
+ if (sourceScript?.generated) {
11
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
12
+ if (serviceScript) {
13
+ const map = language.maps.get(serviceScript.code, sourceScript.id);
14
+ if (map) {
15
+ return [serviceScript, sourceScript, map];
17
16
  }
18
17
  }
19
18
  }
20
19
  return [undefined, undefined, undefined];
21
20
  }
22
- exports.getVirtualFileAndMap = getVirtualFileAndMap;
21
+ exports.getServiceScript = getServiceScript;
23
22
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,2 @@
1
- import { LanguagePlugin, LanguageContext, TypeScriptProjectHost } from '@volar/language-core';
2
- import type * as ts from 'typescript';
3
- import type { createSys } from './createSys';
4
- export declare function createLanguage(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, languagePlugins: LanguagePlugin<any>[], configFileName: string | undefined, projectHost: TypeScriptProjectHost, { fileIdToFileName, fileNameToFileId }: {
5
- fileIdToFileName: (uri: string) => string;
6
- fileNameToFileId: (fileName: string) => string;
7
- }): LanguageContext;
1
+ import { LanguagePlugin, Language, TypeScriptProjectHost } from '@volar/language-core';
2
+ export declare function createTypeScriptLanguage(ts: typeof import('typescript'), languagePlugins: LanguagePlugin[], projectHost: TypeScriptProjectHost): Language;
@@ -1,24 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLanguage = void 0;
3
+ exports.createTypeScriptLanguage = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const language_core_2 = require("@volar/language-core");
6
6
  const path = require("path-browserify");
7
7
  const resolveModuleName_1 = require("../resolveModuleName");
8
8
  const scriptVersions = new Map();
9
9
  const fsFileSnapshots = new Map();
10
- function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, { fileIdToFileName, fileNameToFileId }) {
11
- const files = (0, language_core_1.createFileRegistry)(languagePlugins, sys.useCaseSensitiveFileNames, fileId => {
12
- const fileName = fileIdToFileName(fileId);
10
+ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
11
+ const language = (0, language_core_1.createLanguage)(languagePlugins, projectHost.useCaseSensitiveFileNames, scriptId => {
12
+ const fileName = projectHost.scriptIdToFileName(scriptId);
13
13
  // opened files
14
14
  let snapshot = projectHost.getScriptSnapshot(fileName);
15
15
  if (!snapshot) {
16
16
  // fs files
17
17
  const cache = fsFileSnapshots.get(fileName);
18
- const modifiedTime = sys.getModifiedTime?.(fileName)?.valueOf();
18
+ const modifiedTime = projectHost.getModifiedTime?.(fileName)?.valueOf();
19
19
  if (!cache || cache[0] !== modifiedTime) {
20
- if (sys.fileExists(fileName)) {
21
- const text = sys.readFile(fileName);
20
+ if (projectHost.fileExists(fileName)) {
21
+ const text = projectHost.readFile(fileName);
22
22
  const snapshot = text !== undefined ? ts.ScriptSnapshot.fromString(text) : undefined;
23
23
  fsFileSnapshots.set(fileName, [modifiedTime, snapshot]);
24
24
  }
@@ -29,10 +29,10 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
29
29
  snapshot = fsFileSnapshots.get(fileName)?.[1];
30
30
  }
31
31
  if (snapshot) {
32
- files.set(fileId, projectHost.getLanguageId(fileId), snapshot);
32
+ language.scripts.set(scriptId, projectHost.getLanguageId(scriptId), snapshot);
33
33
  }
34
34
  else {
35
- files.delete(fileId);
35
+ language.scripts.delete(scriptId);
36
36
  }
37
37
  });
38
38
  let { languageServiceHost, getExtraScript } = createLanguageServiceHost();
@@ -44,11 +44,11 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
44
44
  if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
45
45
  // TODO: can this share between monorepo packages?
46
46
  const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
47
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => files.get(fileNameToFileId(fileName)));
48
- let lastSysVersion = 'version' in sys ? sys.version : undefined;
47
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => language.scripts.get(projectHost.fileNameToScriptId(fileName)));
48
+ let lastSysVersion = projectHost.getSystemVersion?.();
49
49
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
50
- if ('version' in sys && lastSysVersion !== sys.version) {
51
- lastSysVersion = sys.version;
50
+ if (projectHost.getSystemVersion && lastSysVersion !== projectHost.getSystemVersion()) {
51
+ lastSysVersion = projectHost.getSystemVersion();
52
52
  moduleCache.clear();
53
53
  }
54
54
  return moduleLiterals.map(moduleLiteral => {
@@ -56,8 +56,8 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
56
56
  });
57
57
  };
58
58
  languageServiceHost.resolveModuleNames = (moduleNames, containingFile, _reusedNames, redirectedReference, options) => {
59
- if ('version' in sys && lastSysVersion !== sys.version) {
60
- lastSysVersion = sys.version;
59
+ if (projectHost.getSystemVersion && lastSysVersion !== projectHost.getSystemVersion()) {
60
+ lastSysVersion = projectHost.getSystemVersion();
61
61
  moduleCache.clear();
62
62
  }
63
63
  return moduleNames.map(moduleName => {
@@ -65,25 +65,21 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
65
65
  });
66
66
  };
67
67
  }
68
- return {
69
- files,
70
- typescript: {
71
- configFileName,
72
- sys,
73
- projectHost,
74
- languageServiceHost,
75
- getExtraScript,
76
- },
68
+ language.typescript = {
69
+ projectHost,
70
+ languageServiceHost,
71
+ getExtraServiceScript: getExtraScript,
77
72
  };
73
+ return language;
78
74
  function createLanguageServiceHost() {
79
75
  let lastProjectVersion;
80
76
  let tsProjectVersion = 0;
81
- let tsFileRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
82
- let extraScriptRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
77
+ let tsFileRegistry = new language_core_1.FileMap(projectHost.useCaseSensitiveFileNames);
78
+ let extraScriptRegistry = new language_core_1.FileMap(projectHost.useCaseSensitiveFileNames);
83
79
  let lastTsVirtualFileSnapshots = new Set();
84
80
  let lastOtherVirtualFileSnapshots = new Set();
85
81
  const languageServiceHost = {
86
- ...sys,
82
+ ...projectHost,
87
83
  getCurrentDirectory: projectHost.getCurrentDirectory,
88
84
  getCompilationSettings() {
89
85
  const options = projectHost.getCompilationSettings();
@@ -107,16 +103,16 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
107
103
  }
108
104
  },
109
105
  useCaseSensitiveFileNames() {
110
- return sys.useCaseSensitiveFileNames;
106
+ return projectHost.useCaseSensitiveFileNames;
111
107
  },
112
108
  getNewLine() {
113
- return sys.newLine;
109
+ return projectHost.newLine;
114
110
  },
115
111
  getTypeRootsVersion: () => {
116
- return 'version' in sys ? sys.version : -1; // TODO: only update for /node_modules changes?
112
+ return projectHost.getSystemVersion?.() ?? -1; // TODO: only update for /node_modules changes?
117
113
  },
118
114
  getDirectories(dirName) {
119
- return sys.getDirectories(dirName);
115
+ return projectHost.getDirectories(dirName);
120
116
  },
121
117
  readDirectory(dirName, extensions, excludes, includes, depth) {
122
118
  const exts = new Set(extensions);
@@ -126,7 +122,7 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
126
122
  }
127
123
  }
128
124
  extensions = [...exts];
129
- return sys.readDirectory(dirName, extensions, excludes, includes, depth);
125
+ return projectHost.readDirectory(dirName, extensions, excludes, includes, depth);
130
126
  },
131
127
  readFile(fileName) {
132
128
  const snapshot = getScriptSnapshot(fileName);
@@ -139,7 +135,7 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
139
135
  },
140
136
  getProjectVersion() {
141
137
  sync();
142
- return tsProjectVersion + ('version' in sys ? `:${sys.version}` : '');
138
+ return tsProjectVersion + (projectHost.getSystemVersion ? `:${projectHost.getSystemVersion()}` : '');
143
139
  },
144
140
  getScriptFileNames() {
145
141
  sync();
@@ -150,11 +146,11 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
150
146
  if (extraScriptRegistry.has(fileName)) {
151
147
  return extraScriptRegistry.get(fileName).scriptKind;
152
148
  }
153
- const sourceFile = files.get(fileNameToFileId(fileName));
154
- if (sourceFile?.generated) {
155
- const tsCode = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
156
- if (tsCode) {
157
- return tsCode.scriptKind;
149
+ const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
150
+ if (sourceScript?.generated) {
151
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
152
+ if (serviceScript) {
153
+ return serviceScript.scriptKind;
158
154
  }
159
155
  }
160
156
  switch (path.extname(fileName)) {
@@ -199,19 +195,19 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
199
195
  const newOtherVirtualFileSnapshots = new Set();
200
196
  const tsFileNamesSet = new Set();
201
197
  for (const fileName of projectHost.getScriptFileNames()) {
202
- const sourceFile = files.get(fileNameToFileId(fileName));
203
- if (sourceFile?.generated) {
204
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
205
- if (script) {
206
- newTsVirtualFileSnapshots.add(script.code.snapshot);
198
+ const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
199
+ if (sourceScript?.generated) {
200
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
201
+ if (serviceScript) {
202
+ newTsVirtualFileSnapshots.add(serviceScript.code.snapshot);
207
203
  tsFileNamesSet.add(fileName);
208
204
  }
209
- for (const extraScript of sourceFile.generated.languagePlugin.typescript?.getExtraScripts?.(fileName, sourceFile.generated.code) ?? []) {
210
- newTsVirtualFileSnapshots.add(extraScript.code.snapshot);
211
- tsFileNamesSet.add(extraScript.fileName);
212
- extraScriptRegistry.set(extraScript.fileName, extraScript);
205
+ for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
206
+ newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
207
+ tsFileNamesSet.add(extraServiceScript.fileName);
208
+ extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
213
209
  }
214
- for (const code of (0, language_core_2.forEachEmbeddedCode)(sourceFile.generated.code)) {
210
+ for (const code of (0, language_core_2.forEachEmbeddedCode)(sourceScript.generated.root)) {
215
211
  newOtherVirtualFileSnapshots.add(code.snapshot);
216
212
  }
217
213
  }
@@ -238,15 +234,15 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
238
234
  if (extraScriptRegistry.has(fileName)) {
239
235
  return extraScriptRegistry.get(fileName).code.snapshot;
240
236
  }
241
- const sourceFile = files.get(fileNameToFileId(fileName));
242
- if (sourceFile?.generated) {
243
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
244
- if (script) {
245
- return script.code.snapshot;
237
+ const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
238
+ if (sourceScript?.generated) {
239
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
240
+ if (serviceScript) {
241
+ return serviceScript.code.snapshot;
246
242
  }
247
243
  }
248
- else if (sourceFile) {
249
- return sourceFile.snapshot;
244
+ else if (sourceScript) {
245
+ return sourceScript.snapshot;
250
246
  }
251
247
  }
252
248
  function getScriptVersion(fileName) {
@@ -262,34 +258,34 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
262
258
  }
263
259
  return version.map.get(snapshot).toString();
264
260
  }
265
- const sourceFile = files.get(fileNameToFileId(fileName));
266
- if (sourceFile?.generated) {
267
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
268
- if (script) {
269
- if (!version.map.has(script.code.snapshot)) {
270
- version.map.set(script.code.snapshot, version.lastVersion++);
261
+ const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
262
+ if (sourceScript?.generated) {
263
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
264
+ if (serviceScript) {
265
+ if (!version.map.has(serviceScript.code.snapshot)) {
266
+ version.map.set(serviceScript.code.snapshot, version.lastVersion++);
271
267
  }
272
- return version.map.get(script.code.snapshot).toString();
268
+ return version.map.get(serviceScript.code.snapshot).toString();
273
269
  }
274
270
  }
275
271
  const isOpenedFile = !!projectHost.getScriptSnapshot(fileName);
276
272
  if (isOpenedFile) {
277
- const sourceFile = files.get(fileNameToFileId(fileName));
278
- if (sourceFile && !sourceFile.generated) {
279
- if (!version.map.has(sourceFile.snapshot)) {
280
- version.map.set(sourceFile.snapshot, version.lastVersion++);
273
+ const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
274
+ if (sourceScript && !sourceScript.generated) {
275
+ if (!version.map.has(sourceScript.snapshot)) {
276
+ version.map.set(sourceScript.snapshot, version.lastVersion++);
281
277
  }
282
- return version.map.get(sourceFile.snapshot).toString();
278
+ return version.map.get(sourceScript.snapshot).toString();
283
279
  }
284
280
  }
285
- if (sys.fileExists(fileName)) {
286
- return sys.getModifiedTime?.(fileName)?.valueOf().toString() ?? '0';
281
+ if (projectHost.fileExists(fileName)) {
282
+ return projectHost.getModifiedTime?.(fileName)?.valueOf().toString() ?? '0';
287
283
  }
288
284
  return '';
289
285
  }
290
286
  }
291
287
  }
292
- exports.createLanguage = createLanguage;
288
+ exports.createTypeScriptLanguage = createTypeScriptLanguage;
293
289
  function setEquals(a, b) {
294
290
  if (a.size !== b.size) {
295
291
  return false;
@@ -52,17 +52,17 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
52
52
  };
53
53
  }
54
54
  loadLanguagePlugins(ts, info).then(languagePlugins => {
55
- const files = (0, language_core_1.createFileRegistry)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
55
+ const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
56
56
  const snapshot = getScriptSnapshot(fileName);
57
57
  if (snapshot) {
58
- files.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
58
+ language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
59
59
  }
60
60
  else {
61
- files.delete(fileName);
61
+ language.scripts.delete(fileName);
62
62
  }
63
63
  });
64
- (0, decorateLanguageService_1.decorateLanguageService)(files, info.languageService);
65
- (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(files, info.languageServiceHost, ts);
64
+ (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
65
+ (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost, ts);
66
66
  info.project.markAsDirty();
67
67
  initialized = true;
68
68
  });
@@ -23,17 +23,17 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
23
23
  .flat();
24
24
  projectExternalFileExtensions.set(info.project, extensions);
25
25
  const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
26
- const files = (0, language_core_1.createFileRegistry)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
26
+ const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
27
27
  const snapshot = getScriptSnapshot(fileName);
28
28
  if (snapshot) {
29
- files.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
29
+ language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
30
30
  }
31
31
  else {
32
- files.delete(fileName);
32
+ language.scripts.delete(fileName);
33
33
  }
34
34
  });
35
- (0, decorateLanguageService_1.decorateLanguageService)(files, info.languageService);
36
- (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(files, info.languageServiceHost, ts);
35
+ (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
36
+ (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost, ts);
37
37
  }
38
38
  return info.languageService;
39
39
  },
@@ -1,3 +1,3 @@
1
- import type { LanguagePlugin, SourceFile } from '@volar/language-core';
1
+ import type { LanguagePlugin, SourceScript } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function createResolveModuleName(ts: typeof import('typescript'), languageServiceHost: ts.LanguageServiceHost, languagePlugins: LanguagePlugin<any>[], getFile: (fileName: string) => SourceFile | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
3
+ export declare function createResolveModuleName(ts: typeof import('typescript'), languageServiceHost: ts.LanguageServiceHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createResolveModuleName = void 0;
4
- function createResolveModuleName(ts, languageServiceHost, languagePlugins, getFile) {
4
+ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSourceScript) {
5
5
  const toPatchResults = new Map();
6
6
  const moduleResolutionHost = {
7
7
  readFile: languageServiceHost.readFile.bind(languageServiceHost),
@@ -32,11 +32,11 @@ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getFi
32
32
  const result = ts.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost, cache, redirectedReference, resolutionMode);
33
33
  if (result.resolvedModule && toPatchResults.has(result.resolvedModule.resolvedFileName)) {
34
34
  result.resolvedModule.resolvedFileName = toPatchResults.get(result.resolvedModule.resolvedFileName);
35
- const sourceFile = getFile(result.resolvedModule.resolvedFileName);
36
- if (sourceFile?.generated) {
37
- const tsCode = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
38
- if (tsCode) {
39
- result.resolvedModule.extension = tsCode.extension;
35
+ const sourceScript = getSourceScript(result.resolvedModule.resolvedFileName);
36
+ if (sourceScript?.generated) {
37
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
38
+ if (serviceScript) {
39
+ result.resolvedModule.extension = serviceScript.extension;
40
40
  }
41
41
  }
42
42
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.1.5",
3
+ "version": "2.2.0-alpha.0",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,13 +12,13 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.1.5",
15
+ "@volar/language-core": "2.2.0-alpha.0",
16
16
  "path-browserify": "^1.0.1"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/node": "latest",
20
20
  "@types/path-browserify": "latest",
21
- "@volar/language-service": "2.1.5"
21
+ "@volar/language-service": "2.2.0-alpha.0"
22
22
  },
23
- "gitHead": "1b7f456660134891d91608f36cfc6dd2eaea6f70"
23
+ "gitHead": "95ffe51f944ee87f570be113541e17ddfe75f588"
24
24
  }
@@ -1,2 +0,0 @@
1
- import type * as ts from 'typescript';
2
- export declare function getDocumentRegistry(ts: typeof import('typescript'), useCaseSensitiveFileNames: boolean, currentDirectory: string): ts.DocumentRegistry;
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDocumentRegistry = void 0;
4
- const documentRegistries = [];
5
- function getDocumentRegistry(ts, useCaseSensitiveFileNames, currentDirectory) {
6
- let documentRegistry = documentRegistries.find(item => item[0] === useCaseSensitiveFileNames && item[1] === currentDirectory)?.[2];
7
- if (!documentRegistry) {
8
- documentRegistry = ts.createDocumentRegistry(useCaseSensitiveFileNames, currentDirectory);
9
- documentRegistries.push([useCaseSensitiveFileNames, currentDirectory, documentRegistry]);
10
- }
11
- return documentRegistry;
12
- }
13
- exports.getDocumentRegistry = getDocumentRegistry;
14
- //# sourceMappingURL=documentRegistry.js.map