@volar/typescript 2.2.0-alpha.4 → 2.2.0-alpha.6
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/lib/node/decorateLanguageServiceHost.d.ts +1 -1
- package/lib/node/decorateLanguageServiceHost.js +21 -44
- package/lib/node/decorateProgram.js +9 -0
- package/lib/node/proxyCreateProgram.d.ts +1 -1
- package/lib/node/proxyCreateProgram.js +1 -1
- package/lib/node/transform.d.ts +1 -1
- package/lib/node/transform.js +15 -11
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +1 -1
- package/lib/quickstart/createLanguageServicePlugin.js +1 -1
- package/package.json +4 -4
|
@@ -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, languageServiceHost: ts.LanguageServiceHost
|
|
3
|
+
export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language, languageServiceHost: ts.LanguageServiceHost): void;
|
|
4
4
|
export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
|
|
4
4
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
5
|
-
function decorateLanguageServiceHost(ts, language, languageServiceHost
|
|
6
|
-
let extraProjectVersion = 0;
|
|
5
|
+
function decorateLanguageServiceHost(ts, language, languageServiceHost) {
|
|
7
6
|
const extensions = language.plugins
|
|
8
7
|
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
|
|
9
8
|
.flat();
|
|
@@ -11,7 +10,6 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
|
|
|
11
10
|
const readDirectory = languageServiceHost.readDirectory?.bind(languageServiceHost);
|
|
12
11
|
const resolveModuleNameLiterals = languageServiceHost.resolveModuleNameLiterals?.bind(languageServiceHost);
|
|
13
12
|
const resolveModuleNames = languageServiceHost.resolveModuleNames?.bind(languageServiceHost);
|
|
14
|
-
const getProjectVersion = languageServiceHost.getProjectVersion?.bind(languageServiceHost);
|
|
15
13
|
const getScriptSnapshot = languageServiceHost.getScriptSnapshot.bind(languageServiceHost);
|
|
16
14
|
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
|
|
17
15
|
// path completion
|
|
@@ -54,11 +52,6 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
|
|
|
54
52
|
};
|
|
55
53
|
}
|
|
56
54
|
}
|
|
57
|
-
if (getProjectVersion) {
|
|
58
|
-
languageServiceHost.getProjectVersion = () => {
|
|
59
|
-
return getProjectVersion() + ':' + extraProjectVersion;
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
55
|
languageServiceHost.getScriptSnapshot = fileName => {
|
|
63
56
|
const virtualScript = updateVirtualScript(fileName);
|
|
64
57
|
if (virtualScript) {
|
|
@@ -77,45 +70,29 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
|
|
|
77
70
|
}
|
|
78
71
|
function updateVirtualScript(fileName) {
|
|
79
72
|
const version = languageServiceHost.getScriptVersion(fileName);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
|
|
99
|
-
console.warn('getExtraScripts() is not available in this use case.');
|
|
100
|
-
}
|
|
73
|
+
let script = scripts.get(fileName);
|
|
74
|
+
if (script?.[0] !== version) {
|
|
75
|
+
script = [version];
|
|
76
|
+
const sourceScript = language.scripts.get(fileName);
|
|
77
|
+
if (sourceScript?.generated) {
|
|
78
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
79
|
+
if (serviceScript) {
|
|
80
|
+
const sourceContents = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength());
|
|
81
|
+
let virtualContents = sourceContents.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
82
|
+
virtualContents += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
|
|
83
|
+
script[1] = {
|
|
84
|
+
extension: serviceScript.extension,
|
|
85
|
+
kind: serviceScript.scriptKind,
|
|
86
|
+
snapshot: ts.ScriptSnapshot.fromString(virtualContents),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
|
|
90
|
+
console.warn('getExtraServiceScripts() is not available in TS plugin.');
|
|
101
91
|
}
|
|
102
92
|
}
|
|
103
|
-
|
|
104
|
-
extraProjectVersion++;
|
|
105
|
-
language.scripts.delete(fileName);
|
|
106
|
-
}
|
|
107
|
-
if (snapshotSnapshot) {
|
|
108
|
-
scripts.set(fileName, [
|
|
109
|
-
version,
|
|
110
|
-
{
|
|
111
|
-
extension,
|
|
112
|
-
snapshot: snapshotSnapshot,
|
|
113
|
-
kind: scriptKind,
|
|
114
|
-
}
|
|
115
|
-
]);
|
|
116
|
-
}
|
|
93
|
+
scripts.set(fileName, script);
|
|
117
94
|
}
|
|
118
|
-
return
|
|
95
|
+
return script[1];
|
|
119
96
|
}
|
|
120
97
|
}
|
|
121
98
|
exports.decorateLanguageServiceHost = decorateLanguageServiceHost;
|
|
@@ -9,6 +9,7 @@ function decorateProgram(language, program) {
|
|
|
9
9
|
const getSyntacticDiagnostics = program.getSyntacticDiagnostics;
|
|
10
10
|
const getSemanticDiagnostics = program.getSemanticDiagnostics;
|
|
11
11
|
const getGlobalDiagnostics = program.getGlobalDiagnostics;
|
|
12
|
+
const getSourceFileByPath = program.getSourceFileByPath;
|
|
12
13
|
// for tsc --noEmit --watch
|
|
13
14
|
// @ts-ignore
|
|
14
15
|
const getBindAndCheckDiagnostics = program.getBindAndCheckDiagnostics;
|
|
@@ -42,6 +43,14 @@ function decorateProgram(language, program) {
|
|
|
42
43
|
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
43
44
|
.filter(utils_1.notEmpty);
|
|
44
45
|
};
|
|
46
|
+
// fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
|
|
47
|
+
program.getSourceFileByPath = path => {
|
|
48
|
+
const sourceFile = getSourceFileByPath(path);
|
|
49
|
+
if (sourceFile) {
|
|
50
|
+
(0, transform_1.fillSourceFileText)(language, sourceFile);
|
|
51
|
+
}
|
|
52
|
+
return sourceFile;
|
|
53
|
+
};
|
|
45
54
|
}
|
|
46
55
|
exports.decorateProgram = decorateProgram;
|
|
47
56
|
//# sourceMappingURL=decorateProgram.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type * as ts from 'typescript';
|
|
2
1
|
import { LanguagePlugin } from '@volar/language-core';
|
|
2
|
+
import type * as ts from 'typescript';
|
|
3
3
|
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[], getLanguageId: (fileName: string) => string): typeof import("typescript").createProgram;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.proxyCreateProgram = void 0;
|
|
4
|
-
const decorateProgram_1 = require("./decorateProgram");
|
|
5
4
|
const language_core_1 = require("@volar/language-core");
|
|
6
5
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
6
|
+
const decorateProgram_1 = require("./decorateProgram");
|
|
7
7
|
function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
8
8
|
return new Proxy(original, {
|
|
9
9
|
apply: (target, thisArg, args) => {
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Language, CodeInformation, SourceMap, SourceScript } from '@volar/langu
|
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
3
|
export declare function transformCallHierarchyItem(language: Language, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
4
4
|
export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language, diagnostic: T): T | undefined;
|
|
5
|
-
export declare function
|
|
5
|
+
export declare function fillSourceFileText(language: Language, sourceFile: ts.SourceFile): void;
|
|
6
6
|
export declare function transformFileTextChanges(language: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
|
|
7
7
|
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
8
8
|
export declare function transformSpan(language: Language, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
package/lib/node/transform.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.
|
|
3
|
+
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
6
|
const transformedDiagnostics = new WeakMap();
|
|
7
|
-
const
|
|
7
|
+
const transformedSourceFile = new WeakSet();
|
|
8
8
|
function transformCallHierarchyItem(language, item, filter) {
|
|
9
9
|
const span = transformSpan(language, item.file, item.span, filter);
|
|
10
10
|
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
@@ -31,11 +31,11 @@ function transformDiagnostic(language, diagnostic) {
|
|
|
31
31
|
if (serviceScript) {
|
|
32
32
|
const sourceSpan = transformTextSpan(sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
|
|
33
33
|
if (sourceSpan) {
|
|
34
|
+
fillSourceFileText(language, diagnostic.file);
|
|
34
35
|
transformedDiagnostics.set(diagnostic, {
|
|
35
36
|
...diagnostic,
|
|
36
37
|
start: sourceSpan.start,
|
|
37
38
|
length: sourceSpan.length,
|
|
38
|
-
file: transformSourceFile(diagnostic.file, sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())),
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -50,16 +50,20 @@ function transformDiagnostic(language, diagnostic) {
|
|
|
50
50
|
return transformedDiagnostics.get(diagnostic);
|
|
51
51
|
}
|
|
52
52
|
exports.transformDiagnostic = transformDiagnostic;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
// fix https://github.com/vuejs/language-tools/issues/4099 without `incremental`
|
|
54
|
+
function fillSourceFileText(language, sourceFile) {
|
|
55
|
+
if (transformedSourceFile.has(sourceFile)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
transformedSourceFile.add(sourceFile);
|
|
59
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
60
|
+
if (serviceScript) {
|
|
61
|
+
sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
|
|
62
|
+
+ sourceFile.text.substring(sourceScript.snapshot.getLength());
|
|
59
63
|
}
|
|
60
|
-
return
|
|
64
|
+
return;
|
|
61
65
|
}
|
|
62
|
-
exports.
|
|
66
|
+
exports.fillSourceFileText = fillSourceFileText;
|
|
63
67
|
function transformFileTextChanges(language, changes, filter) {
|
|
64
68
|
const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
|
|
65
69
|
if (source) {
|
|
@@ -62,7 +62,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
62
62
|
}
|
|
63
63
|
});
|
|
64
64
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
65
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost
|
|
65
|
+
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
66
66
|
info.project.markAsDirty();
|
|
67
67
|
initialized = true;
|
|
68
68
|
});
|
|
@@ -33,7 +33,7 @@ function createLanguageServicePlugin(loadLanguagePlugins, getLanguageId) {
|
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
36
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost
|
|
36
|
+
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
37
37
|
}
|
|
38
38
|
return info.languageService;
|
|
39
39
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.2.0-alpha.
|
|
3
|
+
"version": "2.2.0-alpha.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"directory": "packages/typescript"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@volar/language-core": "2.2.0-alpha.
|
|
15
|
+
"@volar/language-core": "2.2.0-alpha.6",
|
|
16
16
|
"path-browserify": "^1.0.1"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "latest",
|
|
20
20
|
"@types/path-browserify": "latest",
|
|
21
|
-
"@volar/language-service": "2.2.0-alpha.
|
|
21
|
+
"@volar/language-service": "2.2.0-alpha.6"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "c9eb6bc56a5bf0c7c1fddfc66d35717daf0a630e"
|
|
24
24
|
}
|