From b1a49720e24a43b3b34b1df3c15a2fc25b55de28 Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Fri, 22 Dec 2023 15:00:44 -0500 Subject: [PATCH] Introduces keybinding and setting to perform typical on-save cleanup actions manually Signed-off-by: Hope Hadfield --- package.json | 24 ++++++++++++++++++++++-- package.nls.json | 3 ++- src/commands.ts | 1 + src/protocol.ts | 6 +++++- src/sourceAction.ts | 37 ++++++++++++++++++++++++++++++++++--- 5 files changed, 64 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 03a31b16d1..e6ee274c11 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,8 @@ "workspaceContains:.classpath", "workspaceContains:*/.classpath", "onCommand:_java.templateVariables", - "onCommand:_java.metadataFilesGeneration" + "onCommand:_java.metadataFilesGeneration", + "onCommand:java.action.filesExplorerPasteActionNoLS" ], "main": "./dist/extension", "contributes": { @@ -1167,7 +1168,7 @@ "properties": { "java.cleanup.actionsOnSave": { "type": "array", - "markdownDescription": "The list of clean ups to be run on the current document when it's saved. Clean ups can automatically fix code style or programming mistakes. Click [HERE](command:_java.learnMoreAboutCleanUps) to learn more about what each clean up does.", + "markdownDescription": "The list of clean ups to be run on the current document when it's saved or when the cleanup command is issued. Clean ups can automatically fix code style or programming mistakes. Click [HERE](command:_java.learnMoreAboutCleanUps) to learn more about what each clean up does.", "items": { "type": "string", "enum": [ @@ -1189,6 +1190,11 @@ "scope": "window", "order": 10 }, + "java.saveActions.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable key for manual cleanup actions typically done on save" + }, "java.saveActions.organizeImports": { "type": "boolean", "default": false, @@ -1513,6 +1519,11 @@ "command": "java.action.filesExplorerPasteAction", "title": "%java.action.filesExplorerPasteAction%", "category": "Java" + }, + { + "command": "java.action.doCleanup", + "title": "%java.action.doCleanup%", + "category": "Java" } ], "keybindings": [ @@ -1536,6 +1547,11 @@ "key": "ctrl+shift+v", "mac": "cmd+shift+v", "when": "explorerViewletFocus && config.editor.pasteAs.enabled" + }, + { + "command": "java.action.doCleanup", + "key": "ctrl+shift+alt+s", + "when": "javaLSReady && config.java.cleanup.manualKey && editorLangId == java" } ], "menus": { @@ -1658,6 +1674,10 @@ { "command": "java.action.filesExplorerPasteAction", "when": "false" + }, + { + "command": "java.action.doCleanup", + "when": "false" } ], "view/title": [ diff --git a/package.nls.json b/package.nls.json index ca4690b3bb..06a2d854d8 100644 --- a/package.nls.json +++ b/package.nls.json @@ -26,5 +26,6 @@ "java.clean.sharedIndexes": "Clean Shared Indexes", "java.server.restart": "Restart Java Language Server", "java.edit.smartSemicolonDetection": "Java Smart Semicolon Detection", - "java.action.filesExplorerPasteAction": "Paste clipboard text into a file" + "java.action.filesExplorerPasteAction": "Paste clipboard text into a file", + "java.action.doCleanup": "Performs cleanup actions" } diff --git a/src/commands.ts b/src/commands.ts index 5ad0a8085a..dc9715a655 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -183,6 +183,7 @@ export namespace Commands { * Organize imports silently. */ export const ORGANIZE_IMPORTS_SILENTLY = "java.edit.organizeImports"; + export const MANUAL_CLEANUP = "java.action.doCleanup"; /** * Handle a paste event. */ diff --git a/src/protocol.ts b/src/protocol.ts index a8f6052392..d8d18d9a91 100644 --- a/src/protocol.ts +++ b/src/protocol.ts @@ -1,5 +1,6 @@ 'use strict'; +import { Command, Range } from 'vscode'; import { CodeActionParams, ExecuteCommandParams, @@ -13,7 +14,6 @@ import { WorkspaceEdit, WorkspaceSymbolParams, } from 'vscode-languageclient'; -import { Command, Range } from 'vscode'; /** * The message type. Copied from vscode protocol @@ -233,6 +233,10 @@ export namespace OrganizeImportsRequest { export const type = new RequestType('java/organizeImports'); } +export namespace ManualCleanupRequest { + export const type = new RequestType('java/manualCleanup'); +} + export interface ImportCandidate { fullyQualifiedName: string; id: string; diff --git a/src/sourceAction.ts b/src/sourceAction.ts index c2acea150d..9c15edf013 100644 --- a/src/sourceAction.ts +++ b/src/sourceAction.ts @@ -1,17 +1,37 @@ 'use strict'; -import { commands, window, ExtensionContext, ViewColumn, Uri, Disposable, workspace, TextEditorRevealType } from 'vscode'; +import { Disposable, ExtensionContext, TextEditorRevealType, Uri, ViewColumn, commands, window, workspace } from 'vscode'; import { CodeActionParams, WorkspaceEdit } from 'vscode-languageclient'; import { LanguageClient } from 'vscode-languageclient/node'; import { Commands } from './commands'; -import { ListOverridableMethodsRequest, AddOverridableMethodsRequest, CheckHashCodeEqualsStatusRequest, GenerateHashCodeEqualsRequest, -OrganizeImportsRequest, ImportCandidate, ImportSelection, GenerateToStringRequest, CheckToStringStatusRequest, VariableBinding, GenerateAccessorsRequest, CheckConstructorStatusRequest, GenerateConstructorsRequest, CheckDelegateMethodsStatusRequest, GenerateDelegateMethodsRequest, AccessorKind, AccessorCodeActionRequest, AccessorCodeActionParams } from './protocol'; +import { + AccessorCodeActionParams, + AccessorCodeActionRequest, + AccessorKind, + AddOverridableMethodsRequest, + CheckConstructorStatusRequest, + CheckDelegateMethodsStatusRequest, + CheckHashCodeEqualsStatusRequest, + CheckToStringStatusRequest, + GenerateAccessorsRequest, + GenerateConstructorsRequest, + GenerateDelegateMethodsRequest, + GenerateHashCodeEqualsRequest, + GenerateToStringRequest, + ImportCandidate, ImportSelection, + ListOverridableMethodsRequest, + ManualCleanupRequest, + OrganizeImportsRequest, + VariableBinding +} from './protocol'; import { applyWorkspaceEdit } from './standardLanguageClient'; +import { getActiveLanguageClient } from './extension'; export function registerCommands(languageClient: LanguageClient, context: ExtensionContext) { registerOverrideMethodsCommand(languageClient, context); registerHashCodeEqualsCommand(languageClient, context); registerOrganizeImportsCommand(languageClient, context); + registerManualCleanupCommand(languageClient, context); registerChooseImportCommand(context); registerGenerateToStringCommand(languageClient, context); registerGenerateAccessorsCommand(languageClient, context); @@ -67,6 +87,17 @@ function registerOverrideMethodsCommand(languageClient: LanguageClient, context: })); } +function registerManualCleanupCommand(languageClient: LanguageClient, context: ExtensionContext): void { + context.subscriptions.push(commands.registerCommand(Commands.MANUAL_CLEANUP, async () => { + const languageClient: LanguageClient | undefined = await getActiveLanguageClient(); + const document = window.activeTextEditor !== undefined ? window.activeTextEditor.document : undefined; + if (document !== undefined){ + const workspaceEdit = await languageClient.sendRequest(ManualCleanupRequest.type, languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document)); + await applyWorkspaceEdit(workspaceEdit, languageClient); + } + })); +} + function registerHashCodeEqualsCommand(languageClient: LanguageClient, context: ExtensionContext): void { context.subscriptions.push(commands.registerCommand(Commands.HASHCODE_EQUALS_PROMPT, async (params: CodeActionParams) => { const result = await languageClient.sendRequest(CheckHashCodeEqualsStatusRequest.type, params);