@volar/typescript 2.2.0-alpha.5 → 2.2.0-alpha.7
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 +24 -44
- package/lib/node/decorateProgram.js +2 -6
- package/lib/node/transform.d.ts +1 -0
- package/lib/node/transform.js +17 -1
- 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,32 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
|
|
|
77
70
|
}
|
|
78
71
|
function updateVirtualScript(fileName) {
|
|
79
72
|
const version = languageServiceHost.getScriptVersion(fileName);
|
|
80
|
-
if (version
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
73
|
+
if (version === undefined) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let script = scripts.get(fileName);
|
|
77
|
+
if (!script || script[0] !== version) {
|
|
78
|
+
script = [version];
|
|
79
|
+
const sourceScript = language.scripts.get(fileName);
|
|
80
|
+
if (sourceScript?.generated) {
|
|
81
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
82
|
+
if (serviceScript) {
|
|
83
|
+
const sourceContents = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength());
|
|
84
|
+
let virtualContents = sourceContents.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
85
|
+
virtualContents += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
|
|
86
|
+
script[1] = {
|
|
87
|
+
extension: serviceScript.extension,
|
|
88
|
+
kind: serviceScript.scriptKind,
|
|
89
|
+
snapshot: ts.ScriptSnapshot.fromString(virtualContents),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
|
|
93
|
+
console.warn('getExtraServiceScripts() is not available in TS plugin.');
|
|
101
94
|
}
|
|
102
95
|
}
|
|
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
|
-
}
|
|
96
|
+
scripts.set(fileName, script);
|
|
117
97
|
}
|
|
118
|
-
return
|
|
98
|
+
return script[1];
|
|
119
99
|
}
|
|
120
100
|
}
|
|
121
101
|
exports.decorateLanguageServiceHost = decorateLanguageServiceHost;
|
|
@@ -43,15 +43,11 @@ function decorateProgram(language, program) {
|
|
|
43
43
|
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
44
44
|
.filter(utils_1.notEmpty);
|
|
45
45
|
};
|
|
46
|
-
// fix https://github.com/vuejs/language-tools/issues/4099
|
|
46
|
+
// fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
|
|
47
47
|
program.getSourceFileByPath = path => {
|
|
48
48
|
const sourceFile = getSourceFileByPath(path);
|
|
49
49
|
if (sourceFile) {
|
|
50
|
-
|
|
51
|
-
if (serviceScript) {
|
|
52
|
-
sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
|
|
53
|
-
+ sourceFile.text.substring(sourceScript.snapshot.getLength());
|
|
54
|
-
}
|
|
50
|
+
(0, transform_1.fillSourceFileText)(language, sourceFile);
|
|
55
51
|
}
|
|
56
52
|
return sourceFile;
|
|
57
53
|
};
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -2,6 +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 fillSourceFileText(language: Language, sourceFile: ts.SourceFile): void;
|
|
5
6
|
export declare function transformFileTextChanges(language: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
|
|
6
7
|
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
7
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,9 +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.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
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 transformedSourceFile = new WeakSet();
|
|
7
8
|
function transformCallHierarchyItem(language, item, filter) {
|
|
8
9
|
const span = transformSpan(language, item.file, item.span, filter);
|
|
9
10
|
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
@@ -30,6 +31,7 @@ function transformDiagnostic(language, diagnostic) {
|
|
|
30
31
|
if (serviceScript) {
|
|
31
32
|
const sourceSpan = transformTextSpan(sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
|
|
32
33
|
if (sourceSpan) {
|
|
34
|
+
fillSourceFileText(language, diagnostic.file);
|
|
33
35
|
transformedDiagnostics.set(diagnostic, {
|
|
34
36
|
...diagnostic,
|
|
35
37
|
start: sourceSpan.start,
|
|
@@ -48,6 +50,20 @@ function transformDiagnostic(language, diagnostic) {
|
|
|
48
50
|
return transformedDiagnostics.get(diagnostic);
|
|
49
51
|
}
|
|
50
52
|
exports.transformDiagnostic = transformDiagnostic;
|
|
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());
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
exports.fillSourceFileText = fillSourceFileText;
|
|
51
67
|
function transformFileTextChanges(language, changes, filter) {
|
|
52
68
|
const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
|
|
53
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.7",
|
|
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.7",
|
|
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.7"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "c6a2483c541437bb770ca114653d21ce61ccf9bc"
|
|
24
24
|
}
|