@volar/language-core 1.0.13 → 1.0.16
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/out/documentRegistry.d.ts +2 -2
- package/out/documentRegistry.js +9 -11
- package/out/languageContext.d.ts +1 -1
- package/out/languageContext.js +40 -44
- package/out/types.d.ts +1 -5
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Mapping, SourceMapBase } from '@volar/source-map';
|
|
2
2
|
import { Teleport } from './sourceMaps';
|
|
3
3
|
import type { EmbeddedFile, LanguageModule, SourceFile } from './types';
|
|
4
|
-
export declare function forEachEmbeddeds(
|
|
4
|
+
export declare function forEachEmbeddeds(file: EmbeddedFile, cb: (embedded: EmbeddedFile) => void): void;
|
|
5
5
|
export type DocumentRegistry = ReturnType<typeof createDocumentRegistry>;
|
|
6
6
|
export declare function createDocumentRegistry(): {
|
|
7
7
|
get: (fileName: string) => [SourceFile, LanguageModule] | undefined;
|
|
@@ -15,7 +15,7 @@ export declare function createDocumentRegistry(): {
|
|
|
15
15
|
sourceFile: SourceFile;
|
|
16
16
|
embedded: EmbeddedFile;
|
|
17
17
|
}, void, unknown>;
|
|
18
|
-
fromEmbeddedLocation: (fileName: string, offset: number) => Generator<{
|
|
18
|
+
fromEmbeddedLocation: (fileName: string, offset: number, baseOnRight?: boolean) => Generator<{
|
|
19
19
|
fileName: string;
|
|
20
20
|
offset: number;
|
|
21
21
|
mapping: Mapping<any>;
|
package/out/documentRegistry.js
CHANGED
|
@@ -3,12 +3,10 @@ exports.createDocumentRegistry = exports.forEachEmbeddeds = void 0;
|
|
|
3
3
|
const source_map_1 = require("@volar/source-map");
|
|
4
4
|
const reactivity_1 = require("@vue/reactivity");
|
|
5
5
|
const sourceMaps_1 = require("./sourceMaps");
|
|
6
|
-
function forEachEmbeddeds(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
forEachEmbeddeds(child.embeddeds, cb);
|
|
6
|
+
function forEachEmbeddeds(file, cb) {
|
|
7
|
+
cb(file);
|
|
8
|
+
for (const child of file.embeddeds) {
|
|
9
|
+
forEachEmbeddeds(child, cb);
|
|
12
10
|
}
|
|
13
11
|
}
|
|
14
12
|
exports.forEachEmbeddeds = forEachEmbeddeds;
|
|
@@ -19,7 +17,7 @@ function createDocumentRegistry() {
|
|
|
19
17
|
const embeddedDocumentsMap = (0, reactivity_1.computed)(() => {
|
|
20
18
|
const map = new WeakMap();
|
|
21
19
|
for (const [sourceFile] of all.value) {
|
|
22
|
-
forEachEmbeddeds(sourceFile
|
|
20
|
+
forEachEmbeddeds(sourceFile, embedded => {
|
|
23
21
|
map.set(embedded, sourceFile);
|
|
24
22
|
});
|
|
25
23
|
}
|
|
@@ -28,7 +26,7 @@ function createDocumentRegistry() {
|
|
|
28
26
|
const sourceMapsByFileName = (0, reactivity_1.computed)(() => {
|
|
29
27
|
const map = new Map();
|
|
30
28
|
for (const [sourceFile] of all.value) {
|
|
31
|
-
forEachEmbeddeds(sourceFile
|
|
29
|
+
forEachEmbeddeds(sourceFile, embedded => {
|
|
32
30
|
map.set(normalizePath(embedded.fileName), { sourceFile, embedded });
|
|
33
31
|
});
|
|
34
32
|
}
|
|
@@ -38,7 +36,7 @@ function createDocumentRegistry() {
|
|
|
38
36
|
const map = new Map();
|
|
39
37
|
for (const key in files) {
|
|
40
38
|
const [sourceFile] = files[key];
|
|
41
|
-
forEachEmbeddeds(sourceFile
|
|
39
|
+
forEachEmbeddeds(sourceFile, embedded => {
|
|
42
40
|
if (embedded.teleportMappings) {
|
|
43
41
|
map.set(normalizePath(embedded.fileName), getTeleport(sourceFile, embedded.teleportMappings));
|
|
44
42
|
}
|
|
@@ -61,14 +59,14 @@ function createDocumentRegistry() {
|
|
|
61
59
|
yield sourceMap[1];
|
|
62
60
|
}
|
|
63
61
|
},
|
|
64
|
-
fromEmbeddedLocation: function* (fileName, offset) {
|
|
62
|
+
fromEmbeddedLocation: function* (fileName, offset, baseOnRight = false) {
|
|
65
63
|
if (fileName.endsWith('/__VLS_types.ts')) { // TODO: monkey fix
|
|
66
64
|
return;
|
|
67
65
|
}
|
|
68
66
|
const mapped = sourceMapsByFileName.value.get(normalizePath(fileName));
|
|
69
67
|
if (mapped) {
|
|
70
68
|
const sourceMap = getSourceMap(mapped.sourceFile, mapped.embedded.mappings);
|
|
71
|
-
for (const vueRange of sourceMap.toSourceOffsets(offset)) {
|
|
69
|
+
for (const vueRange of sourceMap.toSourceOffsets(offset, baseOnRight)) {
|
|
72
70
|
yield {
|
|
73
71
|
fileName: mapped.sourceFile.fileName,
|
|
74
72
|
offset: vueRange[0],
|
package/out/languageContext.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export declare function createEmbeddedLanguageServiceHost(host: LanguageServiceH
|
|
|
15
15
|
sourceFile: SourceFile;
|
|
16
16
|
embedded: import("./types").EmbeddedFile;
|
|
17
17
|
}, void, unknown>;
|
|
18
|
-
fromEmbeddedLocation: (fileName: string, offset: number) => Generator<{
|
|
18
|
+
fromEmbeddedLocation: (fileName: string, offset: number, baseOnRight?: boolean) => Generator<{
|
|
19
19
|
fileName: string;
|
|
20
20
|
offset: number;
|
|
21
21
|
mapping: import("@volar/source-map").Mapping<any>;
|
package/out/languageContext.js
CHANGED
|
@@ -21,16 +21,17 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
|
|
|
21
21
|
let tsProjectVersion = 0;
|
|
22
22
|
const documentRegistry = (0, documentRegistry_1.createDocumentRegistry)();
|
|
23
23
|
const ts = host.getTypeScriptModule();
|
|
24
|
-
const tsFileVersions = new Map();
|
|
25
24
|
const scriptSnapshots = new Map();
|
|
26
|
-
const
|
|
25
|
+
const sourceTsFileVersions = new Map();
|
|
26
|
+
const sourceVueFileVersions = new Map();
|
|
27
|
+
const virtualFileVersions = new Map();
|
|
27
28
|
const _tsHost = {
|
|
28
29
|
fileExists: host.fileExists
|
|
29
30
|
? fileName => {
|
|
30
31
|
var _a;
|
|
31
32
|
// .vue.js -> .vue
|
|
32
33
|
// .vue.ts -> .vue
|
|
33
|
-
// .vue.d.ts
|
|
34
|
+
// .vue.d.ts -> [ignored]
|
|
34
35
|
const vueFileName = fileName.substring(0, fileName.lastIndexOf('.'));
|
|
35
36
|
if (!documentRegistry.get(vueFileName)) {
|
|
36
37
|
// create virtual files
|
|
@@ -104,82 +105,80 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
|
|
|
104
105
|
function update() {
|
|
105
106
|
var _a;
|
|
106
107
|
const newProjectVersion = (_a = host.getProjectVersion) === null || _a === void 0 ? void 0 : _a.call(host);
|
|
107
|
-
const
|
|
108
|
+
const shouldUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
|
|
108
109
|
lastProjectVersion = newProjectVersion;
|
|
109
|
-
if (!
|
|
110
|
+
if (!shouldUpdate)
|
|
110
111
|
return;
|
|
111
112
|
let tsFileUpdated = false;
|
|
112
|
-
const
|
|
113
|
-
const
|
|
113
|
+
const checkRemains = new Set(host.getScriptFileNames());
|
|
114
|
+
const sourceFilesShouldUpdate = [];
|
|
114
115
|
// .vue
|
|
115
116
|
for (const [sourceFile, languageModule] of documentRegistry.getAll()) {
|
|
116
|
-
|
|
117
|
+
checkRemains.delete(sourceFile.fileName);
|
|
118
|
+
const snapshot = host.getScriptSnapshot(sourceFile.fileName);
|
|
119
|
+
if (!snapshot) {
|
|
120
|
+
// delete
|
|
121
|
+
documentRegistry.delete(sourceFile.fileName);
|
|
122
|
+
tsFileUpdated = true;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
117
125
|
const newVersion = host.getScriptVersion(sourceFile.fileName);
|
|
118
|
-
if (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
// update
|
|
123
|
-
sourceFilesToUpdate.push([sourceFile, languageModule, snapshot]);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
// delete
|
|
127
|
-
if (documentRegistry.delete(sourceFile.fileName)) {
|
|
128
|
-
tsFileUpdated = true;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
126
|
+
if (sourceVueFileVersions.get(sourceFile.fileName) !== newVersion) {
|
|
127
|
+
// update
|
|
128
|
+
sourceVueFileVersions.set(sourceFile.fileName, newVersion);
|
|
129
|
+
sourceFilesShouldUpdate.push([sourceFile, languageModule, snapshot]);
|
|
131
130
|
}
|
|
132
131
|
}
|
|
133
132
|
// no any vue file version change, it mean project version was update by ts file change at this time
|
|
134
|
-
if (!
|
|
133
|
+
if (!sourceFilesShouldUpdate.length) {
|
|
135
134
|
tsFileUpdated = true;
|
|
136
135
|
}
|
|
137
136
|
// add
|
|
138
|
-
for (const fileName of [...
|
|
137
|
+
for (const fileName of [...checkRemains]) {
|
|
139
138
|
const snapshot = host.getScriptSnapshot(fileName);
|
|
140
139
|
if (snapshot) {
|
|
141
140
|
for (const languageModule of languageModules) {
|
|
142
141
|
const sourceFile = languageModule.createSourceFile(fileName, snapshot);
|
|
143
142
|
if (sourceFile) {
|
|
144
|
-
|
|
143
|
+
sourceVueFileVersions.set(sourceFile.fileName, host.getScriptVersion(fileName));
|
|
145
144
|
documentRegistry.set(fileName, (0, reactivity_1.shallowReactive)(sourceFile), languageModule);
|
|
146
|
-
|
|
145
|
+
checkRemains.delete(fileName);
|
|
147
146
|
break;
|
|
148
147
|
}
|
|
149
148
|
}
|
|
150
149
|
}
|
|
151
150
|
}
|
|
152
151
|
// .ts / .js / .d.ts / .json ...
|
|
153
|
-
for (const [oldTsFileName, oldTsFileVersion] of [...
|
|
152
|
+
for (const [oldTsFileName, oldTsFileVersion] of [...sourceTsFileVersions]) {
|
|
154
153
|
const newVersion = host.getScriptVersion(oldTsFileName);
|
|
155
154
|
if (oldTsFileVersion !== newVersion) {
|
|
156
|
-
if (!
|
|
155
|
+
if (!checkRemains.has(oldTsFileName) && !host.getScriptSnapshot(oldTsFileName)) {
|
|
157
156
|
// delete
|
|
158
|
-
|
|
157
|
+
sourceTsFileVersions.delete(oldTsFileName);
|
|
159
158
|
}
|
|
160
159
|
else {
|
|
161
160
|
// update
|
|
162
|
-
|
|
161
|
+
sourceTsFileVersions.set(oldTsFileName, newVersion);
|
|
163
162
|
}
|
|
164
163
|
tsFileUpdated = true;
|
|
165
164
|
}
|
|
166
165
|
}
|
|
167
|
-
for (const nowFileName of
|
|
168
|
-
if (!
|
|
166
|
+
for (const nowFileName of checkRemains) {
|
|
167
|
+
if (!sourceTsFileVersions.has(nowFileName)) {
|
|
169
168
|
// add
|
|
170
169
|
const newVersion = host.getScriptVersion(nowFileName);
|
|
171
|
-
|
|
170
|
+
sourceTsFileVersions.set(nowFileName, newVersion);
|
|
172
171
|
tsFileUpdated = true;
|
|
173
172
|
}
|
|
174
173
|
}
|
|
175
|
-
for (const [sourceFile, languageModule, snapshot] of
|
|
176
|
-
(0, documentRegistry_1.forEachEmbeddeds)(sourceFile
|
|
177
|
-
|
|
174
|
+
for (const [sourceFile, languageModule, snapshot] of sourceFilesShouldUpdate) {
|
|
175
|
+
(0, documentRegistry_1.forEachEmbeddeds)(sourceFile, embedded => {
|
|
176
|
+
virtualFileVersions.delete(embedded.fileName);
|
|
178
177
|
});
|
|
179
178
|
const oldScripts = {};
|
|
180
179
|
const newScripts = {};
|
|
181
180
|
if (!tsFileUpdated) {
|
|
182
|
-
(0, documentRegistry_1.forEachEmbeddeds)(sourceFile
|
|
181
|
+
(0, documentRegistry_1.forEachEmbeddeds)(sourceFile, embedded => {
|
|
183
182
|
if (embedded.kind) {
|
|
184
183
|
oldScripts[embedded.fileName] = embedded.text;
|
|
185
184
|
}
|
|
@@ -188,7 +187,7 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
|
|
|
188
187
|
languageModule.updateSourceFile(sourceFile, snapshot);
|
|
189
188
|
documentRegistry.onSourceFileUpdated(sourceFile);
|
|
190
189
|
if (!tsFileUpdated) {
|
|
191
|
-
(0, documentRegistry_1.forEachEmbeddeds)(sourceFile
|
|
190
|
+
(0, documentRegistry_1.forEachEmbeddeds)(sourceFile, embedded => {
|
|
192
191
|
if (embedded.kind) {
|
|
193
192
|
newScripts[embedded.fileName] = embedded.text;
|
|
194
193
|
}
|
|
@@ -212,10 +211,7 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
|
|
|
212
211
|
}
|
|
213
212
|
}
|
|
214
213
|
for (const fileName of host.getScriptFileNames()) {
|
|
215
|
-
if (
|
|
216
|
-
tsFileNames.add(fileName); // .vue + .ts
|
|
217
|
-
}
|
|
218
|
-
else if (!documentRegistry.has(fileName)) {
|
|
214
|
+
if (!documentRegistry.has(fileName)) {
|
|
219
215
|
tsFileNames.add(fileName); // .ts
|
|
220
216
|
}
|
|
221
217
|
}
|
|
@@ -225,8 +221,8 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
|
|
|
225
221
|
var _a, _b, _c;
|
|
226
222
|
let mapped = documentRegistry.fromEmbeddedFileName(fileName);
|
|
227
223
|
if (mapped) {
|
|
228
|
-
if (
|
|
229
|
-
return
|
|
224
|
+
if (virtualFileVersions.has(mapped.embedded.fileName)) {
|
|
225
|
+
return virtualFileVersions.get(mapped.embedded.fileName);
|
|
230
226
|
}
|
|
231
227
|
else {
|
|
232
228
|
let version = (_c = (_b = (_a = ts.sys) === null || _a === void 0 ? void 0 : _a.createHash) === null || _b === void 0 ? void 0 : _b.call(_a, mapped.embedded.text)) !== null && _c !== void 0 ? _c : mapped.embedded.text;
|
|
@@ -234,7 +230,7 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
|
|
|
234
230
|
// fix https://github.com/johnsoncodehk/volar/issues/1082
|
|
235
231
|
version = host.getScriptVersion(mapped.sourceFile.fileName) + ':' + version;
|
|
236
232
|
}
|
|
237
|
-
|
|
233
|
+
virtualFileVersions.set(mapped.embedded.fileName, version);
|
|
238
234
|
return version;
|
|
239
235
|
}
|
|
240
236
|
}
|
package/out/types.d.ts
CHANGED
|
@@ -40,10 +40,7 @@ export interface TextRange {
|
|
|
40
40
|
start: number;
|
|
41
41
|
end: number;
|
|
42
42
|
}
|
|
43
|
-
export interface SourceFile {
|
|
44
|
-
fileName: string;
|
|
45
|
-
text: string;
|
|
46
|
-
embeddeds: EmbeddedFile[];
|
|
43
|
+
export interface SourceFile extends EmbeddedFile {
|
|
47
44
|
}
|
|
48
45
|
export declare enum EmbeddedFileKind {
|
|
49
46
|
TextFile = 0,
|
|
@@ -65,6 +62,5 @@ export interface LanguageModule<T extends SourceFile = SourceFile> {
|
|
|
65
62
|
}
|
|
66
63
|
export type LanguageServiceHost = ts.LanguageServiceHost & {
|
|
67
64
|
getTypeScriptModule(): typeof import('typescript/lib/tsserverlibrary');
|
|
68
|
-
isTsPlugin?: boolean;
|
|
69
65
|
isTsc?: boolean;
|
|
70
66
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/language-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"main": "out/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
"directory": "packages/language-core"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@volar/source-map": "1.0.
|
|
16
|
+
"@volar/source-map": "1.0.16",
|
|
17
17
|
"@vue/reactivity": "^3.2.45",
|
|
18
18
|
"muggle-string": "^0.1.0"
|
|
19
19
|
},
|
|
20
|
-
"gitHead": "
|
|
20
|
+
"gitHead": "af476047d8859652254ed36f8aee184f1972a97a"
|
|
21
21
|
}
|