diff --git a/src/common/lspLanguageFeatures.ts b/src/common/lspLanguageFeatures.ts index 54d2474a..dd0091b7 100644 --- a/src/common/lspLanguageFeatures.ts +++ b/src/common/lspLanguageFeatures.ts @@ -763,3 +763,73 @@ export class DocumentLinkAdapter } //#endregion + +//#region DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider + +export interface ILanguageWorkerWithFormat { + format( + uri: string, + range: lsTypes.Range | null, + options: lsTypes.FormattingOptions + ): Promise; +} + +export class DocumentFormattingEditProvider + implements languages.DocumentFormattingEditProvider +{ + constructor(private _worker: WorkerAccessor) {} + + public provideDocumentFormattingEdits( + model: editor.IReadOnlyModel, + options: languages.FormattingOptions, + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource).then((worker) => { + return worker + .format(resource.toString(), null, fromFormattingOptions(options)) + .then((edits) => { + if (!edits || edits.length === 0) { + return; + } + return edits.map(toTextEdit); + }); + }); + } +} + +export class DocumentRangeFormattingEditProvider + implements languages.DocumentRangeFormattingEditProvider +{ + constructor(private _worker: WorkerAccessor) {} + + public provideDocumentRangeFormattingEdits( + model: editor.IReadOnlyModel, + range: Range, + options: languages.FormattingOptions, + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource).then((worker) => { + return worker + .format(resource.toString(), fromRange(range), fromFormattingOptions(options)) + .then((edits) => { + if (!edits || edits.length === 0) { + return; + } + return edits.map(toTextEdit); + }); + }); + } +} + +function fromFormattingOptions(options: languages.FormattingOptions): lsTypes.FormattingOptions { + return { + tabSize: options.tabSize, + insertSpaces: options.insertSpaces + }; +} + +//#endregion diff --git a/src/html/htmlMode.ts b/src/html/htmlMode.ts index ebce385a..705abd0f 100644 --- a/src/html/htmlMode.ts +++ b/src/html/htmlMode.ts @@ -48,11 +48,11 @@ export function setupMode1(defaults: LanguageServiceDefaults): void { if (languageId === 'html') { languages.registerDocumentFormattingEditProvider( languageId, - new languageFeatures.DocumentFormattingEditProvider(worker) + new languageFeatures.HTMLDocumentFormattingEditProvider(worker) ); languages.registerDocumentRangeFormattingEditProvider( languageId, - new languageFeatures.DocumentRangeFormattingEditProvider(worker) + new languageFeatures.HTMLDocumentRangeFormattingEditProvider(worker) ); } } @@ -135,7 +135,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentFormattingEditProvider( languageId, - new languageFeatures.DocumentFormattingEditProvider(worker) + new languageFeatures.HTMLDocumentFormattingEditProvider(worker) ) ); } @@ -143,7 +143,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentRangeFormattingEditProvider( languageId, - new languageFeatures.DocumentRangeFormattingEditProvider(worker) + new languageFeatures.HTMLDocumentRangeFormattingEditProvider(worker) ) ); } diff --git a/src/html/languageFeatures.ts b/src/html/languageFeatures.ts index f0f4070c..8334534f 100644 --- a/src/html/languageFeatures.ts +++ b/src/html/languageFeatures.ts @@ -23,7 +23,9 @@ import { DocumentHighlightAdapter, RenameAdapter, DocumentSymbolAdapter, - DocumentLinkAdapter + DocumentLinkAdapter, + DocumentFormattingEditProvider, + DocumentRangeFormattingEditProvider } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -46,61 +48,9 @@ export class HTMLDocumentSymbolAdapter extends DocumentSymbolAdapter export class HTMLDocumentLinkAdapter extends DocumentLinkAdapter {} -function fromFormattingOptions(options: languages.FormattingOptions): lsTypes.FormattingOptions { - return { - tabSize: options.tabSize, - insertSpaces: options.insertSpaces - }; -} +export class HTMLDocumentFormattingEditProvider extends DocumentFormattingEditProvider {} -export class DocumentFormattingEditProvider implements languages.DocumentFormattingEditProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentFormattingEdits( - model: editor.IReadOnlyModel, - options: languages.FormattingOptions, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource).then((worker) => { - return worker - .format(resource.toString(), null, fromFormattingOptions(options)) - .then((edits) => { - if (!edits || edits.length === 0) { - return; - } - return edits.map(toTextEdit); - }); - }); - } -} - -export class DocumentRangeFormattingEditProvider - implements languages.DocumentRangeFormattingEditProvider -{ - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentRangeFormattingEdits( - model: editor.IReadOnlyModel, - range: Range, - options: languages.FormattingOptions, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource).then((worker) => { - return worker - .format(resource.toString(), fromRange(range), fromFormattingOptions(options)) - .then((edits) => { - if (!edits || edits.length === 0) { - return; - } - return edits.map(toTextEdit); - }); - }); - } -} +export class HTMLDocumentRangeFormattingEditProvider extends DocumentRangeFormattingEditProvider {} export class FoldingRangeAdapter implements languages.FoldingRangeProvider { constructor(private _worker: WorkerAccessor) {} diff --git a/src/json/jsonMode.ts b/src/json/jsonMode.ts index 64b91abc..51a6b214 100644 --- a/src/json/jsonMode.ts +++ b/src/json/jsonMode.ts @@ -30,7 +30,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentFormattingEditProvider( languageId, - new languageFeatures.DocumentFormattingEditProvider(worker) + new languageFeatures.JSONDocumentFormattingEditProvider(worker) ) ); } @@ -38,7 +38,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentRangeFormattingEditProvider( languageId, - new languageFeatures.DocumentRangeFormattingEditProvider(worker) + new languageFeatures.JSONDocumentRangeFormattingEditProvider(worker) ) ); } diff --git a/src/json/languageFeatures.ts b/src/json/languageFeatures.ts index e835613f..b9370a81 100644 --- a/src/json/languageFeatures.ts +++ b/src/json/languageFeatures.ts @@ -22,7 +22,9 @@ import { fromRange, CompletionAdapter, HoverAdapter, - DocumentSymbolAdapter + DocumentSymbolAdapter, + DocumentFormattingEditProvider, + DocumentRangeFormattingEditProvider } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -62,61 +64,9 @@ export class JSONHoverAdapter extends HoverAdapter {} export class JSONDocumentSymbolAdapter extends DocumentSymbolAdapter {} -function fromFormattingOptions(options: languages.FormattingOptions): lsTypes.FormattingOptions { - return { - tabSize: options.tabSize, - insertSpaces: options.insertSpaces - }; -} +export class JSONDocumentFormattingEditProvider extends DocumentFormattingEditProvider {} -export class DocumentFormattingEditProvider implements languages.DocumentFormattingEditProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentFormattingEdits( - model: editor.IReadOnlyModel, - options: languages.FormattingOptions, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource).then((worker) => { - return worker - .format(resource.toString(), null, fromFormattingOptions(options)) - .then((edits) => { - if (!edits || edits.length === 0) { - return; - } - return edits.map(toTextEdit); - }); - }); - } -} - -export class DocumentRangeFormattingEditProvider - implements languages.DocumentRangeFormattingEditProvider -{ - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentRangeFormattingEdits( - model: editor.IReadOnlyModel, - range: Range, - options: languages.FormattingOptions, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource).then((worker) => { - return worker - .format(resource.toString(), fromRange(range), fromFormattingOptions(options)) - .then((edits) => { - if (!edits || edits.length === 0) { - return; - } - return edits.map(toTextEdit); - }); - }); - } -} +export class JSONDocumentRangeFormattingEditProvider extends DocumentRangeFormattingEditProvider {} export class DocumentColorAdapter implements languages.DocumentColorProvider { constructor(private _worker: WorkerAccessor) {}