diff --git a/extensions/vscode-vue-language-features/src/browserClientMain.ts b/extensions/vscode-vue-language-features/src/browserClientMain.ts index 6db3e090e..543375d3a 100644 --- a/extensions/vscode-vue-language-features/src/browserClientMain.ts +++ b/extensions/vscode-vue-language-features/src/browserClientMain.ts @@ -29,7 +29,7 @@ export function activate(context: vscode.ExtensionContext) { await client.start(); return client; - }); + }, 'browser'); } export function deactivate(): Thenable | undefined { diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index 24bf7b0b1..6a94152f2 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -19,7 +19,7 @@ import * as doctor from './features/doctor'; import * as fileReferences from './features/fileReferences'; import * as reloadProject from './features/reloadProject'; -let apiClient: lsp.BaseLanguageClient; +let apiClient: lsp.BaseLanguageClient | undefined; let docClient: lsp.BaseLanguageClient | undefined; let htmlClient: lsp.BaseLanguageClient; @@ -31,7 +31,7 @@ type CreateLanguageClient = ( port: number, ) => Promise; -export async function activate(context: vscode.ExtensionContext, createLc: CreateLanguageClient) { +export async function activate(context: vscode.ExtensionContext, createLc: CreateLanguageClient, env: 'node' | 'browser') { const stopCheck = vscode.window.onDidChangeActiveTextEditor(tryActivate); tryActivate(); @@ -40,26 +40,26 @@ export async function activate(context: vscode.ExtensionContext, createLc: Creat if (!vscode.window.activeTextEditor) { // onWebviewPanel:preview - doActivate(context, createLc); + doActivate(context, createLc, env); stopCheck.dispose(); return; } const currentlangId = vscode.window.activeTextEditor.document.languageId; if (currentlangId === 'vue' || currentlangId === 'markdown' || currentlangId === 'html') { - doActivate(context, createLc); + doActivate(context, createLc, env); stopCheck.dispose(); } const takeOverMode = takeOverModeEnabled(); if (takeOverMode && ['javascript', 'typescript', 'javascriptreact', 'typescriptreact'].includes(currentlangId)) { - doActivate(context, createLc); + doActivate(context, createLc, env); stopCheck.dispose(); } } } -async function doActivate(context: vscode.ExtensionContext, createLc: CreateLanguageClient) { +async function doActivate(context: vscode.ExtensionContext, createLc: CreateLanguageClient, env: 'node' | 'browser') { vscode.commands.executeCommand('setContext', 'volar.activated', true); @@ -97,14 +97,14 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang const _serverMaxOldSpaceSize = serverMaxOldSpaceSize(); [apiClient, docClient, htmlClient] = await Promise.all([ - createLc( + env === 'node' ? createLc( 'volar-language-features', 'Volar - Language Features Server', languageFeaturesDocumentSelector, getInitializationOptions(context, 'main-language-features', _useSecondServer), 6009, - ), - _useSecondServer ? createLc( + ) : undefined, + env === 'node' && _useSecondServer ? createLc( 'volar-language-features-2', 'Volar - Second Language Features Server', languageFeaturesDocumentSelector, @@ -130,16 +130,19 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang splitEditors.register(context); preview.register(context); createWorkspaceSnippets.register(context); - callGraph.register(context, apiClient); - verifyAll.register(context, docClient ?? apiClient); - autoInsertion.register(context, htmlClient, apiClient); doctor.register(context); - virtualFiles.register('volar.action.writeVirtualFiles', context, docClient ?? apiClient); tsVersion.register('volar.selectTypeScriptVersion', context, [apiClient, docClient].filter(shared.notEmpty)); - tsconfig.register('volar.openTsconfig', context, docClient ?? apiClient); - fileReferences.register('volar.vue.findAllFileReferences', apiClient); reloadProject.register('volar.action.reloadProject', context, [apiClient, docClient].filter(shared.notEmpty)); + if (apiClient) { + tsconfig.register('volar.openTsconfig', context, docClient ?? apiClient); + fileReferences.register('volar.vue.findAllFileReferences', apiClient); + callGraph.register(context, apiClient); + verifyAll.register(context, docClient ?? apiClient); + autoInsertion.register(context, htmlClient, apiClient); + virtualFiles.register('volar.action.writeVirtualFiles', context, docClient ?? apiClient); + } + async function requestReloadVscode() { const reload = await vscode.window.showInformationMessage( 'Please reload VSCode to restart language servers.', @@ -183,13 +186,16 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang } (async () => { - const getTagNameCase = await tagNameCase.activate(context, apiClient); - const getAttrNameCase = await attrNameCase.activate(context, apiClient); + if (apiClient) { + + const getTagNameCase = await tagNameCase.activate(context, apiClient); + const getAttrNameCase = await attrNameCase.activate(context, apiClient); - apiClient.onRequest(shared.GetDocumentNameCasesRequest.type, async handler => ({ - tagNameCase: getTagNameCase(handler.uri), - attrNameCase: getAttrNameCase(handler.uri), - })); + apiClient.onRequest(shared.GetDocumentNameCasesRequest.type, async handler => ({ + tagNameCase: getTagNameCase(handler.uri), + attrNameCase: getAttrNameCase(handler.uri), + })); + } })(); } } diff --git a/extensions/vscode-vue-language-features/src/nodeClientMain.ts b/extensions/vscode-vue-language-features/src/nodeClientMain.ts index 5d2b6f94d..e6c906bdf 100644 --- a/extensions/vscode-vue-language-features/src/nodeClientMain.ts +++ b/extensions/vscode-vue-language-features/src/nodeClientMain.ts @@ -68,7 +68,7 @@ export function activate(context: vscode.ExtensionContext) { await client.start(); return client; - }); + }, 'node'); } export function deactivate(): Thenable | undefined { diff --git a/packages/vue-language-service/src/utils/sharedLs.ts b/packages/vue-language-service/src/utils/sharedLs.ts index 29ffda504..1cd01ddc3 100644 --- a/packages/vue-language-service/src/utils/sharedLs.ts +++ b/packages/vue-language-service/src/utils/sharedLs.ts @@ -15,8 +15,8 @@ export function getDummyTsLs( ): ts2.LanguageService { if (!dummyTsLs) { const host: ts.LanguageServiceHost = { - readFile: ts.sys.readFile, - fileExists: ts.sys.fileExists, + readFile: () => undefined, + fileExists: fileName => shared.fsPathToUri(fileName) === shared.normalizeUri(doc.uri), getProjectVersion: () => dummyProjectVersion.toString(), getScriptVersion: () => dummyProjectVersion.toString(), getCompilationSettings: () => ({ allowJs: true, jsx: ts.JsxEmit.Preserve }),