Skip to content

Commit ea5371b

Browse files
committed
feat: add generate constructor code action
1 parent c3996df commit ea5371b

File tree

5 files changed

+113
-7
lines changed

5 files changed

+113
-7
lines changed

lua/java/api/build.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ local M = {}
77
---@param is_full_build? boolean
88
---@return number
99
function M.full_build_workspace(is_full_build)
10-
local JavaCoreJdtlsClient = require('java-core.ls.clients.jdtls-client')
10+
local JdtlsClient = require('java-core.ls.clients.jdtls-client')
1111
local jdtls = require('java.utils.jdtls2')
1212
local buf_util = require('java.utils.buffer')
1313
local notify = require('java-core.utils.notify')
1414

1515
is_full_build = type(is_full_build) == 'boolean' and is_full_build or true
1616

1717
return async(function()
18-
JavaCoreJdtlsClient(jdtls()):java_build_workspace(
18+
JdtlsClient(jdtls()):java_build_workspace(
1919
is_full_build,
2020
buf_util.get_curr_buf()
2121
)

lua/java/api/generate.lua

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
local M = {}
2+
3+
---@param params nvim.CodeActionParamsResponse
4+
function M.generate_constructor(params)
5+
local JdtlsClient = require('java-core.ls.clients.jdtls-client')
6+
local async = require('java-core.utils.async').sync
7+
local get_client = require('java.utils.jdtls2')
8+
local get_error_handler = require('java.handlers.error')
9+
local ui = require('java.utils.ui')
10+
11+
return async(function()
12+
local jdtls = JdtlsClient(get_client())
13+
local status = jdtls:java_check_constructors_status(params.params)
14+
15+
if not status or not status.constructors then
16+
return
17+
end
18+
19+
local selected_constructor = ui.select(
20+
'Select super class constructor(s).',
21+
status.constructors,
22+
function(constructor)
23+
return string.format(
24+
'%s %s',
25+
constructor.name,
26+
table.concat(constructor.parameters, ', ')
27+
)
28+
end
29+
)
30+
31+
if not selected_constructor then
32+
return
33+
end
34+
35+
local selected_fields = ui.multi_select(
36+
'Select Fields:',
37+
status.fields,
38+
function(field)
39+
return field.name
40+
end
41+
)
42+
43+
local edit = jdtls:java_generate_constructor({
44+
context = params.params,
45+
constructors = { selected_constructor },
46+
fields = selected_fields or {},
47+
})
48+
49+
vim.lsp.util.apply_workspace_edit(edit, 'utf-8')
50+
end)
51+
.catch(get_error_handler('Generating constructor failed'))
52+
.run()
53+
end
54+
55+
return M

lua/java/api/refactor.lua

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ function M.convert_variable_to_field()
2929
M.extract('convertVariableToField')
3030
end
3131

32-
---
3332
---@param refactor_command jdtls.CodeActionCommand
3433
function M.extract(refactor_command)
3534
return async(function()

lua/java/commands/init.lua

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,13 @@ M.commands = {
194194
}
195195

196196
M.handlers = {
197+
---@param _ lsp.Command
198+
---@param params nvim.CodeActionParamsResponse
199+
[M.commands.GENERATE_CONSTRUCTORS_PROMPT] = function(_, params)
200+
require('java.api.generate').generate_constructor(params)
201+
end,
202+
203+
---@param is_full_build boolean
197204
[M.commands.COMPILE_WORKSPACE] = function(is_full_build)
198205
require('java.api.build').full_build_workspace(is_full_build)
199206
end,

lua/java/utils/ui.lua

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
local async = require('java-core.utils.async')
2-
local await = async.wait
1+
local wait = require('async.waits.wait')
32
local notify = require('java-core.utils.notify')
3+
local List = require('java-core.utils.list')
44

55
local M = {}
66

@@ -11,16 +11,61 @@ local M = {}
1111
---@param format_item? fun(item: T): string
1212
---@return T
1313
function M.select(prompt, values, format_item)
14-
return await(function(callback)
14+
return wait(function(callback)
1515
vim.ui.select(values, {
1616
prompt = prompt,
1717
format_item = format_item,
1818
}, callback)
1919
end)
2020
end
2121

22+
function M.multi_select(prompt, values, format_item)
23+
return wait(function(callback)
24+
local wrapped_items = List:new(values):map(function(item, index)
25+
return {
26+
index = index,
27+
is_selected = false,
28+
value = item,
29+
}
30+
end)
31+
32+
local open_select
33+
34+
open_select = function()
35+
vim.ui.select(wrapped_items, {
36+
prompt = prompt,
37+
format_item = function(item)
38+
local prefix = item.is_selected and '* ' or ''
39+
return prefix
40+
.. (format_item and format_item(item.value) or item.value)
41+
end,
42+
}, function(selected)
43+
if not selected then
44+
local selected_items = wrapped_items
45+
:filter(function(item)
46+
return item.is_selected
47+
end)
48+
:map(function(item)
49+
return item.value
50+
end)
51+
52+
callback(#selected_items > 0 and selected_items or nil)
53+
return
54+
end
55+
56+
wrapped_items[selected.index].is_selected =
57+
not wrapped_items[selected.index].is_selected
58+
59+
open_select()
60+
end)
61+
end
62+
63+
open_select()
64+
end)
65+
end
66+
2267
function M.input(prompt)
23-
return await(function(callback)
68+
return wait(function(callback)
2469
vim.ui.input({
2570
prompt = prompt,
2671
}, callback)

0 commit comments

Comments
 (0)