diff --git a/package.json b/package.json index 4bc0edc4df1..b51f8352437 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "@vscode/policy-watcher": "^1.1.4", "@vscode/proxy-agent": "^0.13.1", "@vscode/ripgrep": "^1.15.0", - "@vscode/sqlite3": "5.1.2-vscode", + "@vscode/sqlite3": "5.1.3-vscode", "@vscode/sudo-prompt": "9.3.1", "@vscode/vscode-languagedetection": "1.0.21", "graceful-fs": "4.2.8", diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 3ed9697e5e8..1d99af06647 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -1224,8 +1224,6 @@ export interface DocumentRangeFormattingEditProvider { readonly displayName?: string; - readonly canFormatMultipleRanges: boolean; - /** * Provide formatting edits for a range in a document. * @@ -1234,6 +1232,8 @@ export interface DocumentRangeFormattingEditProvider { * of the range to full syntax nodes. */ provideDocumentRangeFormattingEdits(model: model.ITextModel, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult; + + provideDocumentRangesFormattingEdits?(model: model.ITextModel, ranges: Range[], options: FormattingOptions, token: CancellationToken): ProviderResult; } /** * The document formatting provider interface defines the contract between extensions and diff --git a/src/vs/editor/contrib/format/browser/format.ts b/src/vs/editor/contrib/format/browser/format.ts index b12c941d375..4d64c886d09 100644 --- a/src/vs/editor/contrib/format/browser/format.ts +++ b/src/vs/editor/contrib/format/browser/format.ts @@ -217,12 +217,12 @@ export async function formatDocumentRangesWithProvider( const allEdits: TextEdit[] = []; const rawEditsList: TextEdit[][] = []; try { - if (provider.canFormatMultipleRanges) { + if (typeof provider.provideDocumentRangesFormattingEdits === 'function') { logService.trace(`[format][provideDocumentRangeFormattingEdits] (request)`, provider.extensionId?.value, ranges); - const result = (await provider.provideDocumentRangeFormattingEdits( + const result = (await provider.provideDocumentRangesFormattingEdits( model, - ranges[0], - { ...model.getFormattingOptions(), ranges }, + ranges, + model.getFormattingOptions(), cts.token )) || []; logService.trace(`[format][provideDocumentRangeFormattingEdits] (response)`, provider.extensionId?.value, result); diff --git a/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts index a8d848eb2a7..69a700b2843 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts @@ -83,14 +83,6 @@ export class GhostTextPart { } export class GhostTextReplacement { - public readonly parts: ReadonlyArray = [ - new GhostTextPart( - this.columnStart + this.length, - this.newLines, - false - ), - ]; - constructor( readonly lineNumber: number, readonly columnStart: number, @@ -98,6 +90,13 @@ export class GhostTextReplacement { readonly newLines: readonly string[], public readonly additionalReservedLineCount: number = 0, ) { } + public readonly parts: ReadonlyArray = [ + new GhostTextPart( + this.columnStart + this.length, + this.newLines, + false + ), + ]; renderForScreenReader(_lineText: string): string { return this.newLines.join('\n'); diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts index b5f88d222cd..4f79ed9fd6d 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts @@ -78,17 +78,26 @@ export class InlineCompletionsModel extends Disposable implements GhostTextWidge }) ); - this._register(this.editor.onDidType((e) => { this.handleUserInput(); })); + this._register( + this.editor.onDidType((e) => { + this.handleUserInput(); + }) + ); this._register( this.editor.onDidChangeCursorPosition((e) => { - if (e.reason === CursorChangeReason.Explicit || this.session && !this.session.isValid) { + if (e.reason === CursorChangeReason.Explicit || + this.session && !this.session.isValid) { this.hide(); } }) ); - this._register(toDisposable(() => { this.disposed = true; })); + this._register( + toDisposable(() => { + this.disposed = true; + }) + ); this._register( this.editor.onDidBlurEditorWidget(() => { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts index 14396d5890e..0ff0c4d5726 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { compareBy, findMaxBy, numberComparator } from 'vs/base/common/arrays'; -import { Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; @@ -15,7 +15,6 @@ import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { minimizeInlineCompletion, NormalizedInlineCompletion, normalizedInlineCompletionsEquals } from './inlineCompletionToGhostText'; -import { IObservable, observableValue, transaction } from 'vs/base/common/observable'; export interface SuggestWidgetState { /** @@ -35,11 +34,18 @@ export class SuggestWidgetInlineCompletionProvider extends Disposable { private isShiftKeyPressed = false; private _isActive = false; private _currentSuggestItemInfo: SuggestItemInfo | undefined = undefined; + private readonly onDidChangeEmitter = new Emitter(); - private readonly _state = observableValue('suggestWidgetInlineCompletionProvider.state', undefined as SuggestWidgetState | undefined); + public readonly onDidChange = this.onDidChangeEmitter.event; - public get state(): IObservable { - return this._state; + /** + * Returns undefined if the suggest widget is not active. + */ + get state(): SuggestWidgetState | undefined { + if (!this._isActive) { + return undefined; + } + return { selectedItem: this._currentSuggestItemInfo }; } constructor( @@ -81,7 +87,8 @@ export class SuggestWidgetInlineCompletionProvider extends Disposable { if (!normalizedSuggestItem) { return undefined; } - const valid = rangeStartsWith(normalizedItemToPreselect.range, normalizedSuggestItem.range) && + const valid = + rangeStartsWith(normalizedItemToPreselect.range, normalizedSuggestItem.range) && normalizedItemToPreselect.insertText.startsWith(normalizedSuggestItem.insertText); return { index, valid, prefixLength: normalizedSuggestItem.insertText.length, suggestItem }; }) @@ -135,9 +142,7 @@ export class SuggestWidgetInlineCompletionProvider extends Disposable { shouldFire = true; } if (shouldFire) { - transaction(tx => { - this._state.set(this._isActive ? { selectedItem: this._currentSuggestItemInfo } : undefined, tx); - }); + this.onDidChangeEmitter.fire(); } } diff --git a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts index 2ae06a79404..0de4fb2806a 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts @@ -16,7 +16,6 @@ import { BaseGhostTextWidgetModel, GhostText } from './ghostText'; import { provideInlineCompletions, TrackedInlineCompletions, UpdateOperation } from './inlineCompletionsModel'; import { inlineCompletionToGhostText, minimizeInlineCompletion, NormalizedInlineCompletion } from './inlineCompletionToGhostText'; import { SuggestWidgetInlineCompletionProvider } from './suggestWidgetInlineCompletionProvider'; -import { autorun } from 'vs/base/common/observable'; export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { private readonly suggestionInlineCompletionSource = this._register( @@ -46,7 +45,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { ) { super(editor); - this._register(autorun('update', reader => { + this._register(this.suggestionInlineCompletionSource.onDidChange(() => { if (!this.editor.hasModel()) { // onDidChange might be called when calling setModel on the editor, before we are disposed. return; @@ -54,7 +53,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { this.updateCacheSoon.schedule(); - const suggestWidgetState = this.suggestionInlineCompletionSource.state.read(reader); + const suggestWidgetState = this.suggestionInlineCompletionSource.state; if (!suggestWidgetState) { this.minReservedLineCount = 0; } @@ -91,7 +90,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { } private async updateCache() { - const state = this.suggestionInlineCompletionSource.state.get(); + const state = this.suggestionInlineCompletionSource.state; if (!state || !state.selectedItem) { return; } @@ -153,7 +152,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { const augmentedCompletion = minimizeInlineCompletion(model, this.cache.value?.completions[0]?.toLiveInlineCompletion()); const suggestWidgetState = this.suggestionInlineCompletionSource.state; - const suggestInlineCompletion = minimizeInlineCompletion(model, suggestWidgetState?.get()?.selectedItem?.normalizedInlineCompletion); + const suggestInlineCompletion = minimizeInlineCompletion(model, suggestWidgetState?.selectedItem?.normalizedInlineCompletion); const isAugmentedCompletionValid = augmentedCompletion && suggestInlineCompletion diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 17383518e0e..82437f89972 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -7212,7 +7212,6 @@ declare namespace monaco.languages { */ export interface DocumentRangeFormattingEditProvider { readonly displayName?: string; - readonly canFormatMultipleRanges: boolean; /** * Provide formatting edits for a range in a document. * @@ -7221,6 +7220,7 @@ declare namespace monaco.languages { * of the range to full syntax nodes. */ provideDocumentRangeFormattingEdits(model: editor.ITextModel, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult; + provideDocumentRangesFormattingEdits?(model: editor.ITextModel, ranges: Range[], options: FormattingOptions, token: CancellationToken): ProviderResult; } /** diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index dfdab4df0fa..69e8143eef8 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -32,7 +32,7 @@ import * as callh from 'vs/workbench/contrib/callHierarchy/common/callHierarchy' import * as search from 'vs/workbench/contrib/search/common/search'; import * as typeh from 'vs/workbench/contrib/typeHierarchy/common/typeHierarchy'; import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; -import { ExtHostContext, ExtHostLanguageFeaturesShape, ICallHierarchyItemDto, ICodeActionDto, ICodeActionProviderMetadataDto, IdentifiableInlineCompletion, IdentifiableInlineCompletions, IDocumentFilterDto, IIndentationRuleDto, IInlayHintDto, ILanguageConfigurationDto, ILanguageWordDefinitionDto, ILinkDto, ILocationDto, ILocationLinkDto, IOnEnterRuleDto, IRegExpDto, ISignatureHelpProviderMetadataDto, ISuggestDataDto, ISuggestDataDtoField, ISuggestResultDtoField, ITypeHierarchyItemDto, IWorkspaceSymbolDto, MainContext, MainThreadLanguageFeaturesShape, IRangeFormattingProviderMetadataDto } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostLanguageFeaturesShape, ICallHierarchyItemDto, ICodeActionDto, ICodeActionProviderMetadataDto, IdentifiableInlineCompletion, IdentifiableInlineCompletions, IDocumentFilterDto, IIndentationRuleDto, IInlayHintDto, ILanguageConfigurationDto, ILanguageWordDefinitionDto, ILinkDto, ILocationDto, ILocationLinkDto, IOnEnterRuleDto, IRegExpDto, ISignatureHelpProviderMetadataDto, ISuggestDataDto, ISuggestDataDtoField, ISuggestResultDtoField, ITypeHierarchyItemDto, IWorkspaceSymbolDto, MainContext, MainThreadLanguageFeaturesShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadLanguageFeatures) export class MainThreadLanguageFeatures extends Disposable implements MainThreadLanguageFeaturesShape { @@ -401,14 +401,18 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread })); } - $registerRangeFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string, metadata: IRangeFormattingProviderMetadataDto): void { + $registerRangeFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string, supportsRanges: boolean): void { this._registrations.set(handle, this._languageFeaturesService.documentRangeFormattingEditProvider.register(selector, { extensionId, displayName, - canFormatMultipleRanges: metadata.canFormatMultipleRanges, provideDocumentRangeFormattingEdits: (model: ITextModel, range: EditorRange, options: languages.FormattingOptions, token: CancellationToken): Promise => { return this._proxy.$provideDocumentRangeFormattingEdits(handle, model.uri, range, options, token); - } + }, + provideDocumentRangesFormattingEdits: !supportsRanges + ? undefined + : (model, ranges, options, token) => { + return this._proxy.$provideDocumentRangesFormattingEdits(handle, model.uri, ranges, options, token); + }, })); } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 3749d4765d4..16edcbb52f0 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -536,8 +536,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I registerDocumentFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable { return extHostLanguageFeatures.registerDocumentFormattingEditProvider(extension, checkSelector(selector), provider); }, - registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider, metadata?: vscode.DocumentRangeFormattingEditProviderMetadata): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(extension, checkSelector(selector), provider, metadata); + registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { + return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(extension, checkSelector(selector), provider); }, registerOnTypeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacters: string[]): vscode.Disposable { return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(extension, checkSelector(selector), provider, [firstTriggerCharacter].concat(moreTriggerCharacters)); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index a332f5a069d..18534ef8aca 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -356,10 +356,6 @@ export interface IDocumentFilterDto { notebookType?: string; } -export interface IRangeFormattingProviderMetadataDto { - readonly canFormatMultipleRanges?: boolean; -} - export interface ISignatureHelpProviderMetadataDto { readonly triggerCharacters: readonly string[]; readonly retriggerCharacters: readonly string[]; @@ -392,7 +388,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $registerQuickFixSupport(handle: number, selector: IDocumentFilterDto[], metadata: ICodeActionProviderMetadataDto, displayName: string, supportsResolve: boolean): void; $registerPasteEditProvider(handle: number, selector: IDocumentFilterDto[], supportsCopy: boolean, pasteMimeTypes: readonly string[]): void; $registerDocumentFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string): void; - $registerRangeFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string, metadata: IRangeFormattingProviderMetadataDto): void; + $registerRangeFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string, supportRanges: boolean): void; $registerOnTypeFormattingSupport(handle: number, selector: IDocumentFilterDto[], autoFormatTriggerCharacters: string[], extensionId: ExtensionIdentifier): void; $registerNavigateTypeSupport(handle: number, supportsResolve: boolean): void; $registerRenameSupport(handle: number, selector: IDocumentFilterDto[], supportsResolveInitialValues: boolean): void; @@ -1834,6 +1830,7 @@ export interface ExtHostLanguageFeaturesShape { $providePasteEdits(handle: number, requestId: number, uri: UriComponents, ranges: IRange[], dataTransfer: DataTransferDTO, token: CancellationToken): Promise; $provideDocumentFormattingEdits(handle: number, resource: UriComponents, options: languages.FormattingOptions, token: CancellationToken): Promise; $provideDocumentRangeFormattingEdits(handle: number, resource: UriComponents, range: IRange, options: languages.FormattingOptions, token: CancellationToken): Promise; + $provideDocumentRangesFormattingEdits(handle: number, resource: UriComponents, range: IRange[], options: languages.FormattingOptions, token: CancellationToken): Promise; $provideOnTypeFormattingEdits(handle: number, resource: UriComponents, position: IPosition, ch: string, options: languages.FormattingOptions, token: CancellationToken): Promise; $provideWorkspaceSymbols(handle: number, search: string, token: CancellationToken): Promise; $resolveWorkspaceSymbol(handle: number, symbol: IWorkspaceSymbolDto, token: CancellationToken): Promise; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index d1b5d4583a9..1bb47b948c3 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -18,7 +18,7 @@ import { regExpLeadsToEndlessLoop, regExpFlags } from 'vs/base/common/strings'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range as EditorRange } from 'vs/editor/common/core/range'; import { isFalsyOrEmpty, isNonEmptyArray, coalesce } from 'vs/base/common/arrays'; -import { isObject } from 'vs/base/common/types'; +import { assertType, isObject } from 'vs/base/common/types'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -579,6 +579,18 @@ class RangeFormattingAdapter { } return undefined; } + + async provideDocumentRangesFormattingEdits(resource: URI, ranges: IRange[], options: languages.FormattingOptions, token: CancellationToken): Promise { + assertType(typeof this._provider.provideDocumentRangesFormattingEdits === 'function', 'INVALID invocation of `provideDocumentRangesFormattingEdits`'); + + const document = this._documents.getDocument(resource); + const _ranges = ranges.map(typeConvert.Range.to); + const value = await this._provider.provideDocumentRangesFormattingEdits(document, _ranges, options, token); + if (Array.isArray(value)) { + return value.map(typeConvert.TextEdit.from); + } + return undefined; + } } class OnTypeFormattingAdapter { @@ -2055,13 +2067,13 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._withAdapter(handle, DocumentFormattingAdapter, adapter => adapter.provideDocumentFormattingEdits(URI.revive(resource), options, token), undefined, token); } - registerDocumentRangeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider, metadata?: vscode.DocumentRangeFormattingEditProviderMetadata): vscode.Disposable { - const canFormatMultipleRanges = metadata?.canFormatMultipleRanges ?? false; + registerDocumentRangeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { + const canFormatMultipleRanges = typeof provider.provideDocumentRangesFormattingEdits === 'function'; if (canFormatMultipleRanges) { checkProposedApiEnabled(extension, 'formatMultipleRanges'); } const handle = this._addNewAdapter(new RangeFormattingAdapter(this._documents, provider), extension); - this._proxy.$registerRangeFormattingSupport(handle, this._transformDocumentSelector(selector), extension.identifier, extension.displayName || extension.name, metadata ?? { canFormatMultipleRanges: false }); + this._proxy.$registerRangeFormattingSupport(handle, this._transformDocumentSelector(selector), extension.identifier, extension.displayName || extension.name, canFormatMultipleRanges); return this._createDisposable(handle); } @@ -2069,6 +2081,10 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._withAdapter(handle, RangeFormattingAdapter, adapter => adapter.provideDocumentRangeFormattingEdits(URI.revive(resource), range, options, token), undefined, token); } + $provideDocumentRangesFormattingEdits(handle: number, resource: UriComponents, ranges: IRange[], options: languages.FormattingOptions, token: CancellationToken): Promise { + return this._withAdapter(handle, RangeFormattingAdapter, adapter => adapter.provideDocumentRangesFormattingEdits(URI.revive(resource), ranges, options, token), undefined, token); + } + registerOnTypeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, triggerCharacters: string[]): vscode.Disposable { const handle = this._addNewAdapter(new OnTypeFormattingAdapter(this._documents, provider), extension); this._proxy.$registerOnTypeFormattingSupport(handle, this._transformDocumentSelector(selector), triggerCharacters, extension.identifier); diff --git a/src/vscode-dts/vscode.proposed.formatMultipleRanges.d.ts b/src/vscode-dts/vscode.proposed.formatMultipleRanges.d.ts index 0cc19ac3ff3..702bc14b4f8 100644 --- a/src/vscode-dts/vscode.proposed.formatMultipleRanges.d.ts +++ b/src/vscode-dts/vscode.proposed.formatMultipleRanges.d.ts @@ -7,37 +7,23 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/158776 - /** - * Metadata about a registered {@linkcode DocumentRangeFormattingEditProvider}. - */ - export interface DocumentRangeFormattingEditProviderMetadata { - /** - * `true` if the range formatting provider supports formatting multiple ranges at once. - */ - readonly canFormatMultipleRanges?: boolean; - } - - export interface FormattingOptions2 { - - /** - * The list of multiple ranges to format at once, if the provider supports it. - */ - // TODO@API should this all ranges or all except for the first range? - // TODO@API needs a name that is more descriptive - ranges?: Range[]; - - [key: string]: boolean | number | string | undefined | object; - } export interface DocumentRangeFormattingEditProvider { - provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions & FormattingOptions2, token: CancellationToken): ProviderResult; - } - export namespace languages { /** + * Provide formatting edits for multiple ranges in a document. * - * @param metadata Metadata about the provider. + * The given ranges are hints and providers can decide to format a smaller + * or larger range. Often this is done by adjusting the start and end + * of the range to full syntax nodes. + * + * @param document The document in which the command was invoked. + * @param ranges The ranges which should be formatted. + * @param options Options controlling formatting. + * @param token A cancellation token. + * @return A set of text edits or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined`, `null`, or an empty array. */ - export function registerDocumentRangeFormattingEditProvider(selector: DocumentSelector, provider: DocumentRangeFormattingEditProvider, metadata?: DocumentRangeFormattingEditProviderMetadata): Disposable; + provideDocumentRangesFormattingEdits?(document: TextDocument, ranges: Range[], options: FormattingOptions, token: CancellationToken): ProviderResult; } } diff --git a/yarn.lock b/yarn.lock index af436b0b9a7..7589e4449b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1325,10 +1325,10 @@ https-proxy-agent "^5.0.0" proxy-from-env "^1.1.0" -"@vscode/sqlite3@5.1.2-vscode": - version "5.1.2-vscode" - resolved "https://registry.yarnpkg.com/@vscode/sqlite3/-/sqlite3-5.1.2-vscode.tgz#ba15962d23ad784a43ecbaaa22c93f17f93b2400" - integrity sha512-CIH0BWzQJA97teb1f3aAoyylztPdg1WqThHEvVPWXr8UO0+VtIa+ha20Q2PGYV4AGfPtkPnhUrSYpJDxnVhW/g== +"@vscode/sqlite3@5.1.3-vscode": + version "5.1.3-vscode" + resolved "https://registry.yarnpkg.com/@vscode/sqlite3/-/sqlite3-5.1.3-vscode.tgz#4fe81eb2422edef7b13869fe9d66663f4d925e93" + integrity sha512-B5PNGHzfdnLiAQiC4YjOt0YETtxVfRcyIJya39RdNNFW63ApCznsu4m+jrW6r1sDFCPSSTNurAwx1Bl25FCQFw== dependencies: node-addon-api "^4.2.0" tar "^6.1.11"