From 09c6ea48f07d04c031c3515c68926e63f7f80654 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 17 Nov 2021 13:41:00 +0100 Subject: [PATCH] Extract a common `DocumentHighlightAdapter` --- src/common/lspLanguageFeatures.ts | 53 +++++++++++++++++++++++++++++++ src/css/cssMode.ts | 2 +- src/css/languageFeatures.ts | 45 ++------------------------ src/html/htmlMode.ts | 4 +-- src/html/languageFeatures.ts | 43 ++----------------------- 5 files changed, 62 insertions(+), 85 deletions(-) diff --git a/src/common/lspLanguageFeatures.ts b/src/common/lspLanguageFeatures.ts index 10fbf1d5..0239fa57 100644 --- a/src/common/lspLanguageFeatures.ts +++ b/src/common/lspLanguageFeatures.ts @@ -462,3 +462,56 @@ function toMarkedStringArray( } //#endregion + +//#region + +export interface ILanguageWorkerWithDocumentHighlights { + findDocumentHighlights( + uri: string, + position: lsTypes.Position + ): Promise; +} + +export class DocumentHighlightAdapter + implements languages.DocumentHighlightProvider +{ + constructor(private _worker: WorkerAccessor) {} + + public provideDocumentHighlights( + model: editor.IReadOnlyModel, + position: Position, + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource) + .then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position))) + .then((entries) => { + if (!entries) { + return; + } + return entries.map((entry) => { + return { + range: toRange(entry.range), + kind: toDocumentHighlightKind(entry.kind) + }; + }); + }); + } +} + +function toDocumentHighlightKind( + kind: lsTypes.DocumentHighlightKind +): languages.DocumentHighlightKind { + switch (kind) { + case lsTypes.DocumentHighlightKind.Read: + return languages.DocumentHighlightKind.Read; + case lsTypes.DocumentHighlightKind.Write: + return languages.DocumentHighlightKind.Write; + case lsTypes.DocumentHighlightKind.Text: + return languages.DocumentHighlightKind.Text; + } + return languages.DocumentHighlightKind.Text; +} + +//#endregion diff --git a/src/css/cssMode.ts b/src/css/cssMode.ts index 119a8391..5d4f19c2 100644 --- a/src/css/cssMode.ts +++ b/src/css/cssMode.ts @@ -42,7 +42,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentHighlightProvider( languageId, - new languageFeatures.DocumentHighlightAdapter(worker) + new languageFeatures.CSSDocumentHighlightAdapter(worker) ) ); } diff --git a/src/css/languageFeatures.ts b/src/css/languageFeatures.ts index 804a3e33..7843fc46 100644 --- a/src/css/languageFeatures.ts +++ b/src/css/languageFeatures.ts @@ -14,7 +14,8 @@ import { toTextEdit, fromRange, CompletionAdapter, - HoverAdapter + HoverAdapter, + DocumentHighlightAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -35,47 +36,7 @@ export class CSSCompletionAdapter extends CompletionAdapter { export class CSSHoverAdapter extends HoverAdapter {} -// --- document highlights ------ - -function toDocumentHighlightKind( - kind: lsTypes.DocumentHighlightKind -): languages.DocumentHighlightKind { - switch (kind) { - case lsTypes.DocumentHighlightKind.Read: - return languages.DocumentHighlightKind.Read; - case lsTypes.DocumentHighlightKind.Write: - return languages.DocumentHighlightKind.Write; - case lsTypes.DocumentHighlightKind.Text: - return languages.DocumentHighlightKind.Text; - } - return languages.DocumentHighlightKind.Text; -} - -export class DocumentHighlightAdapter implements languages.DocumentHighlightProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentHighlights( - model: editor.IReadOnlyModel, - position: Position, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position))) - .then((entries) => { - if (!entries) { - return; - } - return entries.map((entry) => { - return { - range: toRange(entry.range), - kind: toDocumentHighlightKind(entry.kind) - }; - }); - }); - } -} +export class CSSDocumentHighlightAdapter extends DocumentHighlightAdapter {} // --- definition ------ diff --git a/src/html/htmlMode.ts b/src/html/htmlMode.ts index c28610a5..47c33ae1 100644 --- a/src/html/htmlMode.ts +++ b/src/html/htmlMode.ts @@ -27,7 +27,7 @@ export function setupMode1(defaults: LanguageServiceDefaults): void { languages.registerDocumentHighlightProvider( languageId, - new languageFeatures.DocumentHighlightAdapter(worker) + new languageFeatures.HTMLDocumentHighlightAdapter(worker) ); languages.registerLinkProvider(languageId, new languageFeatures.DocumentLinkAdapter(worker)); languages.registerFoldingRangeProvider( @@ -90,7 +90,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentHighlightProvider( languageId, - new languageFeatures.DocumentHighlightAdapter(worker) + new languageFeatures.HTMLDocumentHighlightAdapter(worker) ) ); } diff --git a/src/html/languageFeatures.ts b/src/html/languageFeatures.ts index d136b432..b08f6f65 100644 --- a/src/html/languageFeatures.ts +++ b/src/html/languageFeatures.ts @@ -19,7 +19,8 @@ import { toTextEdit, fromRange, CompletionAdapter, - HoverAdapter + HoverAdapter, + DocumentHighlightAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -36,45 +37,7 @@ export class HTMLHoverAdapter extends HoverAdapter {} // --- document highlights ------ -function toDocumentHighlightKind( - kind: lsTypes.DocumentHighlightKind -): languages.DocumentHighlightKind { - switch (kind) { - case lsTypes.DocumentHighlightKind.Read: - return languages.DocumentHighlightKind.Read; - case lsTypes.DocumentHighlightKind.Write: - return languages.DocumentHighlightKind.Write; - case lsTypes.DocumentHighlightKind.Text: - return languages.DocumentHighlightKind.Text; - } - return languages.DocumentHighlightKind.Text; -} - -export class DocumentHighlightAdapter implements languages.DocumentHighlightProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentHighlights( - model: editor.IReadOnlyModel, - position: Position, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position))) - .then((entries) => { - if (!entries) { - return; - } - return entries.map((entry) => { - return { - range: toRange(entry.range), - kind: toDocumentHighlightKind(entry.kind) - }; - }); - }); - } -} +export class HTMLDocumentHighlightAdapter extends DocumentHighlightAdapter {} function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit { if (!edit || !edit.changes) {