diff --git a/src/vs/workbench/api/browser/mainThreadBulkEdits.ts b/src/vs/workbench/api/browser/mainThreadBulkEdits.ts index 3ec836b8962..4f6683520d0 100644 --- a/src/vs/workbench/api/browser/mainThreadBulkEdits.ts +++ b/src/vs/workbench/api/browser/mainThreadBulkEdits.ts @@ -3,9 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; +import { revive } from 'vs/base/common/marshalling'; +import { IBulkEditService, ResourceFileEdit, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService'; +import { WorkspaceEdit } from 'vs/editor/common/languages'; import { ILogService } from 'vs/platform/log/common/log'; -import { IWorkspaceEditDto, MainContext, MainThreadBulkEditsShape, reviveWorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { IWorkspaceEditDto, MainContext, MainThreadBulkEditsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ResourceNotebookCellEdit } from 'vs/workbench/contrib/bulkEdit/browser/bulkCellEdits'; import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; @@ -16,15 +20,38 @@ export class MainThreadBulkEdits implements MainThreadBulkEditsShape { _extHostContext: IExtHostContext, @IBulkEditService private readonly _bulkEditService: IBulkEditService, @ILogService private readonly _logService: ILogService, + @IUriIdentityService private readonly _uriIdentService: IUriIdentityService ) { } dispose(): void { } $tryApplyWorkspaceEdit(dto: IWorkspaceEditDto, undoRedoGroupId?: number): Promise { - const edits = reviveWorkspaceEditDto(dto); + const edits = reviveWorkspaceEditDto(dto, this._uriIdentService); return this._bulkEditService.apply(edits, { undoRedoGroupId }).then(() => true, err => { - this._logService.warn('IGNORING workspace edit', err); + this._logService.warn(`IGNORING workspace edit: ${err}`); return false; }); } } + +export function reviveWorkspaceEditDto(data: IWorkspaceEditDto, uriIdentityService: IUriIdentityService): WorkspaceEdit; +export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined, uriIdentityService: IUriIdentityService): WorkspaceEdit | undefined; +export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined, uriIdentityService: IUriIdentityService): WorkspaceEdit | undefined { + if (!data || !data.edits) { + return data; + } + const result = revive(data); + for (const edit of result.edits) { + if (ResourceTextEdit.is(edit)) { + edit.resource = uriIdentityService.asCanonicalUri(edit.resource); + } + if (ResourceFileEdit.is(edit)) { + edit.newResource = edit.newResource && uriIdentityService.asCanonicalUri(edit.newResource); + edit.oldResource = edit.oldResource && uriIdentityService.asCanonicalUri(edit.oldResource); + } + if (ResourceNotebookCellEdit.is(edit)) { + edit.resource = uriIdentityService.asCanonicalUri(edit.resource); + } + } + return data; +} diff --git a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts index b8156d19ef5..63ab79c3ce4 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts @@ -6,7 +6,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { FileOperation, IFileService } from 'vs/platform/files/common/files'; import { extHostCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; -import { ExtHostContext, reviveWorkspaceEditDto } from '../common/extHost.protocol'; +import { ExtHostContext } from '../common/extHost.protocol'; import { localize } from 'vs/nls'; import { IWorkingCopyFileOperationParticipant, IWorkingCopyFileService, SourceTargetPair, IFileOperationUndoRedoInfo } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; @@ -20,6 +20,8 @@ import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { reviveWorkspaceEditDto } from 'vs/workbench/api/browser/mainThreadBulkEdits'; @extHostCustomer export class MainThreadFileSystemEventService { @@ -37,7 +39,8 @@ export class MainThreadFileSystemEventService { @IDialogService dialogService: IDialogService, @IStorageService storageService: IStorageService, @ILogService logService: ILogService, - @IEnvironmentService envService: IEnvironmentService + @IEnvironmentService envService: IEnvironmentService, + @IUriIdentityService uriIdentService: IUriIdentityService ) { const proxy = extHostContext.getProxy(ExtHostContext.ExtHostFileSystemEventService); @@ -147,7 +150,7 @@ export class MainThreadFileSystemEventService { logService.info('[onWill-handler] applying additional workspace edit from extensions', data.extensionNames); await bulkEditService.apply( - reviveWorkspaceEditDto(data.edit), + reviveWorkspaceEditDto(data.edit, uriIdentService), { undoRedoGroupId: undoInfo?.undoRedoGroupId, showPreview } ); } diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 3e537e533af..feb3e786610 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -24,13 +24,15 @@ import { ITextModel } from 'vs/editor/common/model'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { decodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { reviveWorkspaceEditDto } from 'vs/workbench/api/browser/mainThreadBulkEdits'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import { DataTransferCache } from 'vs/workbench/api/common/shared/dataTransferCache'; 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, reviveWorkspaceEditDto } 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 { @@ -43,6 +45,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread @ILanguageService private readonly _languageService: ILanguageService, @ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService, @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + @IUriIdentityService private readonly _uriIdentService: IUriIdentityService ) { super(); @@ -139,8 +142,8 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread } } - private static _reviveCodeActionDto(data: ReadonlyArray): languages.CodeAction[] { - data?.forEach(code => reviveWorkspaceEditDto(code.edit)); + private static _reviveCodeActionDto(data: ReadonlyArray, uriIdentService: IUriIdentityService): languages.CodeAction[] { + data?.forEach(code => reviveWorkspaceEditDto(code.edit, uriIdentService)); return data; } @@ -340,7 +343,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread return undefined; } return { - actions: MainThreadLanguageFeatures._reviveCodeActionDto(listDto.actions), + actions: MainThreadLanguageFeatures._reviveCodeActionDto(listDto.actions, this._uriIdentService), dispose: () => { if (typeof listDto.cacheId === 'number') { this._proxy.$releaseCodeActions(handle, listDto.cacheId); @@ -356,7 +359,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread if (supportsResolve) { provider.resolveCodeAction = async (codeAction: languages.CodeAction, token: CancellationToken): Promise => { const data = await this._proxy.$resolveCodeAction(handle, (codeAction).cacheId!, token); - codeAction.edit = reviveWorkspaceEditDto(data); + codeAction.edit = reviveWorkspaceEditDto(data, this._uriIdentService); return codeAction; }; } @@ -369,7 +372,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread private readonly _pasteEditProviders = new Map(); $registerPasteEditProvider(handle: number, selector: IDocumentFilterDto[], supportsCopy: boolean, pasteMimeTypes: readonly string[]): void { - const provider = new MainThreadPasteEditProvider(handle, this._proxy, supportsCopy, pasteMimeTypes); + const provider = new MainThreadPasteEditProvider(handle, this._proxy, supportsCopy, pasteMimeTypes, this._uriIdentService); this._pasteEditProviders.set(handle, provider); this._registrations.set(handle, combinedDisposable( this._languageFeaturesService.documentPasteEditProvider.register(selector, provider), @@ -446,7 +449,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread $registerRenameSupport(handle: number, selector: IDocumentFilterDto[], supportResolveLocation: boolean): void { this._registrations.set(handle, this._languageFeaturesService.renameProvider.register(selector, { provideRenameEdits: (model: ITextModel, position: EditorPosition, newName: string, token: CancellationToken) => { - return this._proxy.$provideRenameEdits(handle, model.uri, position, newName, token).then(reviveWorkspaceEditDto); + return this._proxy.$provideRenameEdits(handle, model.uri, position, newName, token).then(data => reviveWorkspaceEditDto(data, this._uriIdentService)); }, resolveRenameLocation: supportResolveLocation ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => this._proxy.$resolveRenameLocation(handle, model.uri, position, token) @@ -885,7 +888,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread private readonly _documentOnDropEditProviders = new Map(); $registerDocumentOnDropEditProvider(handle: number, selector: IDocumentFilterDto[]): void { - const provider = new MainThreadDocumentOnDropEditProvider(handle, this._proxy); + const provider = new MainThreadDocumentOnDropEditProvider(handle, this._proxy, this._uriIdentService); this._documentOnDropEditProviders.set(handle, provider); this._registrations.set(handle, combinedDisposable( this._languageFeaturesService.documentOnDropEditProvider.register(selector, provider), @@ -915,6 +918,7 @@ class MainThreadPasteEditProvider implements languages.DocumentPasteEditProvider private readonly _proxy: ExtHostLanguageFeaturesShape, supportsCopy: boolean, pasteMimeTypes: readonly string[], + @IUriIdentityService private readonly _uriIdentService: IUriIdentityService ) { this.pasteMimeTypes = pasteMimeTypes; @@ -950,7 +954,7 @@ class MainThreadPasteEditProvider implements languages.DocumentPasteEditProvider return { insertText: result.insertText, - additionalEdit: result.additionalEdit ? reviveWorkspaceEditDto(result.additionalEdit) : undefined, + additionalEdit: result.additionalEdit ? reviveWorkspaceEditDto(result.additionalEdit, this._uriIdentService) : undefined, }; } finally { request.dispose(); @@ -969,6 +973,7 @@ class MainThreadDocumentOnDropEditProvider implements languages.DocumentOnDropEd constructor( private readonly handle: number, private readonly _proxy: ExtHostLanguageFeaturesShape, + @IUriIdentityService private readonly _uriIdentService: IUriIdentityService ) { } async provideDocumentOnDropEdits(model: ITextModel, position: IPosition, dataTransfer: VSDataTransfer, token: CancellationToken): Promise { @@ -981,7 +986,7 @@ class MainThreadDocumentOnDropEditProvider implements languages.DocumentOnDropEd } return { insertText: edit.insertText, - additionalEdit: reviveWorkspaceEditDto(edit.additionalEdit), + additionalEdit: reviveWorkspaceEditDto(edit.additionalEdit, this._uriIdentService), }; } finally { request.dispose(); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 38759f95fb0..70fcbe5a562 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -10,7 +10,6 @@ import { SerializedError } from 'vs/base/common/errors'; import { IRelativePattern } from 'vs/base/common/glob'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { revive } from 'vs/base/common/marshalling'; import * as performance from 'vs/base/common/performance'; import Severity from 'vs/base/common/severity'; import { URI, UriComponents } from 'vs/base/common/uri'; @@ -1635,15 +1634,6 @@ export interface IWorkspaceEditDto { edits: Array; } -export function reviveWorkspaceEditDto(data: IWorkspaceEditDto): languages.WorkspaceEdit; -export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined): languages.WorkspaceEdit | undefined; -export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined): languages.WorkspaceEdit | undefined { - if (data && data.edits) { - revive(data); - } - return data; -} - export type ICommandDto = { $ident?: number } & languages.Command; export interface ICodeActionDto { diff --git a/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts b/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts index 2ceac7fde44..8264a9439a2 100644 --- a/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts +++ b/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts @@ -57,6 +57,7 @@ import 'vs/editor/contrib/inlayHints/browser/inlayHintsController'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; import { assertType } from 'vs/base/common/types'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; function assertRejects(fn: () => Promise, message: string = 'Expected rejection') { return fn().then(() => assert.ok(false, message), _err => assert.ok(true)); @@ -95,6 +96,11 @@ suite('ExtHostLanguageFeatureCommands', function () { // Use IInstantiationService to get typechecking when instantiating rpcProtocol = new TestRPCProtocol(); const services = new ServiceCollection(); + services.set(IUriIdentityService, new class extends mock() { + override asCanonicalUri(uri: URI): URI { + return uri; + } + }); services.set(ILanguageFeaturesService, new SyncDescriptor(LanguageFeaturesService)); services.set(IExtensionService, new class extends mock() { override async activateByEvent() { diff --git a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts index 5048b1ac86a..17a22143276 100644 --- a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts @@ -54,6 +54,7 @@ import { OutlineModel } from 'vs/editor/contrib/documentSymbols/browser/outlineM import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; import { CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; suite('ExtHostLanguageFeatures', function () { @@ -88,6 +89,11 @@ suite('ExtHostLanguageFeatures', function () { const instantiationService = new TestInstantiationService(); instantiationService.stub(IMarkerService, MarkerService); instantiationService.set(ILanguageFeaturesService, languageFeaturesService); + instantiationService.set(IUriIdentityService, new class extends mock() { + override asCanonicalUri(uri: URI): URI { + return uri; + } + }); inst = instantiationService; } diff --git a/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts b/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts new file mode 100644 index 00000000000..3182972950e --- /dev/null +++ b/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts @@ -0,0 +1,56 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { IWorkspaceTextEditDto } from 'vs/workbench/api/common/extHost.protocol'; +import { mock } from 'vs/base/test/common/mock'; +import { Event } from 'vs/base/common/event'; +import { URI } from 'vs/base/common/uri'; +import { FileSystemProviderCapabilities, IFileService } from 'vs/platform/files/common/files'; +import { reviveWorkspaceEditDto } from 'vs/workbench/api/browser/mainThreadBulkEdits'; +import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; +import { IWorkspaceTextEdit } from 'vs/editor/common/languages'; + +suite('MainThreadBulkEdits', function () { + + test('"Rename failed to apply edits" in monorepo with pnpm #158845', function () { + + + const fileService = new class extends mock() { + override onDidChangeFileSystemProviderCapabilities = Event.None; + override onDidChangeFileSystemProviderRegistrations = Event.None; + + override hasProvider(uri: URI) { + return true; + } + + override hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean { + // if (resource.scheme === 'case' && capability === FileSystemProviderCapabilities.PathCaseSensitive) { + // return false; + // } + // NO capabilities, esp not being case-sensitive + return false; + } + }; + + const uriIdentityService = new UriIdentityService(fileService); + + const edits: IWorkspaceTextEditDto[] = [ + { resource: URI.from({ scheme: 'case', path: '/hello/WORLD/foo.txt' }), textEdit: { range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }, text: 'sss' }, versionId: undefined }, + { resource: URI.from({ scheme: 'case', path: '/heLLO/world/fOO.txt' }), textEdit: { range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }, text: 'sss' }, versionId: undefined }, + { resource: URI.from({ scheme: 'case', path: '/other/path.txt' }), textEdit: { range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }, text: 'sss' }, versionId: undefined }, + { resource: URI.from({ scheme: 'foo', path: '/other/path.txt' }), textEdit: { range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }, text: 'sss' }, versionId: undefined }, + ]; + + + const out = reviveWorkspaceEditDto({ edits }, uriIdentityService); + + assert.strictEqual((out.edits[0]).resource.path, '/hello/WORLD/foo.txt'); + assert.strictEqual((out.edits[1]).resource.path, '/hello/WORLD/foo.txt'); // the FIRST occurrence defined the shape! + assert.strictEqual((out.edits[2]).resource.path, '/other/path.txt'); + assert.strictEqual((out.edits[3]).resource.path, '/other/path.txt'); + + }); +}); diff --git a/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts b/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts index 6ee05e73b5a..7f9da848d8c 100644 --- a/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts @@ -46,7 +46,6 @@ import { TestNotificationService } from 'vs/platform/notification/test/common/te import { INotificationService } from 'vs/platform/notification/common/notification'; import { TestTextResourcePropertiesService, TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { extUri } from 'vs/base/common/resources'; import { ITextSnapshot } from 'vs/editor/common/model'; import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -57,6 +56,7 @@ import { LanguageFeatureDebounceService } from 'vs/editor/common/services/langua import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; import { MainThreadBulkEdits } from 'vs/workbench/api/browser/mainThreadBulkEdits'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; suite('MainThreadEditors', () => { @@ -113,6 +113,7 @@ suite('MainThreadEditors', () => { services.set(IModelService, modelService); services.set(ICodeEditorService, new TestCodeEditorService(themeService)); services.set(IFileService, new TestFileService()); + services.set(IUriIdentityService, new SyncDescriptor(UriIdentityService)); services.set(IEditorService, new TestEditorService()); services.set(ILifecycleService, new TestLifecycleService()); services.set(IWorkingCopyService, new TestWorkingCopyService()); @@ -181,9 +182,6 @@ suite('MainThreadEditors', () => { return undefined; } }); - services.set(IUriIdentityService, new class extends mock() { - override get extUri() { return extUri; } - }); const instaService = new InstantiationService(services); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts index 0773ea35c63..ae0212db0c5 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts @@ -29,7 +29,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { ILifecycleService, ShutdownReason } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; -function reviveEdits(edits: ResourceEdit[]): ResourceEdit[] { +function liftEdits(edits: ResourceEdit[]): ResourceEdit[] { return edits.map(edit => { if (ResourceTextEdit.is(edit)) { return ResourceTextEdit.lift(edit); @@ -181,7 +181,7 @@ export class BulkEditService implements IBulkEditService { } async apply(editsIn: ResourceEdit[] | WorkspaceEdit, options?: IBulkEditOptions): Promise { - let edits = reviveEdits(Array.isArray(editsIn) ? editsIn : editsIn.edits); + let edits = liftEdits(Array.isArray(editsIn) ? editsIn : editsIn.edits); if (edits.length === 0) { return { ariaSummary: localize('nothing', "Made no edits") };