From 49acaa499f1f3d3c2caccd666c20b8d8a1a85ce0 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Mon, 26 Dec 2022 02:35:06 +0800 Subject: [PATCH] feat: provide extra semanticTokensLegend by language client close #2252 --- .../vscode-vue-language-features/package.json | 26 +++++++++ .../src/common.ts | 4 ++ .../src/common/features/languageFeatures.ts | 2 +- packages/language-server/src/common/server.ts | 55 ++++++++++++++++++- .../src/common/utils/registerFeatures.ts | 42 +------------- packages/language-server/src/types.ts | 4 ++ .../src/plugins/vue-template.ts | 6 +- 7 files changed, 94 insertions(+), 45 deletions(-) diff --git a/extensions/vscode-vue-language-features/package.json b/extensions/vscode-vue-language-features/package.json index a8897d004..f41803baf 100644 --- a/extensions/vscode-vue-language-features/package.json +++ b/extensions/vscode-vue-language-features/package.json @@ -118,6 +118,32 @@ "url": "./dist/schemas/vue-tsconfig.schema.json" } ], + "semanticTokenScopes": [ + { + "language": "vue", + "scopes": { + "component": [ + "support.class.component.vue" + ] + } + }, + { + "language": "markdown", + "scopes": { + "component": [ + "support.class.component.vue" + ] + } + }, + { + "language": "html", + "scopes": { + "component": [ + "support.class.component.vue" + ] + } + } + ], "languages": [ { "id": "vue", diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index 90b62d663..d311147d6 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -328,6 +328,10 @@ function getInitializationOptions( customBlockSchemaUrls: vscode.workspace.getConfiguration('volar').get>('vueserver.json.customBlockSchemaUrls'), }, additionalExtensions: additionalExtensions(), + semanticTokensLegend: { + tokenTypes: ['component'], + tokenModifiers: [], + }, }; return initializationOptions; } diff --git a/packages/language-server/src/common/features/languageFeatures.ts b/packages/language-server/src/common/features/languageFeatures.ts index 26c00fb41..d62ce2e6c 100644 --- a/packages/language-server/src/common/features/languageFeatures.ts +++ b/packages/language-server/src/common/features/languageFeatures.ts @@ -4,13 +4,13 @@ import { AutoInsertRequest, FindFileReferenceRequest, ShowReferencesNotification import { CancellationTokenHost } from '../cancellationPipe'; import type { Workspaces } from '../workspaces'; import * as shared from '@volar/shared'; -import { semanticTokensLegend } from '../utils/registerFeatures'; export function register( connection: vscode.Connection, projects: Workspaces, initParams: vscode.InitializeParams, cancelHost: CancellationTokenHost, + semanticTokensLegend: vscode.SemanticTokensLegend, ) { let lastCompleteUri: string; diff --git a/packages/language-server/src/common/server.ts b/packages/language-server/src/common/server.ts index 931e55e7d..431239938 100644 --- a/packages/language-server/src/common/server.ts +++ b/packages/language-server/src/common/server.ts @@ -59,7 +59,7 @@ export function createCommonLanguageServer(params: ServerParams) { await _createDocumentServiceHost(); if (serverMode === ServerMode.Semantic) { - setupSemanticCapabilities(initParams.capabilities, result.capabilities, options, plugins); + setupSemanticCapabilities(initParams.capabilities, result.capabilities, options, plugins, getSemanticTokensLegend()); await createLanguageServiceHost(); } @@ -175,7 +175,7 @@ export function createCommonLanguageServer(params: ServerParams) { } (await import('./features/customFeatures')).register(connection, projects); - (await import('./features/languageFeatures')).register(connection, projects, initParams, cancelTokenHost); + (await import('./features/languageFeatures')).register(connection, projects, initParams, cancelTokenHost, getSemanticTokensLegend()); for (const plugin of plugins) { plugin.semanticService?.onInitialize?.(connection, getLanguageService as any); @@ -186,4 +186,55 @@ export function createCommonLanguageServer(params: ServerParams) { return project?.getLanguageService(); } } + + function getSemanticTokensLegend() { + if (!options.semanticTokensLegend) { + return standardSemanticTokensLegend; + } + return { + tokenTypes: [...standardSemanticTokensLegend.tokenTypes, ...options.semanticTokensLegend.tokenTypes], + tokenModifiers: [...standardSemanticTokensLegend.tokenModifiers, ...options.semanticTokensLegend.tokenModifiers], + }; + } } + +// https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide#standard-token-types-and-modifiers +const standardSemanticTokensLegend: vscode.SemanticTokensLegend = { + tokenTypes: [ + 'namespace', + 'class', + 'enum', + 'interface', + 'struct', + 'typeParameter', + 'type', + 'parameter', + 'variable', + 'property', + 'enumMember', + 'decorator', + 'event', + 'function', + 'method', + 'macro', + 'label', + 'comment', + 'string', + 'keyword', + 'number', + 'regexp', + 'operator', + ], + tokenModifiers: [ + 'declaration', + 'definition', + 'readonly', + 'static', + 'deprecated', + 'abstract', + 'async', + 'modification', + 'documentation', + 'defaultLibrary', + ], +}; diff --git a/packages/language-server/src/common/utils/registerFeatures.ts b/packages/language-server/src/common/utils/registerFeatures.ts index 803e6fe75..341f2177e 100644 --- a/packages/language-server/src/common/utils/registerFeatures.ts +++ b/packages/language-server/src/common/utils/registerFeatures.ts @@ -3,47 +3,6 @@ import { DiagnosticModel, LanguageServerPlugin, LanguageServerInitializationOpti import * as vscode from 'vscode-languageserver'; import { ClientCapabilities } from 'vscode-languageserver'; -// https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide#standard-token-types-and-modifiers -export const semanticTokensLegend: vscode.SemanticTokensLegend = { - tokenTypes: [ - 'namespace', - 'class', - 'enum', - 'interface', - 'struct', - 'typeParameter', - 'type', - 'parameter', - 'variable', - 'property', - 'enumMember', - 'decorator', - 'event', - 'function', - 'method', - 'macro', - 'label', - 'comment', - 'string', - 'keyword', - 'number', - 'regexp', - 'operator', - ], - tokenModifiers: [ - 'declaration', - 'definition', - 'readonly', - 'static', - 'deprecated', - 'abstract', - 'async', - 'modification', - 'documentation', - 'defaultLibrary', - ], -}; - export function setupSyntacticCapabilities( params: ClientCapabilities, server: vscode.ServerCapabilities, @@ -84,6 +43,7 @@ export function setupSemanticCapabilities( server: vscode.ServerCapabilities, initOptions: LanguageServerInitializationOptions, plugins: ReturnType[], + semanticTokensLegend: vscode.SemanticTokensLegend, ) { if (!initOptions.respectClientCapabilities || params.textDocument?.references) { server.referencesProvider = true; diff --git a/packages/language-server/src/types.ts b/packages/language-server/src/types.ts index 2d3848523..ac52daf9e 100644 --- a/packages/language-server/src/types.ts +++ b/packages/language-server/src/types.ts @@ -117,4 +117,8 @@ export interface LanguageServerInitializationOptions { respectClientCapabilities?: boolean; maxFileSize?: number; configFilePath?: string; + /** + * Extra semantic token types and modifiers that are supported by the client. + */ + semanticTokensLegend?: vscode.SemanticTokensLegend; } diff --git a/vue-language-tools/vue-language-service/src/plugins/vue-template.ts b/vue-language-tools/vue-language-service/src/plugins/vue-template.ts index 8017d025f..47f077739 100644 --- a/vue-language-tools/vue-language-service/src/plugins/vue-template.ts +++ b/vue-language-tools/vue-language-service/src/plugins/vue-template.ts @@ -202,7 +202,11 @@ export default function useVueTemplateLanguagePlugin