mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-30 17:23:29 -05:00
Merge from vscode f5044f0910e4aa7e7e06cb509781f3d56e729959 (#4759)
This commit is contained in:
@@ -23,8 +23,8 @@ import { FormattingEdit } from 'vs/editor/contrib/format/formattingEdit';
|
||||
import * as nls from 'vs/nls';
|
||||
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { LinkedList } from 'vs/base/common/linkedList';
|
||||
|
||||
export function alertFormattingEdits(edits: ISingleEditOperation[]): void {
|
||||
|
||||
@@ -86,30 +86,51 @@ export function getRealAndSyntheticDocumentFormattersOrdered(model: ITextModel):
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function formatDocumentRangeWithFirstProvider(
|
||||
export const enum FormattingMode {
|
||||
Explicit = 1,
|
||||
Silent = 2
|
||||
}
|
||||
|
||||
export interface IFormattingEditProviderSelector {
|
||||
<T extends (DocumentFormattingEditProvider | DocumentRangeFormattingEditProvider)>(formatter: T[], document: ITextModel, mode: FormattingMode): Promise<T | undefined>;
|
||||
}
|
||||
|
||||
export abstract class FormattingConflicts {
|
||||
|
||||
private static readonly _selectors = new LinkedList<IFormattingEditProviderSelector>();
|
||||
|
||||
static setFormatterSelector(selector: IFormattingEditProviderSelector): IDisposable {
|
||||
const remove = FormattingConflicts._selectors.unshift(selector);
|
||||
return { dispose: remove };
|
||||
}
|
||||
|
||||
static async select<T extends (DocumentFormattingEditProvider | DocumentRangeFormattingEditProvider)>(formatter: T[], document: ITextModel, mode: FormattingMode): Promise<T | undefined> {
|
||||
if (formatter.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
const { value: selector } = FormattingConflicts._selectors.iterator().next();
|
||||
if (selector) {
|
||||
return await selector(formatter, document, mode);
|
||||
}
|
||||
return formatter[0];
|
||||
}
|
||||
}
|
||||
|
||||
export async function formatDocumentRangeWithSelectedProvider(
|
||||
accessor: ServicesAccessor,
|
||||
editorOrModel: ITextModel | IActiveCodeEditor,
|
||||
range: Range,
|
||||
mode: FormattingMode,
|
||||
token: CancellationToken
|
||||
): Promise<boolean> {
|
||||
): Promise<void> {
|
||||
|
||||
const instaService = accessor.get(IInstantiationService);
|
||||
const statusBarService = accessor.get(IStatusbarService);
|
||||
const labelService = accessor.get(ILabelService);
|
||||
|
||||
const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel;
|
||||
const [best, ...rest] = DocumentRangeFormattingEditProviderRegistry.ordered(model);
|
||||
if (!best) {
|
||||
return false;
|
||||
const provider = DocumentRangeFormattingEditProviderRegistry.ordered(model);
|
||||
const selected = await FormattingConflicts.select(provider, model, mode);
|
||||
if (selected) {
|
||||
await instaService.invokeFunction(formatDocumentRangeWithProvider, selected, editorOrModel, range, token);
|
||||
}
|
||||
const ret = await instaService.invokeFunction(formatDocumentRangeWithProvider, best, editorOrModel, range, token);
|
||||
if (rest.length > 0) {
|
||||
statusBarService.setStatusMessage(
|
||||
nls.localize('random.pick', "$(tasklist) Formatted '{0}' with '{1}'", labelService.getUriLabel(model.uri, { relative: true }), best.displayName),
|
||||
5 * 1000
|
||||
);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
export async function formatDocumentRangeWithProvider(
|
||||
@@ -181,29 +202,20 @@ export async function formatDocumentRangeWithProvider(
|
||||
return true;
|
||||
}
|
||||
|
||||
export async function formatDocumentWithFirstProvider(
|
||||
export async function formatDocumentWithSelectedProvider(
|
||||
accessor: ServicesAccessor,
|
||||
editorOrModel: ITextModel | IActiveCodeEditor,
|
||||
mode: FormattingMode,
|
||||
token: CancellationToken
|
||||
): Promise<boolean> {
|
||||
): Promise<void> {
|
||||
|
||||
const instaService = accessor.get(IInstantiationService);
|
||||
const statusBarService = accessor.get(IStatusbarService);
|
||||
const labelService = accessor.get(ILabelService);
|
||||
|
||||
const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel;
|
||||
const [best, ...rest] = getRealAndSyntheticDocumentFormattersOrdered(model);
|
||||
if (!best) {
|
||||
return false;
|
||||
const provider = getRealAndSyntheticDocumentFormattersOrdered(model);
|
||||
const selected = await FormattingConflicts.select(provider, model, mode);
|
||||
if (selected) {
|
||||
await instaService.invokeFunction(formatDocumentWithProvider, selected, editorOrModel, token);
|
||||
}
|
||||
const ret = await instaService.invokeFunction(formatDocumentWithProvider, best, editorOrModel, token);
|
||||
if (rest.length > 0) {
|
||||
statusBarService.setStatusMessage(
|
||||
nls.localize('random.pick', "$(tasklist) Formatted '{0}' with '{1}'", labelService.getUriLabel(model.uri, { relative: true }), best.displayName),
|
||||
5 * 1000
|
||||
);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
export async function formatDocumentWithProvider(
|
||||
|
||||
@@ -16,7 +16,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon';
|
||||
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
|
||||
import { DocumentRangeFormattingEditProviderRegistry, OnTypeFormattingEditProviderRegistry } from 'vs/editor/common/modes';
|
||||
import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService';
|
||||
import { getOnTypeFormattingEdits, alertFormattingEdits, formatDocumentRangeWithFirstProvider, formatDocumentWithFirstProvider } from 'vs/editor/contrib/format/format';
|
||||
import { getOnTypeFormattingEdits, alertFormattingEdits, formatDocumentRangeWithSelectedProvider, formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/format';
|
||||
import { FormattingEdit } from 'vs/editor/contrib/format/formattingEdit';
|
||||
import * as nls from 'vs/nls';
|
||||
import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands';
|
||||
@@ -211,7 +211,7 @@ class FormatOnPaste implements editorCommon.IEditorContribution {
|
||||
if (this.editor.getSelections().length > 1) {
|
||||
return;
|
||||
}
|
||||
this._instantiationService.invokeFunction(formatDocumentRangeWithFirstProvider, this.editor, range, CancellationToken.None).catch(onUnexpectedError);
|
||||
this._instantiationService.invokeFunction(formatDocumentRangeWithSelectedProvider, this.editor, range, FormattingMode.Silent, CancellationToken.None).catch(onUnexpectedError);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ class FormatDocumentAction extends EditorAction {
|
||||
async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise<void> {
|
||||
if (editor.hasModel()) {
|
||||
const instaService = accessor.get(IInstantiationService);
|
||||
await instaService.invokeFunction(formatDocumentWithFirstProvider, editor, CancellationToken.None);
|
||||
await instaService.invokeFunction(formatDocumentWithSelectedProvider, editor, FormattingMode.Explicit, CancellationToken.None);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,7 +276,7 @@ class FormatSelectionAction extends EditorAction {
|
||||
if (range.isEmpty()) {
|
||||
range = new Range(range.startLineNumber, 1, range.startLineNumber, model.getLineMaxColumn(range.startLineNumber));
|
||||
}
|
||||
await instaService.invokeFunction(formatDocumentRangeWithFirstProvider, editor, range, CancellationToken.None);
|
||||
await instaService.invokeFunction(formatDocumentRangeWithSelectedProvider, editor, range, FormattingMode.Explicit, CancellationToken.None);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user