From d4b32f76b8bd885ad0279e04ae9790fe8dff77db Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Mon, 11 Jul 2022 11:22:52 +0800 Subject: [PATCH] fix: disable document features in html if `vscode.html-language-features` active close #1552, close #1530 --- .../vscode-alpine-language-features/src/common.ts | 11 ++++++++--- extensions/vscode-vue-language-features/src/common.ts | 5 +++++ packages/shared/src/types.ts | 1 + packages/vue-language-server/src/common.ts | 2 +- .../src/features/documentFeatures.ts | 3 ++- packages/vue-language-service/src/documentService.ts | 7 ------- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/extensions/vscode-alpine-language-features/src/common.ts b/extensions/vscode-alpine-language-features/src/common.ts index 6ec69a849..01bc32456 100644 --- a/extensions/vscode-alpine-language-features/src/common.ts +++ b/extensions/vscode-alpine-language-features/src/common.ts @@ -10,7 +10,7 @@ import * as fileReferences from '../../vscode-vue-language-features/out/features let apiClient: lsp.BaseLanguageClient; let docClient: lsp.BaseLanguageClient | undefined; -let htmlClient: lsp.BaseLanguageClient; +let htmlClient: lsp.BaseLanguageClient | undefined; type CreateLanguageClient = ( id: string, @@ -85,13 +85,13 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang getInitializationOptions(context, 'second-language-features', _useSecondServer), 6110, ) : undefined, - createLc( + enabledDocumentFeaturesInHtml() ? createLc( 'volar-alpine-document-features', 'Volar-Alpine - Document Features Server', documentFeaturesDocumentSelector, getInitializationOptions(context, 'document-features', _useSecondServer), 6111, - ), + ) : undefined, ]); const clients = [apiClient, docClient, htmlClient].filter(shared.notEmpty); @@ -160,6 +160,10 @@ export function takeOverModeEnabled() { return vscode.workspace.getConfiguration('volar').get('alpine.takeOverMode.enabled'); } +function enabledDocumentFeaturesInHtml() { + return !vscode.extensions.getExtension('vscode.html-language-features'); +} + function useSecondServer() { return !!vscode.workspace.getConfiguration('volar').get('alpineserver.useSecondServer'); } @@ -212,6 +216,7 @@ function getInitializationOptions( } : {}), } : undefined, documentFeatures: mode === 'document-features' ? { + allowedLanguageIds: ['html'], selectionRange: true, foldingRange: true, linkedEditingRange: true, diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index 2ef722151..d838a9e25 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -210,6 +210,10 @@ export function takeOverModeEnabled() { return status; } +function enabledDocumentFeaturesInHtml() { + return !vscode.extensions.getExtension('vscode.html-language-features'); +} + function useSecondServer() { return !!vscode.workspace.getConfiguration('volar').get('vueserver.useSecondServer'); } @@ -257,6 +261,7 @@ function getInitializationOptions( } : {}), } : undefined, documentFeatures: mode === 'document-features' ? { + allowedLanguageIds: ['vue', enabledDocumentFeaturesInHtml() ? 'html' : undefined].filter(shared.notEmpty), selectionRange: true, foldingRange: true, linkedEditingRange: true, diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index ce030a699..5bbc9dc5b 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -75,6 +75,7 @@ export interface ServerInitializationOptions { * html language service will be create in server if this option is not null */ documentFeatures?: { + allowedLanguageIds?: string[]; selectionRange?: boolean; foldingRange?: boolean; linkedEditingRange?: boolean; diff --git a/packages/vue-language-server/src/common.ts b/packages/vue-language-server/src/common.ts index 0001456bb..9cf33534f 100644 --- a/packages/vue-language-server/src/common.ts +++ b/packages/vue-language-server/src/common.ts @@ -74,7 +74,7 @@ export function createLanguageServer( loadCustomPlugins(folders[0]), ); - (await import('./features/documentFeatures')).register(connection, documents, documentService); + (await import('./features/documentFeatures')).register(connection, documents, documentService, options.documentFeatures.allowedLanguageIds); (await import('./registers/registerDocumentFeatures')).register(options.documentFeatures, result.capabilities); } diff --git a/packages/vue-language-server/src/features/documentFeatures.ts b/packages/vue-language-server/src/features/documentFeatures.ts index 13e26b992..8fdb9c075 100644 --- a/packages/vue-language-server/src/features/documentFeatures.ts +++ b/packages/vue-language-server/src/features/documentFeatures.ts @@ -7,6 +7,7 @@ export function register( connection: vscode.Connection, documents: vscode.TextDocuments, vueDs: vue.DocumentService, + allowedLanguageIds: string[] = ['vue'], ) { connection.onDocumentFormatting(handler => { return worker(handler.textDocument.uri, document => { @@ -61,7 +62,7 @@ export function register( function worker(uri: string, cb: (document: TextDocument) => T) { const document = documents.get(uri); - if (document) { + if (document && allowedLanguageIds.includes(document.languageId)) { return cb(document); } } diff --git a/packages/vue-language-service/src/documentService.ts b/packages/vue-language-service/src/documentService.ts index 6541ed10f..427245593 100644 --- a/packages/vue-language-service/src/documentService.ts +++ b/packages/vue-language-service/src/documentService.ts @@ -116,13 +116,6 @@ export function getDocumentService( function getVueDocument(document: TextDocument) { - if ( - document.languageId !== 'vue' - && document.languageId !== 'markdown' - && document.languageId !== 'html' - ) - return; - let vueDoc = vueDocuments.get(document); if (vueDoc) {