diff --git a/src/common/lspLanguageFeatures.ts b/src/common/lspLanguageFeatures.ts index 2e33cafa..00869daa 100644 --- a/src/common/lspLanguageFeatures.ts +++ b/src/common/lspLanguageFeatures.ts @@ -956,3 +956,46 @@ function toFoldingRangeKind( } //#endregion + +//#region SelectionRangeAdapter + +export interface ILanguageWorkerWithSelectionRanges { + getSelectionRanges(uri: string, positions: lsTypes.Position[]): Promise; +} + +export class SelectionRangeAdapter + implements languages.SelectionRangeProvider +{ + constructor(private _worker: WorkerAccessor) {} + + public provideSelectionRanges( + model: editor.IReadOnlyModel, + positions: Position[], + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource) + .then((worker) => + worker.getSelectionRanges( + resource.toString(), + positions.map(fromPosition) + ) + ) + .then((selectionRanges) => { + if (!selectionRanges) { + return; + } + return selectionRanges.map((selectionRange: lsTypes.SelectionRange | undefined) => { + const result: languages.SelectionRange[] = []; + while (selectionRange) { + result.push({ range: toRange(selectionRange.range) }); + selectionRange = selectionRange.parent; + } + return result; + }); + }); + } +} + +//#endregion diff --git a/src/css/cssMode.ts b/src/css/cssMode.ts index d4a1b288..f881cecc 100644 --- a/src/css/cssMode.ts +++ b/src/css/cssMode.ts @@ -98,7 +98,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerSelectionRangeProvider( languageId, - new languageFeatures.SelectionRangeAdapter(worker) + new languageFeatures.CSSSelectionRangeAdapter(worker) ) ); } diff --git a/src/css/languageFeatures.ts b/src/css/languageFeatures.ts index 34bdccf2..fed724c5 100644 --- a/src/css/languageFeatures.ts +++ b/src/css/languageFeatures.ts @@ -5,12 +5,9 @@ import { LanguageServiceDefaults } from './monaco.contribution'; import type { CSSWorker } from './cssWorker'; -import * as lsTypes from 'vscode-languageserver-types'; -import { languages, editor, Uri, Position, CancellationToken } from '../fillers/monaco-editor-core'; +import { Uri } from '../fillers/monaco-editor-core'; import { DiagnosticsAdapter, - fromPosition, - toRange, CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, @@ -19,7 +16,8 @@ import { RenameAdapter, DocumentSymbolAdapter, DocumentColorAdapter, - FoldingRangeAdapter + FoldingRangeAdapter, + SelectionRangeAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -54,35 +52,4 @@ export class CSSDocumentColorAdapter extends DocumentColorAdapter {} export class CSSFoldingRangeAdapter extends FoldingRangeAdapter {} -export class SelectionRangeAdapter implements languages.SelectionRangeProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideSelectionRanges( - model: editor.IReadOnlyModel, - positions: Position[], - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => - worker.getSelectionRanges( - resource.toString(), - positions.map(fromPosition) - ) - ) - .then((selectionRanges) => { - if (!selectionRanges) { - return; - } - return selectionRanges.map((selectionRange: lsTypes.SelectionRange | undefined) => { - const result: languages.SelectionRange[] = []; - while (selectionRange) { - result.push({ range: toRange(selectionRange.range) }); - selectionRange = selectionRange.parent; - } - return result; - }); - }); - } -} +export class CSSSelectionRangeAdapter extends SelectionRangeAdapter {} diff --git a/src/html/htmlMode.ts b/src/html/htmlMode.ts index ecc8d1ce..9c9853a5 100644 --- a/src/html/htmlMode.ts +++ b/src/html/htmlMode.ts @@ -40,7 +40,7 @@ export function setupMode1(defaults: LanguageServiceDefaults): void { ); languages.registerSelectionRangeProvider( languageId, - new languageFeatures.SelectionRangeAdapter(worker) + new languageFeatures.HTMLSelectionRangeAdapter(worker) ); languages.registerRenameProvider(languageId, new languageFeatures.HTMLRenameAdapter(worker)); @@ -127,7 +127,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerSelectionRangeProvider( languageId, - new languageFeatures.SelectionRangeAdapter(worker) + new languageFeatures.HTMLSelectionRangeAdapter(worker) ) ); } diff --git a/src/html/languageFeatures.ts b/src/html/languageFeatures.ts index fb9a8226..432c1d04 100644 --- a/src/html/languageFeatures.ts +++ b/src/html/languageFeatures.ts @@ -4,11 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import type { HTMLWorker } from './htmlWorker'; -import * as lsTypes from 'vscode-languageserver-types'; -import { languages, editor, Uri, Position, CancellationToken } from '../fillers/monaco-editor-core'; +import { Uri } from '../fillers/monaco-editor-core'; import { - fromPosition, - toRange, CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, @@ -17,7 +14,8 @@ import { DocumentLinkAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, - FoldingRangeAdapter + FoldingRangeAdapter, + SelectionRangeAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -46,35 +44,4 @@ export class HTMLDocumentRangeFormattingEditProvider extends DocumentRangeFormat export class HTMLFoldingRangeAdapter extends FoldingRangeAdapter {} -export class SelectionRangeAdapter implements languages.SelectionRangeProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideSelectionRanges( - model: editor.IReadOnlyModel, - positions: Position[], - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => - worker.getSelectionRanges( - resource.toString(), - positions.map(fromPosition) - ) - ) - .then((selectionRanges) => { - if (!selectionRanges) { - return; - } - return selectionRanges.map((selectionRange: lsTypes.SelectionRange | undefined) => { - const result: languages.SelectionRange[] = []; - while (selectionRange) { - result.push({ range: toRange(selectionRange.range) }); - selectionRange = selectionRange.parent; - } - return result; - }); - }); - } -} +export class HTMLSelectionRangeAdapter extends SelectionRangeAdapter {} diff --git a/src/json/jsonMode.ts b/src/json/jsonMode.ts index c45cd11c..c59137b5 100644 --- a/src/json/jsonMode.ts +++ b/src/json/jsonMode.ts @@ -89,7 +89,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerSelectionRangeProvider( languageId, - new languageFeatures.SelectionRangeAdapter(worker) + new languageFeatures.JSONSelectionRangeAdapter(worker) ) ); } diff --git a/src/json/languageFeatures.ts b/src/json/languageFeatures.ts index e0e4f508..7a7887f9 100644 --- a/src/json/languageFeatures.ts +++ b/src/json/languageFeatures.ts @@ -5,19 +5,17 @@ import { LanguageServiceDefaults } from './monaco.contribution'; import type { JSONWorker } from './jsonWorker'; -import * as lsTypes from 'vscode-languageserver-types'; -import { languages, editor, Uri, Position, CancellationToken } from '../fillers/monaco-editor-core'; +import { editor, Uri } from '../fillers/monaco-editor-core'; import { DiagnosticsAdapter, - fromPosition, - toRange, CompletionAdapter, HoverAdapter, DocumentSymbolAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentColorAdapter, - FoldingRangeAdapter + FoldingRangeAdapter, + SelectionRangeAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -65,35 +63,4 @@ export class JSONDocumentColorAdapter extends DocumentColorAdapter { export class JSONFoldingRangeAdapter extends FoldingRangeAdapter {} -export class SelectionRangeAdapter implements languages.SelectionRangeProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideSelectionRanges( - model: editor.IReadOnlyModel, - positions: Position[], - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => - worker.getSelectionRanges( - resource.toString(), - positions.map(fromPosition) - ) - ) - .then((selectionRanges) => { - if (!selectionRanges) { - return; - } - return selectionRanges.map((selectionRange: lsTypes.SelectionRange | undefined) => { - const result: languages.SelectionRange[] = []; - while (selectionRange) { - result.push({ range: toRange(selectionRange.range) }); - selectionRange = selectionRange.parent; - } - return result; - }); - }); - } -} +export class JSONSelectionRangeAdapter extends SelectionRangeAdapter {}