Skip to content

Commit 308c17c

Browse files
committed
feat: add code refactoring APIs
1 parent 0fc8f59 commit 308c17c

File tree

4 files changed

+103
-42
lines changed

4 files changed

+103
-42
lines changed

lua/java-core/ls/clients/java-debug-client.lua

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ end
1717
---Returns a list of main classes in the current workspace
1818
---@return JavaDebugResolveMainClassRecord[] # resolved main class
1919
function DebugClient:resolve_main_class()
20-
return self:execute_command('vscode.java.resolveMainClass')
20+
return self:workspace_execute_command('vscode.java.resolveMainClass')
2121
end
2222

2323
---Returns module paths and class paths of a given main class
2424
---@param project_name string
2525
---@param main_class string
2626
---@return string[][] # resolved class and module paths
2727
function DebugClient:resolve_classpath(main_class, project_name)
28-
return self:execute_command(
28+
return self:workspace_execute_command(
2929
'vscode.java.resolveClasspath',
3030
{ main_class, project_name }
3131
)
@@ -36,7 +36,7 @@ end
3636
---@param main_class string
3737
---@return string # path to java executable
3838
function DebugClient:resolve_java_executable(main_class, project_name)
39-
return self:execute_command('vscode.java.resolveJavaExecutable', {
39+
return self:workspace_execute_command('vscode.java.resolveJavaExecutable', {
4040
main_class,
4141
project_name,
4242
})
@@ -54,7 +54,7 @@ function DebugClient:check_project_settings(
5454
inheritedOptions,
5555
expectedOptions
5656
)
57-
return self:execute_command(
57+
return self:workspace_execute_command(
5858
'vscode.java.checkProjectSettings',
5959
vim.fn.json_encode({
6060
className = main_class,
@@ -68,7 +68,7 @@ end
6868
---Starts a debug session and returns the port number
6969
---@return integer # port number of the debug session
7070
function DebugClient:start_debug_session()
71-
return self:execute_command('vscode.java.startDebugSession')
71+
return self:workspace_execute_command('vscode.java.startDebugSession')
7272
end
7373

7474
---@enum CompileWorkspaceStatus
@@ -91,7 +91,7 @@ function DebugClient:build_workspace(
9191
file_path,
9292
is_full_build
9393
)
94-
return self:execute_command(
94+
return self:workspace_execute_command(
9595
'vscode.java.buildWorkspace',
9696
vim.fn.json_encode({
9797
mainClass = main_class,

lua/java-core/ls/clients/java-test-client.lua

+6-10
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,8 @@ local JdtlsClient = require('java-core.ls.clients.jdtls-client')
2424
---@field children java-core.TestDetailsWithRange[]
2525

2626
---@class java-core.TestRange
27-
---@field start CursorPoint
28-
---@field end CursorPoint
29-
30-
---@class CursorPoint
31-
---@field line integer
32-
---@field character integer
27+
---@field start nvim.CursorPoint
28+
---@field end nvim.CursorPoint
3329

3430
---@class java-core.TestClient: java-core.JdtlsClient
3531
local TestClient = class(JdtlsClient)
@@ -41,7 +37,7 @@ end
4137
---Returns a list of project details in the current root
4238
---@return java-core.TestDetails[] # test details of the projects
4339
function TestClient:find_java_projects()
44-
return self:execute_command(
40+
return self:workspace_execute_command(
4541
'vscode.java.test.findJavaProjects',
4642
{ vim.uri_from_fname(self.client.config.root_dir) }
4743
)
@@ -52,7 +48,7 @@ end
5248
---@param token? string
5349
---@return java-core.TestDetailsWithChildren[] # test package details
5450
function TestClient:find_test_packages_and_types(handler, token)
55-
return self:execute_command(
51+
return self:workspace_execute_command(
5652
'vscode.java.test.findTestPackagesAndTypes',
5753
{ handler, token }
5854
)
@@ -63,7 +59,7 @@ end
6359
---@param token? string
6460
---@return java-core.TestDetailsWithChildrenAndRange[] # test details
6561
function TestClient:find_test_types_and_methods(file_uri, token)
66-
return self:execute_command(
62+
return self:workspace_execute_command(
6763
'vscode.java.test.findTestTypesAndMethods',
6864
{ file_uri, token }
6965
)
@@ -88,7 +84,7 @@ end
8884
---@param args JavaCoreTestResolveJUnitLaunchArgumentsParams
8985
---@return JavaCoreTestJunitLaunchArguments # junit launch arguments
9086
function TestClient:resolve_junit_launch_arguments(args)
91-
local launch_args = self:execute_command(
87+
local launch_args = self:workspace_execute_command(
9288
'vscode.java.test.junit.argument',
9389
vim.fn.json_encode(args)
9490
)

lua/java-core/ls/clients/jdtls-client.lua

+90-21
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,37 @@ local class = require('java-core.utils.class')
33
local async = require('java-core.utils.async')
44
local await = async.wait_handle_error
55

6+
---@alias jdtls.RequestMethod
7+
---| 'workspace/executeCommand'
8+
---| 'java/inferSelection'
9+
---| 'java/getRefactorEdit'
10+
11+
---@alias jdtls.CodeActionCommand
12+
---| 'extractVariable'
13+
---| 'assignVariable'
14+
---| 'extractVariableAllOccurrence'
15+
---| 'extractConstant'
16+
---| 'extractMethod'
17+
---| 'extractField'
18+
---| 'extractInterface'
19+
---| 'changeSignature'
20+
---| 'assignField'
21+
---| 'convertVariableToField'
22+
---| 'invertVariable'
23+
---| 'introduceParameter'
24+
---| 'convertAnonymousClassToNestedCommand') {
25+
26+
---@class jdtls.RefactorWorkspaceEdit
27+
---@field edit lsp.WorkspaceEdit
28+
---@field command? lsp.Command
29+
---@field errorMessage? string
30+
31+
---@class jdtls.SelectionInfo
32+
---@field name string
33+
---@field length number
34+
---@field offset number
35+
---@field params? string[]
36+
637
---@class java-core.JdtlsClient
738
---@field client LspClient
839
local JdtlsClient = class()
@@ -23,44 +54,82 @@ function JdtlsClient:new(args)
2354
return o
2455
end
2556

26-
---Executes a workspace/executeCommand and returns the result
27-
---@param command string
28-
---@param arguments? string | string[]
29-
---@param buffer? integer
30-
---@return any
31-
function JdtlsClient:execute_command(command, arguments, buffer)
32-
log.debug('executing: workspace/executeCommand - ' .. command)
33-
34-
local cmd_info = {
35-
command = command,
36-
arguments = arguments,
37-
}
57+
---Sends a LSP request
58+
---@param method jdtls.RequestMethod
59+
---@param params lsp.ExecuteCommandParams
60+
---@param buffer? number
61+
function JdtlsClient:request(method, params, buffer)
62+
log.debug('sending LSP request: ' .. method)
3863

3964
return await(function(callback)
4065
local on_response = function(err, result)
4166
if err then
42-
log.error(command .. ' failed! arguments: ', arguments, ' error: ', err)
67+
log.error(method .. ' failed! arguments: ', params, ' error: ', err)
4368
else
44-
log.debug(command .. ' success! response: ', result)
69+
log.debug(method .. ' success! response: ', result)
4570
end
4671

4772
callback(err, result)
4873
end
4974

50-
return self.client.request(
51-
'workspace/executeCommand',
52-
cmd_info,
53-
on_response,
54-
buffer
55-
)
75+
return self.client.request(method, params, on_response, buffer)
5676
end)
5777
end
5878

79+
---Executes a workspace/executeCommand and returns the result
80+
---@param command string workspace command to execute
81+
---@param params? lsp.LSPAny[]
82+
---@param buffer? integer
83+
---@return lsp.LSPAny
84+
function JdtlsClient:workspace_execute_command(command, params, buffer)
85+
return self:request('workspace/executeCommand', {
86+
command = command,
87+
arguments = params,
88+
}, buffer)
89+
end
90+
91+
---Returns more information about the object the cursor is on
92+
---@param command jdtls.RequestMethod
93+
---@param params lsp.CodeActionParams
94+
---@param buffer? number
95+
---@return jdtls.SelectionInfo[]
96+
function JdtlsClient:java_infer_selection(command, params, buffer)
97+
return self:request('java/inferSelection', {
98+
command = command,
99+
context = params,
100+
}, buffer)
101+
end
102+
103+
---Returns refactor details
104+
---@param command jdtls.CodeActionCommand
105+
---@param context lsp.CodeActionParams
106+
---@param options lsp.FormattingOptions
107+
---@param command_arguments jdtls.SelectionInfo[];
108+
---@param buffer? number
109+
---@return jdtls.RefactorWorkspaceEdit
110+
function JdtlsClient:java_get_refactor_edit(
111+
command,
112+
context,
113+
options,
114+
command_arguments,
115+
buffer
116+
)
117+
local params = {
118+
command = command,
119+
context = context,
120+
options = options,
121+
commandArguments = command_arguments,
122+
}
123+
124+
return self:request('java/getRefactorEdit', params, buffer)
125+
end
126+
59127
---Returns the decompiled class file content
60128
---@param uri string uri of the class file
61129
---@return string # decompiled file content
62130
function JdtlsClient:java_decompile(uri)
63-
return self:execute_command('java.decompile', { uri })
131+
---@type string
132+
return self:workspace_execute_command('java.decompile', { uri })
64133
end
65134

66135
function JdtlsClient:get_capability(...)

lua/java-core/ls/servers/jdtls/lspconfig-types.lua

+1-5
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@
2929
---`workspace/didChangeConfiguration` notification from the Nvim client to the language server.
3030
---These settings allow a user to change optional runtime settings of the language server.
3131

32-
---@class LspClientRequestParameters
33-
---@field command string
34-
---@field arguments string | string[] | nil
35-
3632
---@class LspClientResponse
3733
---@field err LspClientResponseError
3834

@@ -55,7 +51,7 @@
5551
---@field name string
5652
---@field notify fun(method: string, params: object): boolean
5753
---@field offset_encoding string
58-
---@field request fun(method:string,params:LspClientRequestParameters,callback:LspClientRequest, bufnr?:number): any
54+
---@field request fun(method:string, params:lsp.ExecuteCommandParams,callback:LspClientRequest, bufnr?:number): any
5955
---@field request_sync function
6056
---@field requests object
6157
---@field rpc object

0 commit comments

Comments
 (0)