@volar/typescript 2.3.0-alpha.12 → 2.3.0-alpha.13

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.
@@ -60,8 +60,8 @@ function decorateLanguageService(language, languageService) {
60
60
  return [];
61
61
  }
62
62
  if (serviceScript) {
63
- const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, start, language_core_1.isFormattingEnabled);
64
- const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, end, language_core_1.isFormattingEnabled);
63
+ const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
64
+ const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
65
65
  if (generateStart !== undefined && generateEnd !== undefined) {
66
66
  const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
67
67
  return edits
@@ -81,7 +81,7 @@ function decorateLanguageService(language, languageService) {
81
81
  return [];
82
82
  }
83
83
  if (serviceScript) {
84
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isFormattingEnabled);
84
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
85
85
  if (generatePosition !== undefined) {
86
86
  const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
87
87
  return edits
@@ -105,7 +105,7 @@ function decorateLanguageService(language, languageService) {
105
105
  return undefined;
106
106
  }
107
107
  if (serviceScript) {
108
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isLinkedEditingEnabled);
108
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
109
109
  if (generatePosition !== undefined) {
110
110
  const info = getLinkedEditingRangeAtPosition(targetScript.id, generatePosition);
111
111
  if (info) {
@@ -124,12 +124,12 @@ function decorateLanguageService(language, languageService) {
124
124
  };
125
125
  languageService.prepareCallHierarchy = (filePath, position) => {
126
126
  const fileName = filePath.replace(windowsPathReg, '/');
127
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
127
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
128
128
  if (targetScript?.associatedOnly) {
129
129
  return undefined;
130
130
  }
131
131
  if (serviceScript) {
132
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCallHierarchyEnabled);
132
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
133
133
  if (generatePosition !== undefined) {
134
134
  const item = prepareCallHierarchy(targetScript.id, generatePosition);
135
135
  if (Array.isArray(item)) {
@@ -147,12 +147,12 @@ function decorateLanguageService(language, languageService) {
147
147
  languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
148
148
  let calls = [];
149
149
  const fileName = filePath.replace(windowsPathReg, '/');
150
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
150
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
151
151
  if (targetScript?.associatedOnly) {
152
152
  return [];
153
153
  }
154
154
  if (serviceScript) {
155
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCallHierarchyEnabled);
155
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
156
156
  if (generatePosition !== undefined) {
157
157
  calls = provideCallHierarchyIncomingCalls(targetScript.id, generatePosition);
158
158
  }
@@ -180,9 +180,9 @@ function decorateLanguageService(language, languageService) {
180
180
  return [];
181
181
  }
182
182
  if (serviceScript) {
183
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCallHierarchyEnabled);
183
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
184
184
  if (generatePosition !== undefined) {
185
- calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
185
+ calls = provideCallHierarchyOutgoingCalls(targetScript.id, generatePosition);
186
186
  }
187
187
  }
188
188
  else {
@@ -214,7 +214,7 @@ function decorateLanguageService(language, languageService) {
214
214
  }
215
215
  if (serviceScript) {
216
216
  const infos = [];
217
- for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isHoverEnabled)) {
217
+ for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
218
218
  const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
219
219
  if (info) {
220
220
  const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
@@ -276,7 +276,7 @@ function decorateLanguageService(language, languageService) {
276
276
  return undefined;
277
277
  }
278
278
  if (serviceScript) {
279
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isSignatureHelpEnabled);
279
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
280
280
  if (generatePosition !== undefined) {
281
281
  const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
282
282
  if (result) {
@@ -326,12 +326,12 @@ function decorateLanguageService(language, languageService) {
326
326
  };
327
327
  languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
328
328
  const fileName = filePath.replace(windowsPathReg, '/');
329
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
329
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
330
330
  if (targetScript?.associatedOnly) {
331
331
  return [];
332
332
  }
333
333
  if (serviceScript) {
334
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
334
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
335
335
  if (generatePosition !== undefined) {
336
336
  const por = typeof positionOrRange === 'number'
337
337
  ? generatePosition
@@ -350,12 +350,12 @@ function decorateLanguageService(language, languageService) {
350
350
  languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
351
351
  let edits;
352
352
  const fileName = filePath.replace(windowsPathReg, '/');
353
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
353
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
354
354
  if (targetScript?.associatedOnly) {
355
355
  return undefined;
356
356
  }
357
357
  if (serviceScript) {
358
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, typeof positionOrRange === 'number'
358
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number'
359
359
  ? positionOrRange
360
360
  : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
361
361
  if (generatePosition !== undefined) {
@@ -387,7 +387,7 @@ function decorateLanguageService(language, languageService) {
387
387
  }
388
388
  if (serviceScript) {
389
389
  let failed;
390
- for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isRenameEnabled)) {
390
+ for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
391
391
  const info = getRenameInfo(targetScript.id, generateOffset, options);
392
392
  if (info.canRename) {
393
393
  const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
@@ -415,13 +415,13 @@ function decorateLanguageService(language, languageService) {
415
415
  languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
416
416
  let fixes = [];
417
417
  const fileName = filePath.replace(windowsPathReg, '/');
418
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
418
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
419
419
  if (targetScript?.associatedOnly) {
420
420
  return [];
421
421
  }
422
422
  if (serviceScript) {
423
- const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, start, language_core_1.isCodeActionsEnabled);
424
- const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, end, language_core_1.isCodeActionsEnabled);
423
+ const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
424
+ const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
425
425
  if (generateStart !== undefined && generateEnd !== undefined) {
426
426
  fixes = getCodeFixesAtPosition(targetScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
427
427
  }
@@ -490,9 +490,10 @@ function decorateLanguageService(language, languageService) {
490
490
  if (targetScript?.associatedOnly) {
491
491
  return [];
492
492
  }
493
- return getSyntacticDiagnostics(fileName)
494
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
495
- .filter(utils_1.notEmpty);
493
+ return getSyntacticDiagnostics(targetScript?.id ?? fileName)
494
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
495
+ .filter(utils_1.notEmpty)
496
+ .filter(d => language.scripts.get(d.file.fileName) === sourceScript);
496
497
  };
497
498
  languageService.getSemanticDiagnostics = filePath => {
498
499
  const fileName = filePath.replace(windowsPathReg, '/');
@@ -500,9 +501,10 @@ function decorateLanguageService(language, languageService) {
500
501
  if (targetScript?.associatedOnly) {
501
502
  return [];
502
503
  }
503
- return getSemanticDiagnostics(fileName)
504
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
505
- .filter(utils_1.notEmpty);
504
+ return getSemanticDiagnostics(targetScript?.id ?? fileName)
505
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
506
+ .filter(utils_1.notEmpty)
507
+ .filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
506
508
  };
507
509
  languageService.getSuggestionDiagnostics = filePath => {
508
510
  const fileName = filePath.replace(windowsPathReg, '/');
@@ -510,9 +512,10 @@ function decorateLanguageService(language, languageService) {
510
512
  if (targetScript?.associatedOnly) {
511
513
  return [];
512
514
  }
513
- return getSuggestionDiagnostics(fileName)
514
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
515
- .filter(utils_1.notEmpty);
515
+ return getSuggestionDiagnostics(targetScript?.id ?? fileName)
516
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
517
+ .filter(utils_1.notEmpty)
518
+ .filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
516
519
  };
517
520
  languageService.getDefinitionAndBoundSpan = (filePath, position) => {
518
521
  const fileName = filePath.replace(windowsPathReg, '/');
@@ -633,7 +636,7 @@ function decorateLanguageService(language, languageService) {
633
636
  }
634
637
  if (serviceScript) {
635
638
  const results = [];
636
- for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isCompletionEnabled)) {
639
+ for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
637
640
  const result = getCompletionsAtPosition(targetScript.id, generatedOffset, options, formattingSettings);
638
641
  if (!result) {
639
642
  continue;
@@ -670,12 +673,12 @@ function decorateLanguageService(language, languageService) {
670
673
  languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
671
674
  let details;
672
675
  const fileName = filePath.replace(windowsPathReg, '/');
673
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
676
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
674
677
  if (targetScript?.associatedOnly) {
675
678
  return undefined;
676
679
  }
677
680
  if (serviceScript) {
678
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, targetScript, position, language_core_1.isCompletionEnabled);
681
+ const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
679
682
  if (generatePosition !== undefined) {
680
683
  details = getCompletionEntryDetails(targetScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
681
684
  }
@@ -743,9 +746,9 @@ function decorateLanguageService(language, languageService) {
743
746
  function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
744
747
  const results = [];
745
748
  const processedFilePositions = new Set();
746
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
749
+ const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
747
750
  if (serviceScript) {
748
- for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, filter)) {
751
+ for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
749
752
  process(targetScript.id, generatedOffset);
750
753
  }
751
754
  }
@@ -18,56 +18,59 @@ function decorateProgram(language, program) {
18
18
  return {
19
19
  ...result,
20
20
  diagnostics: result.diagnostics
21
- .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
21
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
22
22
  .filter(utils_1.notEmpty),
23
23
  };
24
24
  };
25
25
  program.getSyntacticDiagnostics = (sourceFile, cancellationToken) => {
26
26
  if (!sourceFile) {
27
27
  return getSyntacticDiagnostics(undefined, cancellationToken)
28
- .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
28
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
29
29
  .filter(utils_1.notEmpty);
30
30
  }
31
31
  else {
32
32
  const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
33
33
  const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
34
34
  return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
35
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
36
- .filter(utils_1.notEmpty);
35
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
36
+ .filter(utils_1.notEmpty)
37
+ .filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
37
38
  }
38
39
  };
39
40
  program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
40
41
  if (!sourceFile) {
41
42
  return getSemanticDiagnostics(undefined, cancellationToken)
42
- .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
43
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
43
44
  .filter(utils_1.notEmpty);
44
45
  }
45
46
  else {
46
47
  const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
47
48
  const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
48
49
  return getSemanticDiagnostics(actualSourceFile, cancellationToken)
49
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
50
- .filter(utils_1.notEmpty);
50
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
51
+ .filter(utils_1.notEmpty)
52
+ .filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
51
53
  }
52
54
  };
53
55
  program.getGlobalDiagnostics = cancellationToken => {
54
56
  return getGlobalDiagnostics(cancellationToken)
55
- .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
57
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
56
58
  .filter(utils_1.notEmpty);
57
59
  };
58
60
  // @ts-ignore
59
61
  program.getBindAndCheckDiagnostics = (sourceFile, cancellationToken) => {
60
62
  if (!sourceFile) {
61
63
  return getBindAndCheckDiagnostics(undefined, cancellationToken)
62
- .map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
64
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
63
65
  .filter(utils_1.notEmpty);
64
66
  }
65
67
  else {
66
68
  const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
67
69
  const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
68
70
  return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
69
- .map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
70
- .filter(utils_1.notEmpty);
71
+ .map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
72
+ .filter(utils_1.notEmpty)
73
+ .filter(d => language.scripts.get(d.file.fileName) === sourceScript);
71
74
  }
72
75
  };
73
76
  // fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
@@ -2,7 +2,7 @@ import type { CodeInformation, SourceScript, TypeScriptServiceScript } from '@vo
2
2
  import { Language } from '@volar/language-core';
3
3
  import type * as ts from 'typescript';
4
4
  export declare function transformCallHierarchyItem(language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
5
- export declare function transformDiagnostic<T extends ts.Diagnostic>(sourceScript: SourceScript<string> | undefined, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
5
+ export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
6
6
  export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
7
7
  export declare function transformFileTextChanges(language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
8
8
  export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
@@ -16,13 +16,13 @@ function transformCallHierarchyItem(language, item, filter) {
16
16
  };
17
17
  }
18
18
  exports.transformCallHierarchyItem = transformCallHierarchyItem;
19
- function transformDiagnostic(sourceScript, language, diagnostic, program, isTsc) {
19
+ function transformDiagnostic(language, diagnostic, program, isTsc) {
20
20
  if (!transformedDiagnostics.has(diagnostic)) {
21
21
  transformedDiagnostics.set(diagnostic, undefined);
22
22
  const { relatedInformation } = diagnostic;
23
23
  if (relatedInformation) {
24
24
  diagnostic.relatedInformation = relatedInformation
25
- .map(d => transformDiagnostic(undefined, language, d, program, isTsc))
25
+ .map(d => transformDiagnostic(language, d, program, isTsc))
26
26
  .filter(utils_1.notEmpty);
27
27
  }
28
28
  if (diagnostic.file !== undefined
@@ -30,7 +30,7 @@ function transformDiagnostic(sourceScript, language, diagnostic, program, isTsc)
30
30
  && diagnostic.length !== undefined) {
31
31
  const [serviceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
32
32
  if (serviceScript) {
33
- const [sourceSpanFileName, sourceSpan] = transformTextSpan(sourceScript, language, serviceScript, {
33
+ const [sourceSpanFileName, sourceSpan] = transformTextSpan(undefined, language, serviceScript, {
34
34
  start: diagnostic.start,
35
35
  length: diagnostic.length
36
36
  }, language_core_1.shouldReportDiagnostics) ?? [];
@@ -1,3 +1,6 @@
1
- import { LanguagePlugin } from '@volar/language-core';
1
+ import { Language, LanguagePlugin } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin<string>[]>): ts.server.PluginModuleFactory;
3
+ export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, create: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<{
4
+ languagePlugins: LanguagePlugin<string>[];
5
+ setup?: (language: Language<string>) => void;
6
+ }>): ts.server.PluginModuleFactory;
@@ -9,7 +9,7 @@ const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
9
9
  const externalFiles = new WeakMap();
10
10
  const decoratedLanguageServices = new WeakSet();
11
11
  const decoratedLanguageServiceHosts = new WeakSet();
12
- function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
12
+ function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
13
13
  return modules => {
14
14
  const { typescript: ts } = modules;
15
15
  const pluginModule = {
@@ -52,7 +52,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
52
52
  return getProjectVersion();
53
53
  };
54
54
  }
55
- loadLanguagePlugins(ts, info).then(languagePlugins => {
55
+ create(ts, info).then(({ languagePlugins, setup }) => {
56
56
  const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
57
57
  const language = (0, language_core_1.createLanguage)([
58
58
  ...languagePlugins,
@@ -73,6 +73,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
73
73
  });
74
74
  (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
75
75
  (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
76
+ setup?.(language);
76
77
  info.project.markAsDirty();
77
78
  initialized = true;
78
79
  });
@@ -1,4 +1,7 @@
1
- import { LanguagePlugin } from '@volar/language-core';
1
+ import { Language, LanguagePlugin } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin<string>[]): ts.server.PluginModuleFactory;
3
+ export declare function createLanguageServicePlugin(create: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => {
4
+ languagePlugins: LanguagePlugin<string>[];
5
+ setup?: (language: Language<string>) => void;
6
+ }): ts.server.PluginModuleFactory;
4
7
  export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
@@ -9,7 +9,7 @@ const externalFiles = new WeakMap();
9
9
  const projectExternalFileExtensions = new WeakMap();
10
10
  const decoratedLanguageServices = new WeakSet();
11
11
  const decoratedLanguageServiceHosts = new WeakSet();
12
- function createLanguageServicePlugin(loadLanguagePlugins) {
12
+ function createLanguageServicePlugin(create) {
13
13
  return modules => {
14
14
  const { typescript: ts } = modules;
15
15
  const pluginModule = {
@@ -18,7 +18,7 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
18
18
  && !decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
19
19
  decoratedLanguageServices.add(info.languageService);
20
20
  decoratedLanguageServiceHosts.add(info.languageServiceHost);
21
- const languagePlugins = loadLanguagePlugins(ts, info);
21
+ const { languagePlugins, setup } = create(ts, info);
22
22
  const extensions = languagePlugins
23
23
  .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
24
24
  .flat();
@@ -45,6 +45,7 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
45
45
  });
46
46
  (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
47
47
  (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
48
+ setup?.(language);
48
49
  }
49
50
  return info.languageService;
50
51
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.3.0-alpha.12",
3
+ "version": "2.3.0-alpha.13",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,14 +12,14 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.3.0-alpha.12",
15
+ "@volar/language-core": "2.3.0-alpha.13",
16
16
  "path-browserify": "^1.0.1",
17
17
  "vscode-uri": "^3.0.8"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "latest",
21
21
  "@types/path-browserify": "latest",
22
- "@volar/language-service": "2.3.0-alpha.12"
22
+ "@volar/language-service": "2.3.0-alpha.13"
23
23
  },
24
- "gitHead": "750f23e9cebbc2262904c91600e631036eaec4d8"
24
+ "gitHead": "4effe4689ac845b17b7c821d50deda62c124f23b"
25
25
  }