@volar/typescript 2.2.4 → 2.3.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/lib/common.d.ts +1 -2
- package/lib/common.js +16 -17
- package/lib/node/decorateLanguageService.d.ts +1 -1
- package/lib/node/decorateLanguageService.js +2 -2
- package/lib/node/decorateLanguageServiceHost.d.ts +1 -1
- package/lib/node/decorateProgram.d.ts +1 -1
- package/lib/node/proxyCreateProgram.d.ts +1 -1
- package/lib/node/proxyCreateProgram.js +7 -3
- package/lib/node/transform.d.ts +13 -12
- package/lib/node/utils.d.ts +1 -1
- package/lib/protocol/createProject.d.ts +9 -2
- package/lib/protocol/createProject.js +206 -246
- package/lib/protocol/createSys.d.ts +6 -2
- package/lib/protocol/createSys.js +10 -9
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +2 -2
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +8 -4
- package/lib/quickstart/createLanguageServicePlugin.d.ts +2 -2
- package/lib/quickstart/createLanguageServicePlugin.js +8 -4
- package/lib/quickstart/runTsc.d.ts +1 -1
- package/lib/resolveModuleName.d.ts +1 -1
- package/package.json +6 -5
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -20,4 +20,5 @@ __exportStar(require("./lib/node/decorateProgram"), exports);
|
|
|
20
20
|
__exportStar(require("./lib/node/proxyCreateProgram"), exports);
|
|
21
21
|
__exportStar(require("./lib/protocol/createProject"), exports);
|
|
22
22
|
__exportStar(require("./lib/protocol/createSys"), exports);
|
|
23
|
+
__exportStar(require("./lib/common"), exports);
|
|
23
24
|
//# sourceMappingURL=index.js.map
|
package/lib/common.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const fileLanguageIdProviderPlugin: LanguagePlugin;
|
|
1
|
+
export declare function resolveFileLanguageId(path: string): string | undefined;
|
package/lib/common.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
3
|
+
exports.resolveFileLanguageId = void 0;
|
|
4
|
+
function resolveFileLanguageId(path) {
|
|
5
|
+
const ext = path.split('.').pop();
|
|
6
|
+
switch (ext) {
|
|
7
|
+
case 'js': return 'javascript';
|
|
8
|
+
case 'cjs': return 'javascript';
|
|
9
|
+
case 'mjs': return 'javascript';
|
|
10
|
+
case 'ts': return 'typescript';
|
|
11
|
+
case 'cts': return 'typescript';
|
|
12
|
+
case 'mts': return 'typescript';
|
|
13
|
+
case 'jsx': return 'javascriptreact';
|
|
14
|
+
case 'tsx': return 'typescriptreact';
|
|
15
|
+
case 'json': return 'json';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.resolveFileLanguageId = resolveFileLanguageId;
|
|
20
19
|
//# sourceMappingURL=common.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateLanguageService(language: Language
|
|
3
|
+
export declare function decorateLanguageService(language: Language<string>, languageService: ts.LanguageService): void;
|
|
@@ -415,9 +415,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
415
415
|
// TODO reuse the logic from language service
|
|
416
416
|
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
417
417
|
start ??= mapping.generatedOffsets[0];
|
|
418
|
-
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1];
|
|
418
|
+
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1];
|
|
419
419
|
start = Math.min(start, mapping.generatedOffsets[0]);
|
|
420
|
-
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1]);
|
|
420
|
+
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1]);
|
|
421
421
|
}
|
|
422
422
|
}
|
|
423
423
|
start ??= 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language
|
|
3
|
+
export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language<string>, languageServiceHost: ts.LanguageServiceHost): void;
|
|
4
4
|
export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateProgram(language: Language
|
|
3
|
+
export declare function decorateProgram(language: Language<string>, program: ts.Program): void;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { LanguagePlugin } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[]): typeof import("typescript").createProgram;
|
|
3
|
+
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin<string>[]): typeof import("typescript").createProgram;
|
|
@@ -30,7 +30,7 @@ const objectEqual = (a, b) => {
|
|
|
30
30
|
return true;
|
|
31
31
|
};
|
|
32
32
|
function proxyCreateProgram(ts, original, getLanguagePlugins) {
|
|
33
|
-
const sourceFileSnapshots = new
|
|
33
|
+
const sourceFileSnapshots = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
34
34
|
const parsedSourceFiles = new WeakMap();
|
|
35
35
|
let lastOptions;
|
|
36
36
|
let languagePlugins;
|
|
@@ -50,8 +50,12 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
|
|
|
50
50
|
languagePlugins = getLanguagePlugins(ts, options);
|
|
51
51
|
language = (0, language_core_1.createLanguage)([
|
|
52
52
|
...languagePlugins,
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
{
|
|
54
|
+
getLanguageId(fileName) {
|
|
55
|
+
return (0, common_1.resolveFileLanguageId)(fileName);
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
], new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
|
|
55
59
|
if (!sourceFileSnapshots.has(fileName)) {
|
|
56
60
|
const sourceFileText = originalHost.readFile(fileName);
|
|
57
61
|
if (sourceFileText !== undefined) {
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { CodeInformation, SourceMap, SourceScript } from '@volar/language-core';
|
|
2
|
+
import { Language } from '@volar/language-core';
|
|
2
3
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function transformCallHierarchyItem(language: Language
|
|
4
|
-
export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language
|
|
5
|
-
export declare function fillSourceFileText(language: Language
|
|
6
|
-
export declare function transformFileTextChanges(language: Language
|
|
7
|
-
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language
|
|
8
|
-
export declare function transformSpan(language: Language
|
|
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>(language: Language<string>, diagnostic: T, isTsc: boolean): T | undefined;
|
|
6
|
+
export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
|
|
7
|
+
export declare function transformFileTextChanges(language: Language<string>, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
|
|
8
|
+
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
9
|
+
export declare function transformSpan(language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
|
9
10
|
fileName: string;
|
|
10
11
|
textSpan: ts.TextSpan;
|
|
11
12
|
} | undefined;
|
|
12
|
-
export declare function transformTextChange(sourceScript: SourceScript
|
|
13
|
-
export declare function transformTextSpan(sourceScript: SourceScript
|
|
14
|
-
export declare function toSourceOffset(sourceScript: SourceScript
|
|
15
|
-
export declare function toGeneratedOffset(sourceScript: SourceScript
|
|
16
|
-
export declare function toGeneratedOffsets(sourceScript: SourceScript
|
|
13
|
+
export declare function transformTextChange(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
|
|
14
|
+
export declare function transformTextSpan(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
|
|
15
|
+
export declare function toSourceOffset(sourceScript: SourceScript<string>, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
16
|
+
export declare function toGeneratedOffset(sourceScript: SourceScript<string>, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
17
|
+
export declare function toGeneratedOffsets(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
package/lib/node/utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Language } from '@volar/language-core';
|
|
2
2
|
export declare function notEmpty<T>(value: T | null | undefined): value is T;
|
|
3
|
-
export declare function getServiceScript(language: Language
|
|
3
|
+
export declare function getServiceScript(language: Language<string>, fileName: string): readonly [import("@volar/language-core").TypeScriptServiceScript, import("@volar/language-core").SourceScript<string>, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Language, TypeScriptExtraServiceScript } from '@volar/language-core';
|
|
2
|
+
import type * as ts from 'typescript';
|
|
3
|
+
import type { createSys } from './createSys';
|
|
4
|
+
export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'getLocalizedDiagnosticMessages' | 'getCurrentDirectory' | 'getCompilationSettings' | 'getProjectReferences' | 'getScriptFileNames' | 'getProjectVersion' | 'getScriptSnapshot'> {
|
|
5
|
+
}
|
|
6
|
+
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
|
+
languageServiceHost: ts.LanguageServiceHost;
|
|
8
|
+
getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript | undefined;
|
|
9
|
+
};
|
|
@@ -1,58 +1,129 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createLanguageServiceHost = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
|
-
const language_core_2 = require("@volar/language-core");
|
|
6
5
|
const path = require("path-browserify");
|
|
7
6
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
8
|
-
|
|
9
|
-
const scriptVersions = new
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
7
|
+
function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
8
|
+
const scriptVersions = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
9
|
+
let lastProjectVersion;
|
|
10
|
+
let tsProjectVersion = 0;
|
|
11
|
+
let tsFileRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
12
|
+
let extraScriptRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
13
|
+
let lastTsVirtualFileSnapshots = new Set();
|
|
14
|
+
let lastOtherVirtualFileSnapshots = new Set();
|
|
15
|
+
let languageServiceHost = {
|
|
16
|
+
...sys,
|
|
17
|
+
getCurrentDirectory() {
|
|
18
|
+
return projectHost.getCurrentDirectory();
|
|
19
|
+
},
|
|
20
|
+
useCaseSensitiveFileNames() {
|
|
21
|
+
return sys.useCaseSensitiveFileNames;
|
|
22
|
+
},
|
|
23
|
+
getNewLine() {
|
|
24
|
+
return sys.newLine;
|
|
25
|
+
},
|
|
26
|
+
getTypeRootsVersion: () => {
|
|
27
|
+
return 'version' in sys ? sys.version : -1; // TODO: only update for /node_modules changes?
|
|
28
|
+
},
|
|
29
|
+
getDirectories(dirName) {
|
|
30
|
+
return sys.getDirectories(dirName);
|
|
31
|
+
},
|
|
32
|
+
readDirectory(dirName, extensions, excludes, includes, depth) {
|
|
33
|
+
const exts = new Set(extensions);
|
|
34
|
+
for (const languagePlugin of language.plugins) {
|
|
35
|
+
for (const ext of languagePlugin.typescript?.extraFileExtensions ?? []) {
|
|
36
|
+
exts.add('.' + ext.extension);
|
|
28
37
|
}
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
}
|
|
39
|
+
extensions = [...exts];
|
|
40
|
+
return sys.readDirectory(dirName, extensions, excludes, includes, depth);
|
|
41
|
+
},
|
|
42
|
+
getCompilationSettings() {
|
|
43
|
+
const options = projectHost.getCompilationSettings();
|
|
44
|
+
if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
45
|
+
options.allowNonTsExtensions ??= true;
|
|
46
|
+
if (!options.allowNonTsExtensions) {
|
|
47
|
+
console.warn('`allowNonTsExtensions` must be `true`.');
|
|
31
48
|
}
|
|
32
49
|
}
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
return options;
|
|
51
|
+
},
|
|
52
|
+
getLocalizedDiagnosticMessages: projectHost.getLocalizedDiagnosticMessages,
|
|
53
|
+
getProjectReferences: projectHost.getProjectReferences,
|
|
54
|
+
getDefaultLibFileName: options => {
|
|
55
|
+
try {
|
|
56
|
+
return ts.getDefaultLibFilePath(options);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// web
|
|
60
|
+
return `/node_modules/typescript/lib/${ts.getDefaultLibFileName(options)}`;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
readFile(fileName) {
|
|
64
|
+
const snapshot = getScriptSnapshot(fileName);
|
|
65
|
+
if (snapshot) {
|
|
66
|
+
return snapshot.getText(0, snapshot.getLength());
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
fileExists(fileName) {
|
|
70
|
+
return getScriptVersion(fileName) !== '';
|
|
71
|
+
},
|
|
72
|
+
getProjectVersion() {
|
|
73
|
+
sync();
|
|
74
|
+
return tsProjectVersion + ('version' in sys ? `:${sys.version}` : '');
|
|
75
|
+
},
|
|
76
|
+
getScriptFileNames() {
|
|
77
|
+
sync();
|
|
78
|
+
return [...tsFileRegistry.keys()];
|
|
79
|
+
},
|
|
80
|
+
getScriptKind(fileName) {
|
|
81
|
+
sync();
|
|
82
|
+
if (extraScriptRegistry.has(fileName)) {
|
|
83
|
+
return extraScriptRegistry.get(fileName).scriptKind;
|
|
84
|
+
}
|
|
85
|
+
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
86
|
+
if (sourceScript?.generated) {
|
|
87
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
88
|
+
if (serviceScript) {
|
|
89
|
+
return serviceScript.scriptKind;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
switch (path.extname(fileName)) {
|
|
93
|
+
case '.js':
|
|
94
|
+
case '.cjs':
|
|
95
|
+
case '.mjs':
|
|
96
|
+
return ts.ScriptKind.JS;
|
|
97
|
+
case '.jsx':
|
|
98
|
+
return ts.ScriptKind.JSX;
|
|
99
|
+
case '.ts':
|
|
100
|
+
case '.cts':
|
|
101
|
+
case '.mts':
|
|
102
|
+
return ts.ScriptKind.TS;
|
|
103
|
+
case '.tsx':
|
|
104
|
+
return ts.ScriptKind.TSX;
|
|
105
|
+
case '.json':
|
|
106
|
+
return ts.ScriptKind.JSON;
|
|
107
|
+
default:
|
|
108
|
+
return ts.ScriptKind.Unknown;
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
getScriptVersion,
|
|
112
|
+
getScriptSnapshot,
|
|
113
|
+
};
|
|
114
|
+
for (const plugin of language.plugins) {
|
|
115
|
+
if (plugin.typescript?.resolveLanguageServiceHost) {
|
|
116
|
+
languageServiceHost = plugin.typescript.resolveLanguageServiceHost(languageServiceHost);
|
|
46
117
|
}
|
|
47
118
|
}
|
|
48
|
-
if (
|
|
119
|
+
if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
49
120
|
// TODO: can this share between monorepo packages?
|
|
50
121
|
const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames?.() ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
|
|
51
|
-
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost,
|
|
52
|
-
let lastSysVersion =
|
|
122
|
+
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(asScrpitId(fileName)));
|
|
123
|
+
let lastSysVersion = 'version' in sys ? sys.version : undefined;
|
|
53
124
|
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
|
|
54
|
-
if (
|
|
55
|
-
lastSysVersion =
|
|
125
|
+
if ('version' in sys && lastSysVersion !== sys.version) {
|
|
126
|
+
lastSysVersion = sys.version;
|
|
56
127
|
moduleCache.clear();
|
|
57
128
|
}
|
|
58
129
|
return moduleLiterals.map(moduleLiteral => {
|
|
@@ -60,8 +131,8 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
|
|
|
60
131
|
});
|
|
61
132
|
};
|
|
62
133
|
languageServiceHost.resolveModuleNames = (moduleNames, containingFile, _reusedNames, redirectedReference, options) => {
|
|
63
|
-
if (
|
|
64
|
-
lastSysVersion =
|
|
134
|
+
if ('version' in sys && lastSysVersion !== sys.version) {
|
|
135
|
+
lastSysVersion = sys.version;
|
|
65
136
|
moduleCache.clear();
|
|
66
137
|
}
|
|
67
138
|
return moduleNames.map(moduleName => {
|
|
@@ -69,227 +140,116 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
|
|
|
69
140
|
});
|
|
70
141
|
};
|
|
71
142
|
}
|
|
72
|
-
|
|
73
|
-
projectHost,
|
|
143
|
+
return {
|
|
74
144
|
languageServiceHost,
|
|
75
|
-
getExtraServiceScript
|
|
145
|
+
getExtraServiceScript,
|
|
76
146
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
...projectHost,
|
|
87
|
-
getCurrentDirectory: projectHost.getCurrentDirectory,
|
|
88
|
-
getCompilationSettings() {
|
|
89
|
-
const options = projectHost.getCompilationSettings();
|
|
90
|
-
if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
91
|
-
options.allowNonTsExtensions ??= true;
|
|
92
|
-
if (!options.allowNonTsExtensions) {
|
|
93
|
-
console.warn('`allowNonTsExtensions` must be `true`.');
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return options;
|
|
97
|
-
},
|
|
98
|
-
getLocalizedDiagnosticMessages: projectHost.getLocalizedDiagnosticMessages,
|
|
99
|
-
getProjectReferences: projectHost.getProjectReferences,
|
|
100
|
-
getDefaultLibFileName: options => {
|
|
101
|
-
try {
|
|
102
|
-
return ts.getDefaultLibFilePath(options);
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// web
|
|
106
|
-
return `/node_modules/typescript/lib/${ts.getDefaultLibFileName(options)}`;
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
useCaseSensitiveFileNames() {
|
|
110
|
-
return projectHost.useCaseSensitiveFileNames;
|
|
111
|
-
},
|
|
112
|
-
getNewLine() {
|
|
113
|
-
return projectHost.newLine;
|
|
114
|
-
},
|
|
115
|
-
getTypeRootsVersion: () => {
|
|
116
|
-
return projectHost.getSystemVersion?.() ?? -1; // TODO: only update for /node_modules changes?
|
|
117
|
-
},
|
|
118
|
-
getDirectories(dirName) {
|
|
119
|
-
return projectHost.getDirectories(dirName);
|
|
120
|
-
},
|
|
121
|
-
readDirectory(dirName, extensions, excludes, includes, depth) {
|
|
122
|
-
const exts = new Set(extensions);
|
|
123
|
-
for (const languagePlugin of languagePlugins) {
|
|
124
|
-
for (const ext of languagePlugin.typescript?.extraFileExtensions ?? []) {
|
|
125
|
-
exts.add('.' + ext.extension);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
extensions = [...exts];
|
|
129
|
-
return projectHost.readDirectory(dirName, extensions, excludes, includes, depth);
|
|
130
|
-
},
|
|
131
|
-
readFile(fileName) {
|
|
132
|
-
const snapshot = getScriptSnapshot(fileName);
|
|
133
|
-
if (snapshot) {
|
|
134
|
-
return snapshot.getText(0, snapshot.getLength());
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
fileExists(fileName) {
|
|
138
|
-
return getScriptVersion(fileName) !== '';
|
|
139
|
-
},
|
|
140
|
-
getProjectVersion() {
|
|
141
|
-
sync();
|
|
142
|
-
return tsProjectVersion + (projectHost.getSystemVersion ? `:${projectHost.getSystemVersion()}` : '');
|
|
143
|
-
},
|
|
144
|
-
getScriptFileNames() {
|
|
145
|
-
sync();
|
|
146
|
-
return [...tsFileRegistry.keys()];
|
|
147
|
-
},
|
|
148
|
-
getScriptKind(fileName) {
|
|
149
|
-
sync();
|
|
150
|
-
if (extraScriptRegistry.has(fileName)) {
|
|
151
|
-
return extraScriptRegistry.get(fileName).scriptKind;
|
|
152
|
-
}
|
|
153
|
-
const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
|
|
154
|
-
if (sourceScript?.generated) {
|
|
155
|
-
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
156
|
-
if (serviceScript) {
|
|
157
|
-
return serviceScript.scriptKind;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
switch (path.extname(fileName)) {
|
|
161
|
-
case '.js':
|
|
162
|
-
case '.cjs':
|
|
163
|
-
case '.mjs':
|
|
164
|
-
return ts.ScriptKind.JS;
|
|
165
|
-
case '.jsx':
|
|
166
|
-
return ts.ScriptKind.JSX;
|
|
167
|
-
case '.ts':
|
|
168
|
-
case '.cts':
|
|
169
|
-
case '.mts':
|
|
170
|
-
return ts.ScriptKind.TS;
|
|
171
|
-
case '.tsx':
|
|
172
|
-
return ts.ScriptKind.TSX;
|
|
173
|
-
case '.json':
|
|
174
|
-
return ts.ScriptKind.JSON;
|
|
175
|
-
default:
|
|
176
|
-
return ts.ScriptKind.Unknown;
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
getScriptVersion,
|
|
180
|
-
getScriptSnapshot,
|
|
181
|
-
};
|
|
182
|
-
return {
|
|
183
|
-
languageServiceHost,
|
|
184
|
-
getExtraScript,
|
|
185
|
-
};
|
|
186
|
-
function getExtraScript(fileName) {
|
|
187
|
-
sync();
|
|
188
|
-
return extraScriptRegistry.get(fileName);
|
|
189
|
-
}
|
|
190
|
-
function sync() {
|
|
191
|
-
const newProjectVersion = projectHost.getProjectVersion?.();
|
|
192
|
-
const shouldUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
|
|
193
|
-
if (!shouldUpdate) {
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
lastProjectVersion = newProjectVersion;
|
|
197
|
-
extraScriptRegistry.clear();
|
|
198
|
-
const newTsVirtualFileSnapshots = new Set();
|
|
199
|
-
const newOtherVirtualFileSnapshots = new Set();
|
|
200
|
-
const tsFileNamesSet = new Set();
|
|
201
|
-
for (const fileName of projectHost.getScriptFileNames()) {
|
|
202
|
-
const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
|
|
203
|
-
if (sourceScript?.generated) {
|
|
204
|
-
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
205
|
-
if (serviceScript) {
|
|
206
|
-
newTsVirtualFileSnapshots.add(serviceScript.code.snapshot);
|
|
207
|
-
tsFileNamesSet.add(fileName);
|
|
208
|
-
}
|
|
209
|
-
for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
|
|
210
|
-
newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
|
|
211
|
-
tsFileNamesSet.add(extraServiceScript.fileName);
|
|
212
|
-
extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
|
|
213
|
-
}
|
|
214
|
-
for (const code of (0, language_core_2.forEachEmbeddedCode)(sourceScript.generated.root)) {
|
|
215
|
-
newOtherVirtualFileSnapshots.add(code.snapshot);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
tsFileNamesSet.add(fileName);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (!setEquals(lastTsVirtualFileSnapshots, newTsVirtualFileSnapshots)) {
|
|
223
|
-
tsProjectVersion++;
|
|
224
|
-
}
|
|
225
|
-
else if (setEquals(lastOtherVirtualFileSnapshots, newOtherVirtualFileSnapshots)) {
|
|
226
|
-
// no any meta language files update, it mean project version was update by source files this time
|
|
227
|
-
tsProjectVersion++;
|
|
228
|
-
}
|
|
229
|
-
lastTsVirtualFileSnapshots = newTsVirtualFileSnapshots;
|
|
230
|
-
lastOtherVirtualFileSnapshots = newOtherVirtualFileSnapshots;
|
|
231
|
-
tsFileRegistry.clear();
|
|
232
|
-
for (const fileName of tsFileNamesSet) {
|
|
233
|
-
tsFileRegistry.set(fileName, true);
|
|
234
|
-
}
|
|
147
|
+
function getExtraServiceScript(fileName) {
|
|
148
|
+
sync();
|
|
149
|
+
return extraScriptRegistry.get(fileName);
|
|
150
|
+
}
|
|
151
|
+
function sync() {
|
|
152
|
+
const newProjectVersion = projectHost.getProjectVersion?.();
|
|
153
|
+
const shouldUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
|
|
154
|
+
if (!shouldUpdate) {
|
|
155
|
+
return;
|
|
235
156
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
157
|
+
lastProjectVersion = newProjectVersion;
|
|
158
|
+
extraScriptRegistry.clear();
|
|
159
|
+
const newTsVirtualFileSnapshots = new Set();
|
|
160
|
+
const newOtherVirtualFileSnapshots = new Set();
|
|
161
|
+
const tsFileNamesSet = new Set();
|
|
162
|
+
for (const fileName of projectHost.getScriptFileNames()) {
|
|
163
|
+
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
242
164
|
if (sourceScript?.generated) {
|
|
243
165
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
244
166
|
if (serviceScript) {
|
|
245
|
-
|
|
167
|
+
newTsVirtualFileSnapshots.add(serviceScript.code.snapshot);
|
|
168
|
+
tsFileNamesSet.add(fileName);
|
|
169
|
+
}
|
|
170
|
+
for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
|
|
171
|
+
newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
|
|
172
|
+
tsFileNamesSet.add(extraServiceScript.fileName);
|
|
173
|
+
extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
|
|
174
|
+
}
|
|
175
|
+
for (const code of (0, language_core_1.forEachEmbeddedCode)(sourceScript.generated.root)) {
|
|
176
|
+
newOtherVirtualFileSnapshots.add(code.snapshot);
|
|
246
177
|
}
|
|
247
178
|
}
|
|
248
|
-
else
|
|
249
|
-
|
|
179
|
+
else {
|
|
180
|
+
tsFileNamesSet.add(fileName);
|
|
250
181
|
}
|
|
251
182
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
183
|
+
if (!setEquals(lastTsVirtualFileSnapshots, newTsVirtualFileSnapshots)) {
|
|
184
|
+
tsProjectVersion++;
|
|
185
|
+
}
|
|
186
|
+
else if (setEquals(lastOtherVirtualFileSnapshots, newOtherVirtualFileSnapshots)) {
|
|
187
|
+
// no any meta language files update, it mean project version was update by source files this time
|
|
188
|
+
tsProjectVersion++;
|
|
189
|
+
}
|
|
190
|
+
lastTsVirtualFileSnapshots = newTsVirtualFileSnapshots;
|
|
191
|
+
lastOtherVirtualFileSnapshots = newOtherVirtualFileSnapshots;
|
|
192
|
+
tsFileRegistry.clear();
|
|
193
|
+
for (const fileName of tsFileNamesSet) {
|
|
194
|
+
tsFileRegistry.set(fileName, true);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function getScriptSnapshot(fileName) {
|
|
198
|
+
sync();
|
|
199
|
+
if (extraScriptRegistry.has(fileName)) {
|
|
200
|
+
return extraScriptRegistry.get(fileName).code.snapshot;
|
|
201
|
+
}
|
|
202
|
+
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
203
|
+
if (sourceScript?.generated) {
|
|
204
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
205
|
+
if (serviceScript) {
|
|
206
|
+
return serviceScript.code.snapshot;
|
|
256
207
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
208
|
+
}
|
|
209
|
+
else if (sourceScript) {
|
|
210
|
+
return sourceScript.snapshot;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function getScriptVersion(fileName) {
|
|
214
|
+
sync();
|
|
215
|
+
if (!scriptVersions.has(fileName)) {
|
|
216
|
+
scriptVersions.set(fileName, { lastVersion: 0, map: new WeakMap() });
|
|
217
|
+
}
|
|
218
|
+
const version = scriptVersions.get(fileName);
|
|
219
|
+
if (extraScriptRegistry.has(fileName)) {
|
|
220
|
+
const snapshot = extraScriptRegistry.get(fileName).code.snapshot;
|
|
221
|
+
if (!version.map.has(snapshot)) {
|
|
222
|
+
version.map.set(snapshot, version.lastVersion++);
|
|
264
223
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
224
|
+
return version.map.get(snapshot).toString();
|
|
225
|
+
}
|
|
226
|
+
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
227
|
+
if (sourceScript?.generated) {
|
|
228
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
229
|
+
if (serviceScript) {
|
|
230
|
+
if (!version.map.has(serviceScript.code.snapshot)) {
|
|
231
|
+
version.map.set(serviceScript.code.snapshot, version.lastVersion++);
|
|
273
232
|
}
|
|
233
|
+
return version.map.get(serviceScript.code.snapshot).toString();
|
|
274
234
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return version.map.get(sourceScript.snapshot).toString();
|
|
235
|
+
}
|
|
236
|
+
const isOpenedFile = !!projectHost.getScriptSnapshot(fileName);
|
|
237
|
+
if (isOpenedFile) {
|
|
238
|
+
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
239
|
+
if (sourceScript && !sourceScript.generated) {
|
|
240
|
+
if (!version.map.has(sourceScript.snapshot)) {
|
|
241
|
+
version.map.set(sourceScript.snapshot, version.lastVersion++);
|
|
283
242
|
}
|
|
243
|
+
return version.map.get(sourceScript.snapshot).toString();
|
|
284
244
|
}
|
|
285
|
-
if (projectHost.fileExists(fileName)) {
|
|
286
|
-
return projectHost.getModifiedTime?.(fileName)?.valueOf().toString() ?? '0';
|
|
287
|
-
}
|
|
288
|
-
return '';
|
|
289
245
|
}
|
|
246
|
+
if (sys.fileExists(fileName)) {
|
|
247
|
+
return sys.getModifiedTime?.(fileName)?.valueOf().toString() ?? '0';
|
|
248
|
+
}
|
|
249
|
+
return '';
|
|
290
250
|
}
|
|
291
251
|
}
|
|
292
|
-
exports.
|
|
252
|
+
exports.createLanguageServiceHost = createLanguageServiceHost;
|
|
293
253
|
function setEquals(a, b) {
|
|
294
254
|
if (a.size !== b.size) {
|
|
295
255
|
return false;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { LanguageServiceEnvironment, Disposable } from '@volar/language-service';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
|
|
3
|
+
import { URI } from 'vscode-uri';
|
|
4
|
+
export declare function createSys(sys: ts.System | undefined, env: LanguageServiceEnvironment, workspaceFolder: URI | undefined, uriConverter: {
|
|
5
|
+
asUri(fileName: string): URI;
|
|
6
|
+
asFileName(uri: URI): string;
|
|
7
|
+
}): ts.System & {
|
|
4
8
|
version: number;
|
|
5
9
|
sync(): Promise<number>;
|
|
6
10
|
} & Disposable;
|
|
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createSys = void 0;
|
|
4
4
|
const path = require("path-browserify");
|
|
5
5
|
const utilities_1 = require("../typescript/utilities");
|
|
6
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
6
7
|
let currentCwd = '';
|
|
7
|
-
function createSys(
|
|
8
|
+
function createSys(sys, env, workspaceFolder, uriConverter) {
|
|
8
9
|
let version = 0;
|
|
9
|
-
|
|
10
|
-
const sys = ts.sys;
|
|
10
|
+
const currentDirectory = workspaceFolder ? uriConverter.asFileName(workspaceFolder) : '';
|
|
11
11
|
const caseSensitive = sys?.useCaseSensitiveFileNames ?? false;
|
|
12
12
|
const root = {
|
|
13
13
|
name: '',
|
|
@@ -19,7 +19,8 @@ function createSys(ts, env, currentDirectory) {
|
|
|
19
19
|
const fileWatcher = env.onDidChangeWatchedFiles?.(({ changes }) => {
|
|
20
20
|
version++;
|
|
21
21
|
for (const change of changes) {
|
|
22
|
-
const
|
|
22
|
+
const changeUri = vscode_uri_1.URI.parse(change.uri);
|
|
23
|
+
const fileName = uriConverter.asFileName(changeUri);
|
|
23
24
|
const dirName = path.dirname(fileName);
|
|
24
25
|
const baseName = path.basename(fileName);
|
|
25
26
|
const fileExists = change.type === 1
|
|
@@ -107,7 +108,7 @@ function createSys(ts, env, currentDirectory) {
|
|
|
107
108
|
const dir = getDir(dirName);
|
|
108
109
|
if (dir.exists === undefined) {
|
|
109
110
|
dir.exists = false;
|
|
110
|
-
const result = env.fs?.stat(
|
|
111
|
+
const result = env.fs?.stat(uriConverter.asUri(dirName));
|
|
111
112
|
if (typeof result === 'object' && 'then' in result) {
|
|
112
113
|
const promise = result;
|
|
113
114
|
promises.add(promise);
|
|
@@ -148,7 +149,7 @@ function createSys(ts, env, currentDirectory) {
|
|
|
148
149
|
return exists();
|
|
149
150
|
}
|
|
150
151
|
function handleStat(fileName, file) {
|
|
151
|
-
const result = env.fs?.stat(
|
|
152
|
+
const result = env.fs?.stat(uriConverter.asUri(fileName));
|
|
152
153
|
if (typeof result === 'object' && 'then' in result) {
|
|
153
154
|
const promise = result;
|
|
154
155
|
promises.add(promise);
|
|
@@ -219,7 +220,7 @@ function createSys(ts, env, currentDirectory) {
|
|
|
219
220
|
return;
|
|
220
221
|
}
|
|
221
222
|
file.requestedText = true;
|
|
222
|
-
const uri =
|
|
223
|
+
const uri = uriConverter.asUri(fileName);
|
|
223
224
|
const result = env.fs?.readFile(uri, encoding);
|
|
224
225
|
if (typeof result === 'object' && 'then' in result) {
|
|
225
226
|
const promise = result;
|
|
@@ -245,7 +246,7 @@ function createSys(ts, env, currentDirectory) {
|
|
|
245
246
|
return;
|
|
246
247
|
}
|
|
247
248
|
dir.requestedRead = true;
|
|
248
|
-
const result = env.fs?.readDirectory(
|
|
249
|
+
const result = env.fs?.readDirectory(uriConverter.asUri(dirName || '.'));
|
|
249
250
|
if (typeof result === 'object' && 'then' in result) {
|
|
250
251
|
const promise = result;
|
|
251
252
|
promises.add(promise);
|
|
@@ -267,7 +268,7 @@ function createSys(ts, env, currentDirectory) {
|
|
|
267
268
|
for (const [name, _fileType] of result) {
|
|
268
269
|
let fileType = _fileType;
|
|
269
270
|
if (fileType === 64) {
|
|
270
|
-
const stat = env.fs?.stat(
|
|
271
|
+
const stat = env.fs?.stat(uriConverter.asUri(dirName + '/' + name));
|
|
271
272
|
if (typeof stat === 'object' && 'then' in stat) {
|
|
272
273
|
const promise = stat;
|
|
273
274
|
promises.add(promise);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type * as ts from 'typescript';
|
|
2
1
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
|
|
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;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createAsyncLanguageServicePlugin = void 0;
|
|
4
|
+
const language_core_1 = require("@volar/language-core");
|
|
5
|
+
const common_1 = require("../common");
|
|
4
6
|
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
5
7
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
6
|
-
const language_core_1 = require("@volar/language-core");
|
|
7
8
|
const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
8
|
-
const common_1 = require("../common");
|
|
9
9
|
const externalFiles = new WeakMap();
|
|
10
10
|
const decoratedLanguageServices = new WeakSet();
|
|
11
11
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
@@ -56,8 +56,12 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
56
56
|
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
57
57
|
const language = (0, language_core_1.createLanguage)([
|
|
58
58
|
...languagePlugins,
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
{
|
|
60
|
+
getLanguageId(fileName) {
|
|
61
|
+
return (0, common_1.resolveFileLanguageId)(fileName);
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
], new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
|
|
61
65
|
const version = getScriptVersion(fileName);
|
|
62
66
|
if (syncedScriptVersions.get(fileName) === version) {
|
|
63
67
|
return;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type * as ts from 'typescript';
|
|
2
1
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
|
|
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;
|
|
4
4
|
export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.arrayItemsEqual = exports.createLanguageServicePlugin = void 0;
|
|
4
|
-
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
5
|
-
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
6
4
|
const language_core_1 = require("@volar/language-core");
|
|
7
5
|
const common_1 = require("../common");
|
|
6
|
+
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
7
|
+
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
8
8
|
const externalFiles = new WeakMap();
|
|
9
9
|
const projectExternalFileExtensions = new WeakMap();
|
|
10
10
|
const decoratedLanguageServices = new WeakSet();
|
|
@@ -28,8 +28,12 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
|
28
28
|
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
29
29
|
const language = (0, language_core_1.createLanguage)([
|
|
30
30
|
...languagePlugins,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
{
|
|
32
|
+
getLanguageId(fileName) {
|
|
33
|
+
return (0, common_1.resolveFileLanguageId)(fileName);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
], new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
|
|
33
37
|
const version = getScriptVersion(fileName);
|
|
34
38
|
if (syncedScriptVersions.get(fileName) === version) {
|
|
35
39
|
return;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import type { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[];
|
|
3
|
+
export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin<string>[];
|
|
4
4
|
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(ts: typeof import('typescript'), host: ts.ModuleResolutionHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0-alpha.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,13 +12,14 @@
|
|
|
12
12
|
"directory": "packages/typescript"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@volar/language-core": "2.
|
|
16
|
-
"path-browserify": "^1.0.1"
|
|
15
|
+
"@volar/language-core": "2.3.0-alpha.0",
|
|
16
|
+
"path-browserify": "^1.0.1",
|
|
17
|
+
"vscode-uri": "^3.0.8"
|
|
17
18
|
},
|
|
18
19
|
"devDependencies": {
|
|
19
20
|
"@types/node": "latest",
|
|
20
21
|
"@types/path-browserify": "latest",
|
|
21
|
-
"@volar/language-service": "2.
|
|
22
|
+
"@volar/language-service": "2.3.0-alpha.0"
|
|
22
23
|
},
|
|
23
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "f17c19f712651acde33cc2171a112e64db0b460e"
|
|
24
25
|
}
|