Skip to content

Commit 80cb18b

Browse files
authored
Implement confirmation for non-fatal "Move Instance Method" problems before applying edits (#4482)
* implement confirmation for move instance method errors before applying edits Signed-off-by: Morgan Chang <shin19991207@gmail.com> * advertise support for move refactoring confirmation Signed-off-by: Morgan Chang <shin19991207@gmail.com> --------- Signed-off-by: Morgan Chang <shin19991207@gmail.com>
1 parent 56d9cc3 commit 80cb18b

3 files changed

Lines changed: 32 additions & 4 deletions

File tree

src/extension.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
255255
advancedExtractRefactoringSupport: true,
256256
inferSelectionSupport: ["extractMethod", "extractVariable", "extractField"],
257257
moveRefactoringSupport: true,
258+
moveRefactoringConfirmationSupport: true,
258259
clientHoverProvider: true,
259260
clientDocumentSymbolProvider: true,
260261
gradleChecksumWrapperPromptSupport: true,

src/protocol.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,10 @@ export interface RenamePosition {
350350
}
351351

352352
export interface RefactorWorkspaceEdit {
353-
edit: WorkspaceEdit;
353+
edit?: WorkspaceEdit;
354354
command?: Command;
355355
errorMessage?: string;
356+
confirmationToken?: string;
356357
}
357358

358359
export interface GetRefactorEditParams {
@@ -411,6 +412,7 @@ export interface MoveParams {
411412
params: CodeActionParams;
412413
destination?: any;
413414
updateReferences?: boolean;
415+
confirmationToken?: string;
414416
}
415417

416418
export interface MoveDestinationsResponse {

src/refactorAction.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { commands, ExtensionContext, Position, QuickPickItem, TextDocument, Uri,
66
import { FormattingOptions, WorkspaceEdit, RenameFile, DeleteFile, TextDocumentEdit, CodeActionParams, SymbolInformation } from 'vscode-languageclient';
77
import { LanguageClient } from 'vscode-languageclient/node';
88
import { Commands as javaCommands } from './commands';
9-
import { GetRefactorEditRequest, MoveRequest, RefactorWorkspaceEdit, RenamePosition, GetMoveDestinationsRequest, SearchSymbols, SelectionInfo, InferSelectionRequest, GetChangeSignatureInfoRequest, ChangeSignatureInfo } from './protocol';
9+
import { GetRefactorEditRequest, MoveRequest, RefactorWorkspaceEdit, RenamePosition, GetMoveDestinationsRequest, SearchSymbols, SelectionInfo, InferSelectionRequest, GetChangeSignatureInfoRequest, ChangeSignatureInfo, MoveParams } from './protocol';
1010
import { ChangeSignaturePanel } from './refactoring/changeSignaturePanel';
1111
import { getExtractInterfaceArguments, revealExtractedInterface } from './refactoring/extractInterface';
1212

@@ -252,6 +252,32 @@ async function applyRefactorEdit(languageClient: LanguageClient, refactorEdit: R
252252
}
253253
}
254254

255+
async function requestMoveWithConfirmation(languageClient: LanguageClient, moveParams: MoveParams): Promise<RefactorWorkspaceEdit | undefined> {
256+
let refactorEdit: RefactorWorkspaceEdit = await languageClient.sendRequest(MoveRequest.type, moveParams);
257+
if (!refactorEdit?.confirmationToken) {
258+
await applyRefactorEdit(languageClient, refactorEdit);
259+
return refactorEdit;
260+
}
261+
262+
const continueAction = 'Continue';
263+
const detail = 'Review the details below before continuing:\n\n' + refactorEdit.errorMessage;
264+
const selection = await window.showWarningMessage(
265+
'This refactoring may change program behavior. Continue anyway?',
266+
{ modal: true, detail },
267+
continueAction,
268+
);
269+
if (selection !== continueAction) {
270+
return undefined;
271+
}
272+
273+
refactorEdit = await languageClient.sendRequest(MoveRequest.type, {
274+
...moveParams,
275+
confirmationToken: refactorEdit.confirmationToken,
276+
});
277+
await applyRefactorEdit(languageClient, refactorEdit);
278+
return refactorEdit;
279+
}
280+
255281
async function moveFile(languageClient: LanguageClient, fileUris: Uri[]) {
256282
if (!hasCommonParent(fileUris)) {
257283
window.showErrorMessage("Moving files from different directories are not supported. Please make sure they are from the same directory.");
@@ -417,13 +443,12 @@ async function moveInstanceMethod(languageClient: LanguageClient, params: CodeAc
417443
return;
418444
}
419445

420-
const refactorEdit: RefactorWorkspaceEdit = await languageClient.sendRequest(MoveRequest.type, {
446+
await requestMoveWithConfirmation(languageClient, {
421447
moveKind: 'moveInstanceMethod',
422448
sourceUris: [ params.textDocument.uri ],
423449
params,
424450
destination: selected.destination,
425451
});
426-
await applyRefactorEdit(languageClient, refactorEdit);
427452
}
428453

429454
async function moveStaticMember(languageClient: LanguageClient, params: CodeActionParams, commandInfo: any) {

0 commit comments

Comments
 (0)