From 8d7bf2ad7663ca2771e331c375f12b75977d74b6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 17 Nov 2021 14:53:34 +0100 Subject: [PATCH] Extract a common `DocumentColorAdapter` --- src/common/lspLanguageFeatures.ts | 69 +++++++++++++++++++++++++++++++ src/css/cssMode.ts | 2 +- src/css/languageFeatures.ts | 59 ++------------------------ src/html/languageFeatures.ts | 11 +---- src/json/jsonMode.ts | 2 +- src/json/languageFeatures.ts | 68 ++---------------------------- 6 files changed, 79 insertions(+), 132 deletions(-) diff --git a/src/common/lspLanguageFeatures.ts b/src/common/lspLanguageFeatures.ts index dd0091b7..93ecf4bd 100644 --- a/src/common/lspLanguageFeatures.ts +++ b/src/common/lspLanguageFeatures.ts @@ -833,3 +833,72 @@ function fromFormattingOptions(options: languages.FormattingOptions): lsTypes.Fo } //#endregion + +//#region DocumentColorAdapter + +export interface ILanguageWorkerWithDocumentColors { + findDocumentColors(uri: string): Promise; + getColorPresentations( + uri: string, + color: lsTypes.Color, + range: lsTypes.Range + ): Promise; +} + +export class DocumentColorAdapter + implements languages.DocumentColorProvider +{ + constructor(private readonly _worker: WorkerAccessor) {} + + public provideDocumentColors( + model: editor.IReadOnlyModel, + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource) + .then((worker) => worker.findDocumentColors(resource.toString())) + .then((infos) => { + if (!infos) { + return; + } + return infos.map((item) => ({ + color: item.color, + range: toRange(item.range) + })); + }); + } + + public provideColorPresentations( + model: editor.IReadOnlyModel, + info: languages.IColorInformation, + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource) + .then((worker) => + worker.getColorPresentations(resource.toString(), info.color, fromRange(info.range)) + ) + .then((presentations) => { + if (!presentations) { + return; + } + return presentations.map((presentation) => { + let item: languages.IColorPresentation = { + label: presentation.label + }; + if (presentation.textEdit) { + item.textEdit = toTextEdit(presentation.textEdit); + } + if (presentation.additionalTextEdits) { + item.additionalTextEdits = + presentation.additionalTextEdits.map(toTextEdit); + } + return item; + }); + }); + } +} + +//#endregion diff --git a/src/css/cssMode.ts b/src/css/cssMode.ts index 5c86d13c..23b46e37 100644 --- a/src/css/cssMode.ts +++ b/src/css/cssMode.ts @@ -79,7 +79,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerColorProvider( languageId, - new languageFeatures.DocumentColorAdapter(worker) + new languageFeatures.CSSDocumentColorAdapter(worker) ) ); } diff --git a/src/css/languageFeatures.ts b/src/css/languageFeatures.ts index ceda9ce6..5935cc2b 100644 --- a/src/css/languageFeatures.ts +++ b/src/css/languageFeatures.ts @@ -11,15 +11,14 @@ import { DiagnosticsAdapter, fromPosition, toRange, - toTextEdit, - fromRange, CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, DefinitionAdapter, ReferenceAdapter, RenameAdapter, - DocumentSymbolAdapter + DocumentSymbolAdapter, + DocumentColorAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -50,59 +49,7 @@ export class CSSRenameAdapter extends RenameAdapter {} export class CSSDocumentSymbolAdapter extends DocumentSymbolAdapter {} -export class DocumentColorAdapter implements languages.DocumentColorProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentColors( - model: editor.IReadOnlyModel, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentColors(resource.toString())) - .then((infos) => { - if (!infos) { - return; - } - return infos.map((item) => ({ - color: item.color, - range: toRange(item.range) - })); - }); - } - - public provideColorPresentations( - model: editor.IReadOnlyModel, - info: languages.IColorInformation, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => - worker.getColorPresentations(resource.toString(), info.color, fromRange(info.range)) - ) - .then((presentations) => { - if (!presentations) { - return; - } - return presentations.map((presentation) => { - let item: languages.IColorPresentation = { - label: presentation.label - }; - if (presentation.textEdit) { - item.textEdit = toTextEdit(presentation.textEdit); - } - if (presentation.additionalTextEdits) { - item.additionalTextEdits = - presentation.additionalTextEdits.map(toTextEdit); - } - return item; - }); - }); - } -} +export class CSSDocumentColorAdapter extends DocumentColorAdapter {} export class FoldingRangeAdapter implements languages.FoldingRangeProvider { constructor(private _worker: WorkerAccessor) {} diff --git a/src/html/languageFeatures.ts b/src/html/languageFeatures.ts index 8334534f..404714bc 100644 --- a/src/html/languageFeatures.ts +++ b/src/html/languageFeatures.ts @@ -5,19 +5,10 @@ import type { HTMLWorker } from './htmlWorker'; import * as lsTypes from 'vscode-languageserver-types'; -import { - languages, - editor, - Uri, - Position, - Range, - CancellationToken -} from '../fillers/monaco-editor-core'; +import { languages, editor, Uri, Position, CancellationToken } from '../fillers/monaco-editor-core'; import { fromPosition, toRange, - toTextEdit, - fromRange, CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, diff --git a/src/json/jsonMode.ts b/src/json/jsonMode.ts index 51a6b214..875056ed 100644 --- a/src/json/jsonMode.ts +++ b/src/json/jsonMode.ts @@ -70,7 +70,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerColorProvider( languageId, - new languageFeatures.DocumentColorAdapter(worker) + new languageFeatures.JSONDocumentColorAdapter(worker) ) ); } diff --git a/src/json/languageFeatures.ts b/src/json/languageFeatures.ts index b9370a81..4d3c3721 100644 --- a/src/json/languageFeatures.ts +++ b/src/json/languageFeatures.ts @@ -6,25 +6,17 @@ import { LanguageServiceDefaults } from './monaco.contribution'; import type { JSONWorker } from './jsonWorker'; import * as lsTypes from 'vscode-languageserver-types'; -import { - languages, - editor, - Uri, - Position, - Range, - CancellationToken -} from '../fillers/monaco-editor-core'; +import { languages, editor, Uri, Position, CancellationToken } from '../fillers/monaco-editor-core'; import { DiagnosticsAdapter, fromPosition, toRange, - toTextEdit, - fromRange, CompletionAdapter, HoverAdapter, DocumentSymbolAdapter, DocumentFormattingEditProvider, - DocumentRangeFormattingEditProvider + DocumentRangeFormattingEditProvider, + DocumentColorAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -68,59 +60,7 @@ export class JSONDocumentFormattingEditProvider extends DocumentFormattingEditPr export class JSONDocumentRangeFormattingEditProvider extends DocumentRangeFormattingEditProvider {} -export class DocumentColorAdapter implements languages.DocumentColorProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentColors( - model: editor.IReadOnlyModel, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentColors(resource.toString())) - .then((infos) => { - if (!infos) { - return; - } - return infos.map((item) => ({ - color: item.color, - range: toRange(item.range) - })); - }); - } - - public provideColorPresentations( - model: editor.IReadOnlyModel, - info: languages.IColorInformation, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => - worker.getColorPresentations(resource.toString(), info.color, fromRange(info.range)) - ) - .then((presentations) => { - if (!presentations) { - return; - } - return presentations.map((presentation) => { - let item: languages.IColorPresentation = { - label: presentation.label - }; - if (presentation.textEdit) { - item.textEdit = toTextEdit(presentation.textEdit); - } - if (presentation.additionalTextEdits) { - item.additionalTextEdits = - presentation.additionalTextEdits.map(toTextEdit); - } - return item; - }); - }); - } -} +export class JSONDocumentColorAdapter extends DocumentColorAdapter {} export class FoldingRangeAdapter implements languages.FoldingRangeProvider { constructor(private _worker: WorkerAccessor) {}