@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 +14 -11
- package/index.js +1 -1
- package/lib/node/decorateLanguageServiceHost.js +1 -1
- package/lib/node/proxyCreateProgram.js +1 -1
- package/lib/node/proxyLanguageService.d.ts +6 -0
- package/lib/node/{decorateLanguageService.js → proxyLanguageService.js} +208 -84
- package/lib/protocol/createProject.d.ts +1 -1
- package/lib/protocol/createProject.js +22 -8
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +4 -2
- package/lib/quickstart/createLanguageServicePlugin.js +4 -2
- package/lib/quickstart/runTsc.d.ts +1 -1
- package/lib/resolveModuleName.d.ts +1 -1
- package/lib/resolveModuleName.js +2 -2
- package/package.json +4 -4
- package/lib/node/decorateLanguageService.d.ts +0 -3
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from './lib/common';
|
|
2
|
-
export * from './lib/node/
|
|
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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
21
|
-
asFileName(
|
|
21
|
+
asUri(fileName: string): URI;
|
|
22
|
+
asFileName(uri: URI): string;
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
34
|
+
interface TypeScriptGenericOptions {
|
|
32
35
|
extraFileExtensions: ts.FileExtensionInfo[];
|
|
33
36
|
resolveHiddenExtensions?: boolean;
|
|
34
|
-
getServiceScript(root:
|
|
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
|
|
40
|
-
getExtraServiceScripts?(fileName: string,
|
|
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/
|
|
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) => {
|
|
@@ -1,15 +1,76 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
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
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
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=
|
|
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>,
|
|
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,
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
(
|
|
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
|
|
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,
|
|
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
|
-
|
|
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;
|
package/lib/resolveModuleName.js
CHANGED
|
@@ -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 =
|
|
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.
|
|
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.
|
|
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.
|
|
22
|
+
"@volar/language-service": "2.4.0-alpha.10"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "9f0cb9f2e41167baeb503e8f0eca88e9bea06269"
|
|
25
25
|
}
|