Skip to content

Commit bc3e103

Browse files
committed
refactor: decoupling
1 parent 20db283 commit bc3e103

File tree

34 files changed

+920
-797
lines changed

34 files changed

+920
-797
lines changed

packages/shared/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export * from './path';
22
export * from './requests';
33
export * from './types';
44
export * from './uriMap';
5+
export * from './ts';
56

67
import * as path from 'upath';
78
import * as fs from 'fs';

packages/shared/src/ts.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type * as ts from 'typescript';
2+
3+
export function createTsLanguageService(
4+
ts: typeof import('typescript/lib/tsserverlibrary'),
5+
ShPlugin: typeof import('typescript-vscode-sh-plugin'),
6+
_host: ts.LanguageServiceHost,
7+
) {
8+
// @ts-ignore
9+
const importSuggestionsCache = ts.Completions?.createImportSuggestionsForFileCache?.();
10+
const host = {
11+
..._host,
12+
// @ts-ignore
13+
// TODO: crash on 'addListener' from 'node:process', reuse because TS has same problem
14+
getImportSuggestionsCache: () => importSuggestionsCache,
15+
};
16+
const shPlugin = ShPlugin({ typescript: ts });
17+
let languageService = ts.createLanguageService(host);
18+
languageService = shPlugin.decorate(languageService);
19+
return languageService;
20+
}

packages/typescript-vue-plugin/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
},
1818
"dependencies": {
1919
"@volar/shared": "^0.26.5",
20+
"typescript-vscode-sh-plugin": "^0.6.14",
2021
"vscode-vue-languageservice": "^0.26.5"
2122
}
2223
}

packages/typescript-vue-plugin/src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as vue from 'vscode-vue-languageservice'
22
import * as shared from '@volar/shared';
33
import * as path from 'upath';
4+
import * as ShPlugin from 'typescript-vscode-sh-plugin';
45

56
const init: ts.server.PluginModuleFactory = (modules) => {
67
const { typescript: ts } = modules;
@@ -54,7 +55,10 @@ function createProxyHost(ts: typeof import('typescript/lib/tsserverlibrary'), in
5455
const fileWatchers = new Map<string, ts.FileWatcher>();
5556
const scriptVersions = new Map<string, number>();
5657
const scriptSnapshots = new Map<string, [string, ts.IScriptSnapshot]>();
57-
const host: ts.LanguageServiceHost = {
58+
const host: vue.LanguageServiceHost = {
59+
createTsLanguageService(host) {
60+
return shared.createTsLanguageService(ts, ShPlugin, host)
61+
},
5862
getNewLine: () => ts.sys.newLine,
5963
useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,
6064
readFile: ts.sys.readFile,

packages/vscode-pug-languageservice/src/pugDocument.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as shared from '@volar/shared';
22
import * as SourceMap from '@volar/source-map';
33
import * as path from 'upath';
4-
import * as html from 'vscode-html-languageservice';
4+
import type * as html from 'vscode-html-languageservice';
55
import { TextDocument } from 'vscode-languageserver-textdocument';
66
import { createCodeGen } from '@volar/code-gen';
77

packages/vscode-pug-languageservice/src/services/scanner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import * as html from 'vscode-html-languageservice';
1+
import type * as html from 'vscode-html-languageservice';
22
import type { PugDocument } from '../pugDocument';
33

44
export function register(htmlLs: html.LanguageService) {

packages/vscode-server/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@starptech/prettyhtml": "^0.10.0",
2020
"prettier": "^1.16.4",
2121
"pug-beautify": "^0.1.1",
22+
"typescript-vscode-sh-plugin": "^0.6.14",
2223
"upath": "^2.0.1",
2324
"vscode-languageserver": "^8.0.0-next.1",
2425
"vscode-languageserver-textdocument": "^1.0.1",

packages/vscode-server/src/features/customFeatures.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { TextDocument } from 'vscode-languageserver-textdocument';
55
import * as vscode from 'vscode-languageserver';
66
import * as vue from 'vscode-vue-languageservice';
77
import type { ServicesManager } from '../servicesManager';
8+
import * as ts2 from 'vscode-typescript-languageservice';
89

910
export function register(
1011
connection: vscode.Connection,
@@ -112,7 +113,7 @@ export function register(
112113
.getMatchService(handler.textDocument.uri)
113114
?.getSemanticTokens(handler.textDocument.uri, handler.range);
114115
});
115-
connection.onRequest(shared.SemanticTokenLegendRequest.type, () => vue.semanticTokenLegend);
116+
connection.onRequest(shared.SemanticTokenLegendRequest.type, () => vue.getSemanticTokenLegend(ts2));
116117
connection.onRequest(shared.GetServerNameCasesRequest.type, handler => {
117118
return servicesManager.getMatchService(handler.uri)?.__internal__.detectTagNameCase(handler.uri);
118119
});

packages/vscode-server/src/serviceHandler.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import type * as vscode from 'vscode-languageserver';
77
import { getEmmetConfiguration } from './configs';
88
import { getSchemaRequestService } from './schemaRequestService';
99
import * as tsConfigs from './tsConfigs';
10+
import * as ShPlugin from 'typescript-vscode-sh-plugin';
1011

1112
export type ServiceHandler = ReturnType<typeof createServiceHandler>;
1213

1314
export function createServiceHandler(
15+
ts: vue.Modules['typescript'],
1416
mode: 'api' | 'doc',
1517
tsConfig: string,
16-
ts: typeof import('typescript/lib/tsserverlibrary'),
1718
tsLocalized: ts.MapLike<string> | undefined,
1819
documents: vscode.TextDocuments<TextDocument>,
1920
fileUpdatedCb: (fileName: string) => any,
@@ -176,6 +177,9 @@ export function createServiceHandler(
176177

177178
const host: vue.LanguageServiceHost = {
178179
// vue
180+
createTsLanguageService(host) {
181+
return shared.createTsLanguageService(ts, ShPlugin, host);
182+
},
179183
getEmmetConfig: getEmmetConfiguration,
180184
schemaRequestService: getSchemaRequestService(connection),
181185
getPreferences: (document) => tsConfigs.getPreferences(connection, document),

packages/vscode-server/src/servicesManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@ export function createServicesManager(
184184
const tsLocalized = _ts.localized;
185185
if (ts.sys.fileExists(tsConfig)) {
186186
services.set(tsConfig, createServiceHandler(
187+
ts,
187188
mode,
188189
tsConfig,
189-
ts,
190190
tsLocalized,
191191
documents,
192192
updateAllOpenedDocumentsDiagnostics,
@@ -248,7 +248,7 @@ export function createServicesManager(
248248
const hasVueFile = parsedCommandLine.fileNames.some(fileName => upath.extname(fileName) === '.vue');
249249
if (!hasVueFile) continue;
250250
const fileNames = new Set(parsedCommandLine.fileNames);
251-
if (fileNames.has(fileName) || kvp[1].getLanguageServiceDontCreate()?.__internal__.getTsLs('script').__internal__.getTextDocument(uri)) {
251+
if (fileNames.has(fileName) || kvp[1].getLanguageServiceDontCreate()?.__internal__.context.scriptTsLs.__internal__.getTextDocument(uri)) {
252252
const tsConfigDir = upath.dirname(tsConfig);
253253
if (!upath.relative(tsConfigDir, fileName).startsWith('..')) { // is file under tsconfig.json folder
254254
firstMatchTsConfigs.push(tsConfig);

packages/vscode-typescript-languageservice/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
},
1818
"dependencies": {
1919
"@volar/shared": "^0.26.5",
20-
"typescript-vscode-sh-plugin": "^0.6.14",
2120
"upath": "^2.0.1",
2221
"vscode-languageserver": "^8.0.0-next.1",
2322
"vscode-languageserver-textdocument": "^1.0.1"

packages/vscode-typescript-languageservice/src/index.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as vscode from 'vscode-languageserver';
2-
import * as ShPlugin from 'typescript-vscode-sh-plugin';
32
import * as completions from './services/completion';
43
import * as completions2 from './services/completion2';
54
import * as completionResolve from './services/completionResolve';
@@ -34,20 +33,9 @@ export type LanguageServiceHost = ts.LanguageServiceHost & {
3433
getPreferences?(document: TextDocument): Promise<ts.UserPreferences>;
3534
};
3635

37-
export function createLanguageService(ts: typeof import('typescript/lib/tsserverlibrary'), _host: LanguageServiceHost) {
36+
export function createLanguageService(ts: typeof import('typescript/lib/tsserverlibrary'), host: LanguageServiceHost, languageService: ts.LanguageService) {
3837

39-
// @ts-ignore
40-
const importSuggestionsCache = ts.Completions?.createImportSuggestionsForFileCache?.();
41-
const host = {
42-
..._host,
43-
// @ts-ignore
44-
// TODO: crash on 'addListener' from 'node:process', reuse because TS has same problem
45-
getImportSuggestionsCache: () => importSuggestionsCache,
46-
};
4738
const documents = new Map<string, [string, TextDocument]>();
48-
const shPlugin = ShPlugin({ typescript: ts });
49-
let languageService = ts.createLanguageService(host);
50-
languageService = shPlugin.decorate(languageService);
5139

5240
return {
5341
findDefinition: definitions.register(languageService, getValidTextDocument),
@@ -76,8 +64,8 @@ export function createLanguageService(ts: typeof import('typescript/lib/tsserver
7664
dispose,
7765

7866
__internal__: {
79-
raw: languageService,
8067
host,
68+
raw: languageService,
8169
getTextDocument,
8270
getValidTextDocument,
8371
doCompleteSync: completions.register(languageService, getValidTextDocument, host),

packages/vscode-vue-languageservice/src/commands/unuseRefSugar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function register(
3434
}
3535

3636
async function getUnRefSugarEdits(
37-
{ sourceFiles, ts, scriptTsLs }: ApiLanguageServiceContext,
37+
{ modules: { typescript: ts }, sourceFiles, scriptTsLs }: ApiLanguageServiceContext,
3838
uri: string,
3939
_findReferences: (uri: string, position: vscode.Position) => vscode.Location[],
4040
progress?: vscode.WorkDoneProgressServerReporter,
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
export { semanticTokenLegend } from './services/semanticTokens';
1+
export { getSemanticTokenLegend } from './services/semanticTokens';
22
export { triggerCharacter } from './services/completion';
33
export { margeWorkspaceEdits } from './services/rename';
44
export { options as codeLensOptions } from './services/codeLens';
55
export * from './utils/sourceMaps';
66
export * from './commands';
77
export * from './languageService';
88
export * from './sourceFile';
9+
export * from './types';

0 commit comments

Comments
 (0)