diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 3e6e7bcc4cd..ae8a3b77861 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -913,6 +913,9 @@ export interface FormattingOptions { * the formatting-feature. */ export interface DocumentFormattingEditProvider { + + displayName?: string; + /** * Provide formatting edits for a whole document. */ @@ -923,6 +926,9 @@ export interface DocumentFormattingEditProvider { * the formatting-feature. */ export interface DocumentRangeFormattingEditProvider { + + displayName?: string; + /** * Provide formatting edits for a range in a document. * diff --git a/src/vs/editor/contrib/format/formatActions.ts b/src/vs/editor/contrib/format/formatActions.ts index 3d9b801958c..bc44a9eb5cd 100644 --- a/src/vs/editor/contrib/format/formatActions.ts +++ b/src/vs/editor/contrib/format/formatActions.ts @@ -3,31 +3,32 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; +import { alert } from 'vs/base/browser/ui/aria/aria'; import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { registerEditorAction, ServicesAccessor, EditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { OnTypeFormattingEditProviderRegistry, DocumentRangeFormattingEditProviderRegistry, DocumentFormattingEditProviderRegistry, FormattingOptions } from 'vs/editor/common/modes'; -import { getOnTypeFormattingEdits, NoProviderError } from 'vs/editor/contrib/format/format'; -import { FormattingEdit } from 'vs/editor/contrib/format/formattingEdit'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { sequence } from 'vs/base/common/async'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { CodeEditorStateFlag, EditorState } from 'vs/editor/browser/core/editorState'; +import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorAction, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; import { Range } from 'vs/editor/common/core/range'; -import { alert } from 'vs/base/browser/ui/aria/aria'; -import { EditorState, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState'; +import * as editorCommon from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { ICodeEditor, IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { ISingleEditOperation } from 'vs/editor/common/model'; -import { INotificationService } from 'vs/platform/notification/common/notification'; +import { DocumentFormattingEditProviderRegistry, DocumentRangeFormattingEditProviderRegistry, FormattingOptions, OnTypeFormattingEditProviderRegistry } from 'vs/editor/common/modes'; +import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; +import { getOnTypeFormattingEdits, NoProviderError } from 'vs/editor/contrib/format/format'; +import { FormattingEdit } from 'vs/editor/contrib/format/formattingEdit'; +import * as nls from 'vs/nls'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import { sequence } from 'vs/base/common/async'; +import { INotificationService } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { MenuRegistry } from 'vs/platform/actions/common/actions'; function alertFormattingEdits(edits: ISingleEditOperation[]): void { @@ -484,3 +485,38 @@ CommandsRegistry.registerCommand('editor.action.format', accessor => { return formatDocumentRange(telemetryService, workerService, editor, FormatRangeType.Selection, { tabSize, insertSpaces }, CancellationToken.None); } }); + + +CommandsRegistry.registerCommand('editor.action.formatInspect', accessor => { + + const editor = accessor.get(ICodeEditorService).getActiveCodeEditor(); + if (!editor || !editor.hasModel()) { + return undefined; + } + console.log(`Available Formatters for: ${editor.getModel().uri.toString(true)}`); + // range formatters + const documentRangeProvider = DocumentRangeFormattingEditProviderRegistry.ordered(editor.getModel()); + console.group('Range Formatters'); + if (documentRangeProvider.length === 0) { + console.log('none'); + } else { + documentRangeProvider.forEach(value => console.log(value.displayName)); + } + console.groupEnd(); + + // whole document formatters + const documentProvider = DocumentFormattingEditProviderRegistry.ordered(editor.getModel()); + console.group('Document Formatters'); + if (documentProvider.length === 0) { + console.log('none'); + } else { + documentProvider.forEach(value => console.log(value.displayName)); + } + console.groupEnd(); +}); + +MenuRegistry.addCommand({ + id: 'editor.action.formatInspect', + category: nls.localize('cat', "Developer"), + title: nls.localize('title', "Print Available Formatters..."), +}); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a15aadccd86..22e332b8821 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -5166,6 +5166,7 @@ declare namespace monaco.languages { * the formatting-feature. */ export interface DocumentFormattingEditProvider { + displayName?: string; /** * Provide formatting edits for a whole document. */ @@ -5177,6 +5178,7 @@ declare namespace monaco.languages { * the formatting-feature. */ export interface DocumentRangeFormattingEditProvider { + displayName?: string; /** * Provide formatting edits for a range in a document. * diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index eeec73908cf..bdd181a2cac 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -108,7 +108,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- outline - $registerOutlineSupport(handle: number, selector: ISerializedDocumentFilter[], displayName: string): void { + $registerDocumentSymbolProvider(handle: number, selector: ISerializedDocumentFilter[], displayName: string): void { this._registrations[handle] = modes.DocumentSymbolProviderRegistry.register(typeConverters.LanguageSelector.from(selector), { displayName, provideDocumentSymbols: (model: ITextModel, token: CancellationToken): Promise => { @@ -223,16 +223,18 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- formatting - $registerDocumentFormattingSupport(handle: number, selector: ISerializedDocumentFilter[]): void { + $registerDocumentFormattingSupport(handle: number, selector: ISerializedDocumentFilter[], displayName: string): void { this._registrations[handle] = modes.DocumentFormattingEditProviderRegistry.register(typeConverters.LanguageSelector.from(selector), { + displayName, provideDocumentFormattingEdits: (model: ITextModel, options: modes.FormattingOptions, token: CancellationToken): Promise => { return this._proxy.$provideDocumentFormattingEdits(handle, model.uri, options, token); } }); } - $registerRangeFormattingSupport(handle: number, selector: ISerializedDocumentFilter[]): void { + $registerRangeFormattingSupport(handle: number, selector: ISerializedDocumentFilter[], displayName: string): void { this._registrations[handle] = modes.DocumentRangeFormattingEditProviderRegistry.register(typeConverters.LanguageSelector.from(selector), { + displayName, provideDocumentRangeFormattingEdits: (model: ITextModel, range: EditorRange, options: modes.FormattingOptions, token: CancellationToken): Promise => { return this._proxy.$provideDocumentRangeFormattingEdits(handle, model.uri, range, options, token); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index b1dd94d4784..da87c79aaf5 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -286,7 +286,7 @@ export interface ISerializedSignatureHelpProviderMetadata { export interface MainThreadLanguageFeaturesShape extends IDisposable { $unregister(handle: number): void; - $registerOutlineSupport(handle: number, selector: ISerializedDocumentFilter[], label: string): void; + $registerDocumentSymbolProvider(handle: number, selector: ISerializedDocumentFilter[], label: string): void; $registerCodeLensSupport(handle: number, selector: ISerializedDocumentFilter[], eventHandle: number): void; $emitCodeLensEvent(eventHandle: number, event?: any): void; $registerDefinitionSupport(handle: number, selector: ISerializedDocumentFilter[]): void; @@ -297,8 +297,8 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $registerDocumentHighlightProvider(handle: number, selector: ISerializedDocumentFilter[]): void; $registerReferenceSupport(handle: number, selector: ISerializedDocumentFilter[]): void; $registerQuickFixSupport(handle: number, selector: ISerializedDocumentFilter[], supportedKinds?: string[]): void; - $registerDocumentFormattingSupport(handle: number, selector: ISerializedDocumentFilter[]): void; - $registerRangeFormattingSupport(handle: number, selector: ISerializedDocumentFilter[]): void; + $registerDocumentFormattingSupport(handle: number, selector: ISerializedDocumentFilter[], label: string): void; + $registerRangeFormattingSupport(handle: number, selector: ISerializedDocumentFilter[], label: string): void; $registerOnTypeFormattingSupport(handle: number, selector: ISerializedDocumentFilter[], autoFormatTriggerCharacters: string[]): void; $registerNavigateTypeSupport(handle: number): void; $registerRenameSupport(handle: number, selector: ISerializedDocumentFilter[], supportsResolveInitialValues: boolean): void; diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index b8b1d17ff4c..8379fa3ad79 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -1018,12 +1018,16 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return handle; } + private static _extLabel(ext: IExtensionDescription): string { + return ext.displayName || ext.name; + } + // --- outline registerDocumentSymbolProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider, metadata?: vscode.DocumentSymbolProviderMetadata): vscode.Disposable { const handle = this._addNewAdapter(new DocumentSymbolAdapter(this._documents, provider), extension); - const displayName = (metadata && metadata.label) || (extension && (extension.displayName || extension.name)) || undefined; - this._proxy.$registerOutlineSupport(handle, this._transformDocumentSelector(selector), displayName); + const displayName = (metadata && metadata.label) || ExtHostLanguageFeatures._extLabel(extension); + this._proxy.$registerDocumentSymbolProvider(handle, this._transformDocumentSelector(selector), displayName); return this._createDisposable(handle); } @@ -1152,7 +1156,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { registerDocumentFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable { const handle = this._addNewAdapter(new DocumentFormattingAdapter(this._documents, provider), extension); - this._proxy.$registerDocumentFormattingSupport(handle, this._transformDocumentSelector(selector)); + this._proxy.$registerDocumentFormattingSupport(handle, this._transformDocumentSelector(selector), ExtHostLanguageFeatures._extLabel(extension)); return this._createDisposable(handle); } @@ -1162,7 +1166,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { registerDocumentRangeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { const handle = this._addNewAdapter(new RangeFormattingAdapter(this._documents, provider), extension); - this._proxy.$registerRangeFormattingSupport(handle, this._transformDocumentSelector(selector)); + this._proxy.$registerRangeFormattingSupport(handle, this._transformDocumentSelector(selector), ExtHostLanguageFeatures._extLabel(extension)); return this._createDisposable(handle); }