@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.
@@ -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, getLanguageId: (fileName: string) => string): void;
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, getLanguageId) {
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 !== scripts.get(fileName)?.[0]) {
81
- let extension = '.ts';
82
- let snapshotSnapshot;
83
- let scriptKind = ts.ScriptKind.TS;
84
- const snapshot = getScriptSnapshot(fileName);
85
- if (snapshot) {
86
- extraProjectVersion++;
87
- const sourceScript = language.scripts.set(fileName, getLanguageId(fileName), snapshot);
88
- if (sourceScript.generated) {
89
- const text = snapshot.getText(0, snapshot.getLength());
90
- let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
91
- const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
92
- if (serviceScript) {
93
- extension = serviceScript.extension;
94
- scriptKind = serviceScript.scriptKind;
95
- patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
96
- }
97
- snapshotSnapshot = ts.ScriptSnapshot.fromString(patchedText);
98
- if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
99
- console.warn('getExtraScripts() is not available in this use case.');
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
- else if (language.scripts.get(fileName)) {
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 scripts.get(fileName)?.[1];
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
- const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
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
  };
@@ -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): {
@@ -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, getLanguageId);
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, getLanguageId);
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.5",
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.5",
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.5"
21
+ "@volar/language-service": "2.2.0-alpha.7"
22
22
  },
23
- "gitHead": "d28a26415df929b2cc949df276fc27e7961b0925"
23
+ "gitHead": "c6a2483c541437bb770ca114653d21ce61ccf9bc"
24
24
  }