@volar/typescript 2.4.0-alpha.0 → 2.4.0-alpha.10

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,5 +1,5 @@
1
1
  export * from './lib/common';
2
- export * from './lib/node/decorateLanguageService';
2
+ export * from './lib/node/proxyLanguageService';
3
3
  export * from './lib/node/decorateLanguageServiceHost';
4
4
  export * from './lib/node/decorateProgram';
5
5
  export * from './lib/node/proxyCreateProgram';
@@ -7,8 +7,9 @@ export * from './lib/protocol/createProject';
7
7
  export * from './lib/protocol/createSys';
8
8
  import type { VirtualCode } from '@volar/language-core';
9
9
  import type * as ts from 'typescript';
10
- declare module '@volar/language-core' {
11
- interface Language<T> {
10
+ import { URI } from 'vscode-uri';
11
+ declare module '@volar/language-service' {
12
+ interface ProjectContext {
12
13
  typescript?: {
13
14
  configFileName: string | undefined;
14
15
  sys: ts.System & {
@@ -17,27 +18,29 @@ declare module '@volar/language-core' {
17
18
  };
18
19
  languageServiceHost: ts.LanguageServiceHost;
19
20
  getExtraServiceScript(fileName: string): TypeScriptExtraServiceScript | undefined;
20
- asScriptId(fileName: string): T;
21
- asFileName(scriptId: T): string;
21
+ asUri(fileName: string): URI;
22
+ asFileName(uri: URI): string;
22
23
  };
23
24
  }
24
- interface LanguagePlugin<T = unknown, K extends VirtualCode = VirtualCode> {
25
- typescript?: TypeScriptGenericOptions<K> & TypeScriptNonTSPluginOptions<K>;
25
+ }
26
+ declare module '@volar/language-core' {
27
+ interface LanguagePlugin {
28
+ typescript?: TypeScriptGenericOptions & TypeScriptNonTSPluginOptions;
26
29
  }
27
30
  }
28
31
  /**
29
32
  * The following options available to all situations.
30
33
  */
31
- interface TypeScriptGenericOptions<K> {
34
+ interface TypeScriptGenericOptions {
32
35
  extraFileExtensions: ts.FileExtensionInfo[];
33
36
  resolveHiddenExtensions?: boolean;
34
- getServiceScript(root: K): TypeScriptServiceScript | undefined;
37
+ getServiceScript(root: VirtualCode): TypeScriptServiceScript | undefined;
35
38
  }
36
39
  /**
37
40
  * The following options will not be available in TS plugin.
38
41
  */
39
- interface TypeScriptNonTSPluginOptions<K> {
40
- getExtraServiceScripts?(fileName: string, rootVirtualCode: K): TypeScriptExtraServiceScript[];
42
+ interface TypeScriptNonTSPluginOptions {
43
+ getExtraServiceScripts?(fileName: string, root: VirtualCode): TypeScriptExtraServiceScript[];
41
44
  resolveLanguageServiceHost?(host: ts.LanguageServiceHost): ts.LanguageServiceHost;
42
45
  }
43
46
  export interface TypeScriptServiceScript {
package/index.js CHANGED
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./lib/common"), exports);
18
- __exportStar(require("./lib/node/decorateLanguageService"), exports);
18
+ __exportStar(require("./lib/node/proxyLanguageService"), exports);
19
19
  __exportStar(require("./lib/node/decorateLanguageServiceHost"), exports);
20
20
  __exportStar(require("./lib/node/decorateProgram"), exports);
21
21
  __exportStar(require("./lib/node/proxyCreateProgram"), exports);
@@ -28,7 +28,7 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost) {
28
28
  };
29
29
  }
30
30
  if (pluginExtensions.length) {
31
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(fileName));
31
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, ts.sys.getFileSize, languageServiceHost, language.plugins, fileName => language.scripts.get(fileName));
32
32
  const getCanonicalFileName = languageServiceHost.useCaseSensitiveFileNames?.()
33
33
  ? (fileName) => fileName
34
34
  : (fileName) => fileName.toLowerCase();
@@ -144,7 +144,7 @@ function proxyCreateProgram(ts, original, create) {
144
144
  };
145
145
  if (extensions.length) {
146
146
  options.options.allowArbitraryExtensions = true;
147
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, originalHost, language.plugins, fileName => language.scripts.get(fileName));
147
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, ts.sys.getFileSize, originalHost, language.plugins, fileName => language.scripts.get(fileName));
148
148
  const resolveModuleNameLiterals = originalHost.resolveModuleNameLiterals;
149
149
  const resolveModuleNames = originalHost.resolveModuleNames;
150
150
  options.host.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, compilerOptions, ...rest) => {
@@ -0,0 +1,6 @@
1
+ import { Language } from '@volar/language-core';
2
+ import type * as ts from 'typescript';
3
+ export declare function createProxyLanguageService(languageService: ts.LanguageService): {
4
+ initialize(language: Language<string>): void;
5
+ proxy: ts.LanguageService;
6
+ };
@@ -1,15 +1,76 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decorateLanguageService = decorateLanguageService;
3
+ exports.createProxyLanguageService = createProxyLanguageService;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const dedupe_1 = require("./dedupe");
6
6
  const transform_1 = require("./transform");
7
7
  const utils_1 = require("./utils");
8
8
  const windowsPathReg = /\\/g;
9
- function decorateLanguageService(language, languageService) {
10
- // ignored methods
11
- const { getNavigationTree, getOutliningSpans, } = languageService;
12
- languageService.getNavigationTree = filePath => {
9
+ function createProxyLanguageService(languageService) {
10
+ const proxyCache = new Map();
11
+ let getProxyMethod;
12
+ return {
13
+ initialize(language) {
14
+ getProxyMethod = (target, p) => {
15
+ switch (p) {
16
+ case 'getNavigationTree': return getNavigationTree(language, target[p]);
17
+ case 'getOutliningSpans': return getOutliningSpans(language, target[p]);
18
+ case 'getFormattingEditsForDocument': return getFormattingEditsForDocument(language, target[p]);
19
+ case 'getFormattingEditsForRange': return getFormattingEditsForRange(language, target[p]);
20
+ case 'getFormattingEditsAfterKeystroke': return getFormattingEditsAfterKeystroke(language, target[p]);
21
+ case 'getEditsForFileRename': return getEditsForFileRename(language, target[p]);
22
+ case 'getLinkedEditingRangeAtPosition': return getLinkedEditingRangeAtPosition(language, target[p]);
23
+ case 'prepareCallHierarchy': return prepareCallHierarchy(language, target[p]);
24
+ case 'provideCallHierarchyIncomingCalls': return provideCallHierarchyIncomingCalls(language, target[p]);
25
+ case 'provideCallHierarchyOutgoingCalls': return provideCallHierarchyOutgoingCalls(language, target[p]);
26
+ case 'organizeImports': return organizeImports(language, target[p]);
27
+ case 'getQuickInfoAtPosition': return getQuickInfoAtPosition(language, target[p]);
28
+ case 'getSignatureHelpItems': return getSignatureHelpItems(language, target[p]);
29
+ case 'getDocumentHighlights': return getDocumentHighlights(language, target[p]);
30
+ case 'getApplicableRefactors': return getApplicableRefactors(language, target[p]);
31
+ case 'getEditsForRefactor': return getEditsForRefactor(language, target[p]);
32
+ case 'getRenameInfo': return getRenameInfo(language, target[p]);
33
+ case 'getCodeFixesAtPosition': return getCodeFixesAtPosition(language, target[p]);
34
+ case 'getEncodedSemanticClassifications': return getEncodedSemanticClassifications(language, target[p]);
35
+ case 'getSyntacticDiagnostics': return getSyntacticDiagnostics(language, languageService, target[p]);
36
+ case 'getSemanticDiagnostics': return getSemanticDiagnostics(language, languageService, target[p]);
37
+ case 'getSuggestionDiagnostics': return getSuggestionDiagnostics(language, languageService, target[p]);
38
+ case 'getDefinitionAndBoundSpan': return getDefinitionAndBoundSpan(language, target[p]);
39
+ case 'findReferences': return findReferences(language, target[p]);
40
+ case 'getDefinitionAtPosition': return getDefinitionAtPosition(language, target[p]);
41
+ case 'getTypeDefinitionAtPosition': return getTypeDefinitionAtPosition(language, target[p]);
42
+ case 'getImplementationAtPosition': return getImplementationAtPosition(language, target[p]);
43
+ case 'findRenameLocations': return findRenameLocations(language, target[p]);
44
+ case 'getReferencesAtPosition': return getReferencesAtPosition(language, target[p]);
45
+ case 'getCompletionsAtPosition': return getCompletionsAtPosition(language, target[p]);
46
+ case 'getCompletionEntryDetails': return getCompletionEntryDetails(language, target[p]);
47
+ case 'provideInlayHints': return provideInlayHints(language, target[p]);
48
+ case 'getFileReferences': return getFileReferences(language, target[p]);
49
+ }
50
+ };
51
+ },
52
+ proxy: new Proxy(languageService, {
53
+ get(target, p, receiver) {
54
+ if (getProxyMethod) {
55
+ if (!proxyCache.has(p)) {
56
+ proxyCache.set(p, getProxyMethod(target, p));
57
+ }
58
+ const proxyMethod = proxyCache.get(p);
59
+ if (proxyMethod) {
60
+ return proxyMethod;
61
+ }
62
+ }
63
+ return Reflect.get(target, p, receiver);
64
+ },
65
+ set(target, p, value, receiver) {
66
+ return Reflect.set(target, p, value, receiver);
67
+ },
68
+ }),
69
+ };
70
+ }
71
+ // ignored methods
72
+ function getNavigationTree(language, getNavigationTree) {
73
+ return filePath => {
13
74
  const fileName = filePath.replace(windowsPathReg, '/');
14
75
  const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
15
76
  if (serviceScript || targetScript?.associatedOnly) {
@@ -21,7 +82,9 @@ function decorateLanguageService(language, languageService) {
21
82
  return getNavigationTree(fileName);
22
83
  }
23
84
  };
24
- languageService.getOutliningSpans = filePath => {
85
+ }
86
+ function getOutliningSpans(language, getOutliningSpans) {
87
+ return filePath => {
25
88
  const fileName = filePath.replace(windowsPathReg, '/');
26
89
  const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
27
90
  if (serviceScript || targetScript?.associatedOnly) {
@@ -31,9 +94,10 @@ function decorateLanguageService(language, languageService) {
31
94
  return getOutliningSpans(fileName);
32
95
  }
33
96
  };
34
- // methods
35
- const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getSignatureHelpItems, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
36
- languageService.getFormattingEditsForDocument = (filePath, options) => {
97
+ }
98
+ // proxy methods
99
+ function getFormattingEditsForDocument(language, getFormattingEditsForDocument) {
100
+ return (filePath, options) => {
37
101
  const fileName = filePath.replace(windowsPathReg, '/');
38
102
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
39
103
  if (targetScript?.associatedOnly) {
@@ -53,7 +117,9 @@ function decorateLanguageService(language, languageService) {
53
117
  return getFormattingEditsForDocument(fileName, options);
54
118
  }
55
119
  };
56
- languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
120
+ }
121
+ function getFormattingEditsForRange(language, getFormattingEditsForRange) {
122
+ return (filePath, start, end, options) => {
57
123
  const fileName = filePath.replace(windowsPathReg, '/');
58
124
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
59
125
  if (targetScript?.associatedOnly) {
@@ -74,7 +140,9 @@ function decorateLanguageService(language, languageService) {
74
140
  return getFormattingEditsForRange(fileName, start, end, options);
75
141
  }
76
142
  };
77
- languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
143
+ }
144
+ function getFormattingEditsAfterKeystroke(language, getFormattingEditsAfterKeystroke) {
145
+ return (filePath, position, key, options) => {
78
146
  const fileName = filePath.replace(windowsPathReg, '/');
79
147
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
80
148
  if (targetScript?.associatedOnly) {
@@ -94,11 +162,15 @@ function decorateLanguageService(language, languageService) {
94
162
  return getFormattingEditsAfterKeystroke(fileName, position, key, options);
95
163
  }
96
164
  };
97
- languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
165
+ }
166
+ function getEditsForFileRename(language, getEditsForFileRename) {
167
+ return (oldFilePath, newFilePath, formatOptions, preferences) => {
98
168
  const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
99
169
  return (0, transform_1.transformFileTextChanges)(language, edits, language_core_1.isRenameEnabled);
100
170
  };
101
- languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
171
+ }
172
+ function getLinkedEditingRangeAtPosition(language, getLinkedEditingRangeAtPosition) {
173
+ return (filePath, position) => {
102
174
  const fileName = filePath.replace(windowsPathReg, '/');
103
175
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
104
176
  if (targetScript?.associatedOnly) {
@@ -122,7 +194,9 @@ function decorateLanguageService(language, languageService) {
122
194
  return getLinkedEditingRangeAtPosition(fileName, position);
123
195
  }
124
196
  };
125
- languageService.prepareCallHierarchy = (filePath, position) => {
197
+ }
198
+ function prepareCallHierarchy(language, prepareCallHierarchy) {
199
+ return (filePath, position) => {
126
200
  const fileName = filePath.replace(windowsPathReg, '/');
127
201
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
128
202
  if (targetScript?.associatedOnly) {
@@ -144,7 +218,9 @@ function decorateLanguageService(language, languageService) {
144
218
  return prepareCallHierarchy(fileName, position);
145
219
  }
146
220
  };
147
- languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
221
+ }
222
+ function provideCallHierarchyIncomingCalls(language, provideCallHierarchyIncomingCalls) {
223
+ return (filePath, position) => {
148
224
  let calls = [];
149
225
  const fileName = filePath.replace(windowsPathReg, '/');
150
226
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
@@ -172,7 +248,9 @@ function decorateLanguageService(language, languageService) {
172
248
  };
173
249
  });
174
250
  };
175
- languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
251
+ }
252
+ function provideCallHierarchyOutgoingCalls(language, provideCallHierarchyOutgoingCalls) {
253
+ return (filePath, position) => {
176
254
  let calls = [];
177
255
  const fileName = filePath.replace(windowsPathReg, '/');
178
256
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
@@ -202,11 +280,15 @@ function decorateLanguageService(language, languageService) {
202
280
  };
203
281
  });
204
282
  };
205
- languageService.organizeImports = (args, formatOptions, preferences) => {
283
+ }
284
+ function organizeImports(language, organizeImports) {
285
+ return (args, formatOptions, preferences) => {
206
286
  const unresolved = organizeImports(args, formatOptions, preferences);
207
287
  return (0, transform_1.transformFileTextChanges)(language, unresolved, language_core_1.isCodeActionsEnabled);
208
288
  };
209
- languageService.getQuickInfoAtPosition = (filePath, position) => {
289
+ }
290
+ function getQuickInfoAtPosition(language, getQuickInfoAtPosition) {
291
+ return (filePath, position) => {
210
292
  const fileName = filePath.replace(windowsPathReg, '/');
211
293
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
212
294
  if (targetScript?.associatedOnly) {
@@ -269,7 +351,9 @@ function decorateLanguageService(language, languageService) {
269
351
  return getQuickInfoAtPosition(fileName, position);
270
352
  }
271
353
  };
272
- languageService.getSignatureHelpItems = (filePath, position, options) => {
354
+ }
355
+ function getSignatureHelpItems(language, getSignatureHelpItems) {
356
+ return (filePath, position, options) => {
273
357
  const fileName = filePath.replace(windowsPathReg, '/');
274
358
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
275
359
  if (targetScript?.associatedOnly) {
@@ -294,9 +378,11 @@ function decorateLanguageService(language, languageService) {
294
378
  return getSignatureHelpItems(fileName, position, options);
295
379
  }
296
380
  };
297
- languageService.getDocumentHighlights = (filePath, position, filesToSearch) => {
381
+ }
382
+ function getDocumentHighlights(language, getDocumentHighlights) {
383
+ return (filePath, position, filesToSearch) => {
298
384
  const fileName = filePath.replace(windowsPathReg, '/');
299
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
385
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
300
386
  for (const ref of result) {
301
387
  for (const reference of ref.highlightSpans) {
302
388
  yield [reference.fileName ?? ref.fileName, reference.textSpan.start];
@@ -324,7 +410,9 @@ function decorateLanguageService(language, languageService) {
324
410
  });
325
411
  return resolved;
326
412
  };
327
- languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
413
+ }
414
+ function getApplicableRefactors(language, getApplicableRefactors) {
415
+ return (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
328
416
  const fileName = filePath.replace(windowsPathReg, '/');
329
417
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
330
418
  if (targetScript?.associatedOnly) {
@@ -348,7 +436,9 @@ function decorateLanguageService(language, languageService) {
348
436
  return getApplicableRefactors(fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions);
349
437
  }
350
438
  };
351
- languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
439
+ }
440
+ function getEditsForRefactor(language, getEditsForRefactor) {
441
+ return (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
352
442
  let edits;
353
443
  const fileName = filePath.replace(windowsPathReg, '/');
354
444
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
@@ -376,7 +466,9 @@ function decorateLanguageService(language, languageService) {
376
466
  return edits;
377
467
  }
378
468
  };
379
- languageService.getRenameInfo = (filePath, position, options) => {
469
+ }
470
+ function getRenameInfo(language, getRenameInfo) {
471
+ return (filePath, position, options) => {
380
472
  const fileName = filePath.replace(windowsPathReg, '/');
381
473
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
382
474
  if (targetScript?.associatedOnly) {
@@ -412,7 +504,9 @@ function decorateLanguageService(language, languageService) {
412
504
  return getRenameInfo(fileName, position, options);
413
505
  }
414
506
  };
415
- languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
507
+ }
508
+ function getCodeFixesAtPosition(language, getCodeFixesAtPosition) {
509
+ return (filePath, start, end, errorCodes, formatOptions, preferences) => {
416
510
  let fixes = [];
417
511
  const fileName = filePath.replace(windowsPathReg, '/');
418
512
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
@@ -435,7 +529,9 @@ function decorateLanguageService(language, languageService) {
435
529
  });
436
530
  return fixes;
437
531
  };
438
- languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
532
+ }
533
+ function getEncodedSemanticClassifications(language, getEncodedSemanticClassifications) {
534
+ return (filePath, span, format) => {
439
535
  const fileName = filePath.replace(windowsPathReg, '/');
440
536
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
441
537
  if (targetScript?.associatedOnly) {
@@ -477,7 +573,9 @@ function decorateLanguageService(language, languageService) {
477
573
  return getEncodedSemanticClassifications(fileName, span, format);
478
574
  }
479
575
  };
480
- languageService.getSyntacticDiagnostics = filePath => {
576
+ }
577
+ function getSyntacticDiagnostics(language, languageService, getSyntacticDiagnostics) {
578
+ return filePath => {
481
579
  const fileName = filePath.replace(windowsPathReg, '/');
482
580
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
483
581
  if (targetScript?.associatedOnly) {
@@ -488,7 +586,9 @@ function decorateLanguageService(language, languageService) {
488
586
  .filter(d => !!d)
489
587
  .filter(d => !serviceScript || language.scripts.get(d.file.fileName) === sourceScript);
490
588
  };
491
- languageService.getSemanticDiagnostics = filePath => {
589
+ }
590
+ function getSemanticDiagnostics(language, languageService, getSemanticDiagnostics) {
591
+ return filePath => {
492
592
  const fileName = filePath.replace(windowsPathReg, '/');
493
593
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
494
594
  if (targetScript?.associatedOnly) {
@@ -499,7 +599,9 @@ function decorateLanguageService(language, languageService) {
499
599
  .filter(d => !!d)
500
600
  .filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
501
601
  };
502
- languageService.getSuggestionDiagnostics = filePath => {
602
+ }
603
+ function getSuggestionDiagnostics(language, languageService, getSuggestionDiagnostics) {
604
+ return filePath => {
503
605
  const fileName = filePath.replace(windowsPathReg, '/');
504
606
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
505
607
  if (targetScript?.associatedOnly) {
@@ -510,9 +612,11 @@ function decorateLanguageService(language, languageService) {
510
612
  .filter(d => !!d)
511
613
  .filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
512
614
  };
513
- languageService.getDefinitionAndBoundSpan = (filePath, position) => {
615
+ }
616
+ function getDefinitionAndBoundSpan(language, getDefinitionAndBoundSpan) {
617
+ return (filePath, position) => {
514
618
  const fileName = filePath.replace(windowsPathReg, '/');
515
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
619
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
516
620
  for (const ref of result.definitions ?? []) {
517
621
  yield [ref.fileName, ref.textSpan.start];
518
622
  }
@@ -534,9 +638,11 @@ function decorateLanguageService(language, languageService) {
534
638
  definitions: (0, dedupe_1.dedupeDocumentSpans)(definitions),
535
639
  };
536
640
  };
537
- languageService.findReferences = (filePath, position) => {
641
+ }
642
+ function findReferences(language, findReferences) {
643
+ return (filePath, position) => {
538
644
  const fileName = filePath.replace(windowsPathReg, '/');
539
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
645
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
540
646
  for (const ref of result) {
541
647
  for (const reference of ref.references) {
542
648
  yield [reference.fileName, reference.textSpan.start];
@@ -556,9 +662,11 @@ function decorateLanguageService(language, languageService) {
556
662
  });
557
663
  return resolved;
558
664
  };
559
- languageService.getDefinitionAtPosition = (filePath, position) => {
665
+ }
666
+ function getDefinitionAtPosition(language, getDefinitionAtPosition) {
667
+ return (filePath, position) => {
560
668
  const fileName = filePath.replace(windowsPathReg, '/');
561
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
669
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
562
670
  for (const ref of result) {
563
671
  yield [ref.fileName, ref.textSpan.start];
564
672
  }
@@ -569,9 +677,11 @@ function decorateLanguageService(language, languageService) {
569
677
  .filter(s => !!s);
570
678
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
571
679
  };
572
- languageService.getTypeDefinitionAtPosition = (filePath, position) => {
680
+ }
681
+ function getTypeDefinitionAtPosition(language, getTypeDefinitionAtPosition) {
682
+ return (filePath, position) => {
573
683
  const fileName = filePath.replace(windowsPathReg, '/');
574
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
684
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
575
685
  for (const ref of result) {
576
686
  yield [ref.fileName, ref.textSpan.start];
577
687
  }
@@ -582,9 +692,11 @@ function decorateLanguageService(language, languageService) {
582
692
  .filter(s => !!s);
583
693
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
584
694
  };
585
- languageService.getImplementationAtPosition = (filePath, position) => {
695
+ }
696
+ function getImplementationAtPosition(language, getImplementationAtPosition) {
697
+ return (filePath, position) => {
586
698
  const fileName = filePath.replace(windowsPathReg, '/');
587
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
699
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
588
700
  for (const ref of result) {
589
701
  yield [ref.fileName, ref.textSpan.start];
590
702
  }
@@ -595,9 +707,11 @@ function decorateLanguageService(language, languageService) {
595
707
  .filter(s => !!s);
596
708
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
597
709
  };
598
- languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
710
+ }
711
+ function findRenameLocations(language, findRenameLocations) {
712
+ return (filePath, position, findInStrings, findInComments, preferences) => {
599
713
  const fileName = filePath.replace(windowsPathReg, '/');
600
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
714
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
601
715
  for (const ref of result) {
602
716
  yield [ref.fileName, ref.textSpan.start];
603
717
  }
@@ -608,9 +722,11 @@ function decorateLanguageService(language, languageService) {
608
722
  .filter(s => !!s);
609
723
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
610
724
  };
611
- languageService.getReferencesAtPosition = (filePath, position) => {
725
+ }
726
+ function getReferencesAtPosition(language, getReferencesAtPosition) {
727
+ return (filePath, position) => {
612
728
  const fileName = filePath.replace(windowsPathReg, '/');
613
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
729
+ const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
614
730
  for (const ref of result) {
615
731
  yield [ref.fileName, ref.textSpan.start];
616
732
  }
@@ -621,7 +737,9 @@ function decorateLanguageService(language, languageService) {
621
737
  .filter(s => !!s);
622
738
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
623
739
  };
624
- languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
740
+ }
741
+ function getCompletionsAtPosition(language, getCompletionsAtPosition) {
742
+ return (filePath, position, options, formattingSettings) => {
625
743
  const fileName = filePath.replace(windowsPathReg, '/');
626
744
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
627
745
  if (targetScript?.associatedOnly) {
@@ -663,7 +781,9 @@ function decorateLanguageService(language, languageService) {
663
781
  return getCompletionsAtPosition(fileName, position, options, formattingSettings);
664
782
  }
665
783
  };
666
- languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
784
+ }
785
+ function getCompletionEntryDetails(language, getCompletionEntryDetails) {
786
+ return (filePath, position, entryName, formatOptions, source, preferences, data) => {
667
787
  let details;
668
788
  const fileName = filePath.replace(windowsPathReg, '/');
669
789
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
@@ -686,7 +806,9 @@ function decorateLanguageService(language, languageService) {
686
806
  }
687
807
  return details;
688
808
  };
689
- languageService.provideInlayHints = (filePath, span, preferences) => {
809
+ }
810
+ function provideInlayHints(language, provideInlayHints) {
811
+ return (filePath, span, preferences) => {
690
812
  const fileName = filePath.replace(windowsPathReg, '/');
691
813
  const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
692
814
  if (targetScript?.associatedOnly) {
@@ -728,7 +850,9 @@ function decorateLanguageService(language, languageService) {
728
850
  return provideInlayHints(fileName, span, preferences);
729
851
  }
730
852
  };
731
- languageService.getFileReferences = filePath => {
853
+ }
854
+ function getFileReferences(language, getFileReferences) {
855
+ return filePath => {
732
856
  const fileName = filePath.replace(windowsPathReg, '/');
733
857
  const unresolved = getFileReferences(fileName);
734
858
  const resolved = unresolved
@@ -736,43 +860,43 @@ function decorateLanguageService(language, languageService) {
736
860
  .filter(s => !!s);
737
861
  return (0, dedupe_1.dedupeDocumentSpans)(resolved);
738
862
  };
739
- function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
740
- const results = [];
741
- const processedFilePositions = new Set();
742
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
743
- if (serviceScript) {
744
- for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
745
- process(targetScript.id, generatedOffset);
746
- }
863
+ }
864
+ function linkedCodeFeatureWorker(language, fileName, position, filter, worker, getLinkedCodes) {
865
+ const results = [];
866
+ const processedFilePositions = new Set();
867
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
868
+ if (serviceScript) {
869
+ for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
870
+ process(targetScript.id, generatedOffset);
747
871
  }
748
- else {
749
- process(fileName, position);
750
- }
751
- return results;
752
- function process(fileName, position) {
753
- if (processedFilePositions.has(fileName + ':' + position)) {
754
- return;
755
- }
756
- processedFilePositions.add(fileName + ':' + position);
757
- const result = worker(fileName, position);
758
- if (!result) {
759
- return;
760
- }
761
- results.push(result);
762
- for (const ref of getLinkedCodes(result)) {
763
- processedFilePositions.add(ref[0] + ':' + ref[1]);
764
- const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
765
- if (!serviceScript) {
766
- continue;
767
- }
768
- const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
769
- if (!linkedCodeMap) {
770
- continue;
771
- }
772
- const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
773
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
774
- process(ref[0], linkedCodeOffset + mappingOffset);
775
- }
872
+ }
873
+ else {
874
+ process(fileName, position);
875
+ }
876
+ return results;
877
+ function process(fileName, position) {
878
+ if (processedFilePositions.has(fileName + ':' + position)) {
879
+ return;
880
+ }
881
+ processedFilePositions.add(fileName + ':' + position);
882
+ const result = worker(fileName, position);
883
+ if (!result) {
884
+ return;
885
+ }
886
+ results.push(result);
887
+ for (const ref of getLinkedCodes(result)) {
888
+ processedFilePositions.add(ref[0] + ':' + ref[1]);
889
+ const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
890
+ if (!serviceScript) {
891
+ continue;
892
+ }
893
+ const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
894
+ if (!linkedCodeMap) {
895
+ continue;
896
+ }
897
+ const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
898
+ for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
899
+ process(ref[0], linkedCodeOffset + mappingOffset);
776
900
  }
777
901
  }
778
902
  }
@@ -783,4 +907,4 @@ function displayPartsToString(displayParts) {
783
907
  }
784
908
  return '';
785
909
  }
786
- //# sourceMappingURL=decorateLanguageService.js.map
910
+ //# sourceMappingURL=proxyLanguageService.js.map
@@ -4,7 +4,7 @@ import type { TypeScriptExtraServiceScript } from '../..';
4
4
  import type { createSys } from './createSys';
5
5
  export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'getLocalizedDiagnosticMessages' | 'getCurrentDirectory' | 'getCompilationSettings' | 'getProjectReferences' | 'getScriptFileNames' | 'getProjectVersion' | 'getScriptSnapshot'> {
6
6
  }
7
- export declare function createLanguageServiceHost<T>(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, language: Language<T>, asScrpitId: (fileName: string) => T, projectHost: TypeScriptProjectHost): {
7
+ export declare function createLanguageServiceHost<T>(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, language: Language<T>, asScriptId: (fileName: string) => T, projectHost: TypeScriptProjectHost): {
8
8
  languageServiceHost: ts.LanguageServiceHost;
9
9
  getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript | undefined;
10
10
  };
@@ -4,11 +4,12 @@ exports.createLanguageServiceHost = createLanguageServiceHost;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const path = require("path-browserify");
6
6
  const resolveModuleName_1 = require("../resolveModuleName");
7
- function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
7
+ function createLanguageServiceHost(ts, sys, language, asScriptId, projectHost) {
8
8
  const scriptVersions = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
9
9
  let lastProjectVersion;
10
10
  let tsProjectVersion = 0;
11
11
  let tsFileRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
12
+ let tsFileDirRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
12
13
  let extraScriptRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
13
14
  let lastTsVirtualFileSnapshots = new Set();
14
15
  let lastOtherVirtualFileSnapshots = new Set();
@@ -66,6 +67,13 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
66
67
  return snapshot.getText(0, snapshot.getLength());
67
68
  }
68
69
  },
70
+ directoryExists(directoryName) {
71
+ sync();
72
+ if (tsFileDirRegistry.has(directoryName)) {
73
+ return true;
74
+ }
75
+ return sys.directoryExists(directoryName);
76
+ },
69
77
  fileExists(fileName) {
70
78
  return getScriptVersion(fileName) !== '';
71
79
  },
@@ -82,7 +90,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
82
90
  if (extraScriptRegistry.has(fileName)) {
83
91
  return extraScriptRegistry.get(fileName).scriptKind;
84
92
  }
85
- const sourceScript = language.scripts.get(asScrpitId(fileName));
93
+ const sourceScript = language.scripts.get(asScriptId(fileName));
86
94
  if (sourceScript?.generated) {
87
95
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
88
96
  if (serviceScript) {
@@ -116,10 +124,10 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
116
124
  languageServiceHost = plugin.typescript.resolveLanguageServiceHost(languageServiceHost);
117
125
  }
118
126
  }
119
- if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
127
+ if (language.plugins.some(plugin => plugin.typescript?.extraFileExtensions.length)) {
120
128
  // TODO: can this share between monorepo packages?
121
129
  const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames?.() ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
122
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(asScrpitId(fileName)));
130
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, sys.getFileSize, languageServiceHost, language.plugins, fileName => language.scripts.get(asScriptId(fileName)));
123
131
  let lastSysVersion = 'version' in sys ? sys.version : undefined;
124
132
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
125
133
  if ('version' in sys && lastSysVersion !== sys.version) {
@@ -160,7 +168,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
160
168
  const newOtherVirtualFileSnapshots = new Set();
161
169
  const tsFileNamesSet = new Set();
162
170
  for (const fileName of projectHost.getScriptFileNames()) {
163
- const sourceScript = language.scripts.get(asScrpitId(fileName));
171
+ const sourceScript = language.scripts.get(asScriptId(fileName));
164
172
  if (sourceScript?.generated) {
165
173
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
166
174
  if (serviceScript) {
@@ -190,8 +198,14 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
190
198
  lastTsVirtualFileSnapshots = newTsVirtualFileSnapshots;
191
199
  lastOtherVirtualFileSnapshots = newOtherVirtualFileSnapshots;
192
200
  tsFileRegistry.clear();
201
+ tsFileDirRegistry.clear();
193
202
  for (const fileName of tsFileNamesSet) {
194
203
  tsFileRegistry.set(fileName, true);
204
+ const parts = fileName.split('/');
205
+ for (let i = 1; i < parts.length; i++) {
206
+ const dirName = parts.slice(0, i).join('/');
207
+ tsFileDirRegistry.set(dirName, true);
208
+ }
195
209
  }
196
210
  }
197
211
  function getScriptSnapshot(fileName) {
@@ -199,7 +213,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
199
213
  if (extraScriptRegistry.has(fileName)) {
200
214
  return extraScriptRegistry.get(fileName).code.snapshot;
201
215
  }
202
- const sourceScript = language.scripts.get(asScrpitId(fileName));
216
+ const sourceScript = language.scripts.get(asScriptId(fileName));
203
217
  if (sourceScript?.generated) {
204
218
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
205
219
  if (serviceScript) {
@@ -223,7 +237,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
223
237
  }
224
238
  return version.map.get(snapshot).toString();
225
239
  }
226
- const sourceScript = language.scripts.get(asScrpitId(fileName));
240
+ const sourceScript = language.scripts.get(asScriptId(fileName));
227
241
  if (sourceScript?.generated) {
228
242
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
229
243
  if (serviceScript) {
@@ -235,7 +249,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
235
249
  }
236
250
  const isOpenedFile = !!projectHost.getScriptSnapshot(fileName);
237
251
  if (isOpenedFile) {
238
- const sourceScript = language.scripts.get(asScrpitId(fileName));
252
+ const sourceScript = language.scripts.get(asScriptId(fileName));
239
253
  if (sourceScript && !sourceScript.generated) {
240
254
  if (!version.map.has(sourceScript.snapshot)) {
241
255
  version.map.set(sourceScript.snapshot, version.lastVersion++);
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAsyncLanguageServicePlugin = createAsyncLanguageServicePlugin;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const common_1 = require("../common");
6
- const decorateLanguageService_1 = require("../node/decorateLanguageService");
6
+ const proxyLanguageService_1 = require("../node/proxyLanguageService");
7
7
  const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
8
8
  const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
9
9
  function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
@@ -49,6 +49,8 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
49
49
  return getProjectVersion();
50
50
  };
51
51
  }
52
+ const { proxy, initialize } = (0, proxyLanguageService_1.createProxyLanguageService)(info.languageService);
53
+ info.languageService = proxy;
52
54
  create(ts, info).then(({ languagePlugins, setup }) => {
53
55
  const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
54
56
  const language = (0, language_core_1.createLanguage)([
@@ -68,7 +70,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
68
70
  language.scripts.delete(fileName);
69
71
  }
70
72
  });
71
- (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
73
+ initialize(language);
72
74
  (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
73
75
  setup?.(language);
74
76
  if ('markAsDirty' in info.project && typeof info.project.markAsDirty === 'function') {
@@ -5,7 +5,7 @@ exports.createLanguageServicePlugin = createLanguageServicePlugin;
5
5
  exports.arrayItemsEqual = arrayItemsEqual;
6
6
  const language_core_1 = require("@volar/language-core");
7
7
  const common_1 = require("../common");
8
- const decorateLanguageService_1 = require("../node/decorateLanguageService");
8
+ const proxyLanguageService_1 = require("../node/proxyLanguageService");
9
9
  const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
10
10
  exports.externalFiles = new WeakMap();
11
11
  exports.projectExternalFileExtensions = new WeakMap();
@@ -45,7 +45,9 @@ function createLanguageServicePlugin(create) {
45
45
  language.scripts.delete(fileName);
46
46
  }
47
47
  });
48
- (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
48
+ const { proxy, initialize } = (0, proxyLanguageService_1.createProxyLanguageService)(info.languageService);
49
+ info.languageService = proxy;
50
+ initialize(language);
49
51
  (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
50
52
  setup?.(language);
51
53
  }
@@ -1,7 +1,7 @@
1
1
  import type * as ts from 'typescript';
2
2
  import type { Language, LanguagePlugin } from '@volar/language-core';
3
3
  export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin<string>[] | {
4
- plugins: LanguagePlugin<string>[];
4
+ languagePlugins: LanguagePlugin<string>[];
5
5
  setup?(language: Language<string>): void;
6
6
  };
7
7
  export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins): void;
@@ -1,3 +1,3 @@
1
1
  import type { LanguagePlugin, SourceScript } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function createResolveModuleName<T>(ts: typeof import('typescript'), host: ts.ModuleResolutionHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript<T> | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
3
+ export declare function createResolveModuleName<T>(ts: typeof import('typescript'), getFileSize: ((fileName: string) => number) | undefined, host: ts.ModuleResolutionHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript<T> | 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 = createResolveModuleName;
4
- function createResolveModuleName(ts, host, languagePlugins, getSourceScript) {
4
+ function createResolveModuleName(ts, getFileSize, host, languagePlugins, getSourceScript) {
5
5
  const toSourceFileInfo = new Map();
6
6
  const moduleResolutionHost = {
7
7
  readFile: host.readFile.bind(host),
@@ -81,7 +81,7 @@ function createResolveModuleName(ts, host, languagePlugins, getSourceScript) {
81
81
  // fix https://github.com/vuejs/language-tools/issues/3332
82
82
  function fileExists(fileName) {
83
83
  if (host.fileExists(fileName)) {
84
- const fileSize = ts.sys.getFileSize?.(fileName) ?? host.readFile(fileName)?.length ?? 0;
84
+ const fileSize = getFileSize?.(fileName) ?? host.readFile(fileName)?.length ?? 0;
85
85
  return fileSize < 4 * 1024 * 1024;
86
86
  }
87
87
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.4.0-alpha.0",
3
+ "version": "2.4.0-alpha.10",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,14 +12,14 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.4.0-alpha.0",
15
+ "@volar/language-core": "2.4.0-alpha.10",
16
16
  "path-browserify": "^1.0.1",
17
17
  "vscode-uri": "^3.0.8"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "latest",
21
21
  "@types/path-browserify": "latest",
22
- "@volar/language-service": "2.4.0-alpha.0"
22
+ "@volar/language-service": "2.4.0-alpha.10"
23
23
  },
24
- "gitHead": "007fc74c461e2fd3fb269bf4f3924cc23c35ba56"
24
+ "gitHead": "9f0cb9f2e41167baeb503e8f0eca88e9bea06269"
25
25
  }
@@ -1,3 +0,0 @@
1
- import { Language } from '@volar/language-core';
2
- import type * as ts from 'typescript';
3
- export declare function decorateLanguageService(language: Language<string>, languageService: ts.LanguageService): void;