/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 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 { DiagnosticsAdapter, fromPosition, toRange, CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, DefinitionAdapter, ReferenceAdapter, RenameAdapter, DocumentSymbolAdapter, DocumentColorAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { (first: Uri, ...more: Uri[]): Promise; } export class CSSDiagnosticsAdapter extends DiagnosticsAdapter { constructor(languageId: string, worker: WorkerAccessor, defaults: LanguageServiceDefaults) { super(languageId, worker, defaults.onDidChange); } } export class CSSCompletionAdapter extends CompletionAdapter { constructor(worker: WorkerAccessor) { super(worker, ['/', '-', ':']); } } export class CSSHoverAdapter extends HoverAdapter {} export class CSSDocumentHighlightAdapter extends DocumentHighlightAdapter {} export class CSSDefinitionAdapter extends DefinitionAdapter {} export class CSSReferenceAdapter extends ReferenceAdapter {} export class CSSRenameAdapter extends RenameAdapter {} export class CSSDocumentSymbolAdapter extends DocumentSymbolAdapter {} export class CSSDocumentColorAdapter extends DocumentColorAdapter {} export class FoldingRangeAdapter implements languages.FoldingRangeProvider { constructor(private _worker: WorkerAccessor) {} public provideFoldingRanges( model: editor.IReadOnlyModel, context: languages.FoldingContext, token: CancellationToken ): Promise { const resource = model.uri; return this._worker(resource) .then((worker) => worker.getFoldingRanges(resource.toString(), context)) .then((ranges) => { if (!ranges) { return; } return ranges.map((range) => { const result: languages.FoldingRange = { start: range.startLine + 1, end: range.endLine + 1 }; if (typeof range.kind !== 'undefined') { result.kind = toFoldingRangeKind(range.kind); } return result; }); }); } } function toFoldingRangeKind( kind: lsTypes.FoldingRangeKind ): languages.FoldingRangeKind | undefined { switch (kind) { case lsTypes.FoldingRangeKind.Comment: return languages.FoldingRangeKind.Comment; case lsTypes.FoldingRangeKind.Imports: return languages.FoldingRangeKind.Imports; case lsTypes.FoldingRangeKind.Region: return languages.FoldingRangeKind.Region; } return void 0; } 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; }); }); } }