Skip to content

Commit 3254832

Browse files
authored
feat: add enrich config to adapter (#3)
* feat: add enrich config to adapter * some other config was moved from java-core to java-dap * fix(test): adding missing dep for tests
1 parent c6cd92c commit 3254832

8 files changed

Lines changed: 250 additions & 6 deletions

File tree

lua/java-dap/api/runner.lua

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
local class = require('java-core.utils.class')
2+
local log = require('java-core.utils.log')
3+
4+
---@class java-dap.DapRunner
5+
---@field private server uv_tcp_t
6+
local Runner = class()
7+
8+
---@return java-dap.DapRunner
9+
function Runner:new()
10+
local o = {
11+
server = nil,
12+
}
13+
14+
setmetatable(o, self)
15+
self.__index = self
16+
return o
17+
end
18+
19+
---Dap run with given config
20+
---@param config java-core.DapLauncherConfig
21+
---@param report java_test.JUnitTestReport
22+
function Runner:run_by_config(config, report)
23+
log.debug('running dap with config: ', config)
24+
25+
require('dap').run(config --[[@as Configuration]], {
26+
before = function(conf)
27+
return self:before(conf, report)
28+
end,
29+
30+
after = function()
31+
return self:after()
32+
end,
33+
})
34+
end
35+
36+
---Runs before the dap run
37+
---@private
38+
---@param conf java-core.DapLauncherConfig
39+
---@param report java_test.JUnitTestReport
40+
---@return java-core.DapLauncherConfig
41+
function Runner:before(conf, report)
42+
log.debug('running "before" callback')
43+
44+
self.server = assert(vim.loop.new_tcp(), 'uv.new_tcp() must return handle')
45+
self.server:bind('127.0.0.1', 0)
46+
self.server:listen(128, function(err)
47+
assert(not err, err)
48+
49+
local sock = assert(vim.loop.new_tcp(), 'uv.new_tcp must return handle')
50+
self.server:accept(sock)
51+
local success = sock:read_start(report:get_stream_reader(sock))
52+
assert(success == 0, 'failed to listen to reader')
53+
end)
54+
55+
-- replace the port number in the generated args
56+
conf.args =
57+
conf.args:gsub('-port ([0-9]+)', '-port ' .. self.server:getsockname().port)
58+
59+
return conf
60+
end
61+
62+
---Runs aafter the dap run
63+
---@private
64+
function Runner:after()
65+
vim.debug('running "after" callback')
66+
67+
if self.server then
68+
self.server:shutdown()
69+
self.server:close()
70+
end
71+
end
72+
73+
return Runner

lua/java-dap/api/setup.lua

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
local adapters = require('java-dap.data.adapters')
2+
3+
local log = require('java-core.utils.log')
4+
local class = require('java-core.utils.class')
5+
6+
local JavaDebug = require('java-core.ls.clients.java-debug-client')
7+
8+
---@class java-dap.Setup
9+
---@field private client LspClient
10+
---@field private java_debug java-core.DebugClient
11+
local Setup = class()
12+
13+
---@param client any
14+
function Setup:_init(client)
15+
self.client = client
16+
17+
self.java_debug = JavaDebug(client)
18+
end
19+
20+
---@class java-dap.DapAdapter
21+
---@field type string
22+
---@field host string
23+
---@field port integer
24+
25+
---Returns the dap adapter config
26+
---@return java-dap.DapAdapter # dap adapter details
27+
function Setup:get_dap_adapter()
28+
log.debug('creating dap adapter for java')
29+
30+
local port = self.java_debug:start_debug_session()
31+
32+
return {
33+
type = 'server',
34+
host = '127.0.0.1',
35+
port = port,
36+
enrich_config = function(config, callback)
37+
local updated_config = self:enrich_config(config)
38+
callback(updated_config)
39+
end,
40+
}
41+
end
42+
43+
---Returns the launch config filled with required data if missing in the passed
44+
--config
45+
---@private
46+
---@param config java-dap.DapLauncherConfigOverridable
47+
---@return java-dap.DapLauncherConfigOverridable
48+
function Setup:enrich_config(config)
49+
config = vim.deepcopy(config)
50+
51+
local main = config.mainClass
52+
local project = config.projectName
53+
54+
assert(main, 'To enrich the config, mainClass should already be present')
55+
assert(project, 'To enrich the config, projectName should already be present')
56+
57+
if not config.classPaths or config.modulePaths then
58+
local paths = self.java_debug:resolve_classpath(main, project)
59+
60+
if not config.modulePaths then
61+
config.modulePaths = paths[1]
62+
end
63+
64+
if not config.classPaths then
65+
config.classPaths = paths[2]
66+
end
67+
end
68+
69+
if not config.javaExec then
70+
local java_exec = self.java_debug:resolve_java_executable(main, project)
71+
config.javaExec = java_exec
72+
end
73+
74+
return config
75+
end
76+
77+
---Returns the dap configuration for the current project
78+
---@return java-dap.DapLauncherConfig[] # dap configuration details
79+
function Setup:get_dap_config()
80+
log.info('creating dap configuration for java')
81+
82+
local mains = self.java_debug:resolve_main_class()
83+
local config = {}
84+
85+
for _, main in ipairs(mains) do
86+
table.insert(config, adapters.main_to_dap_launch_config(main))
87+
end
88+
89+
return config
90+
end
91+
92+
return Setup
93+
94+
---@class java-dap.DapLauncherConfigOverridable
95+
---@field name? string
96+
---@field type? string
97+
---@field request? string
98+
---@field mainClass? string
99+
---@field projectName? string
100+
---@field cwd? string
101+
---@field classPaths? string[]
102+
---@field modulePaths? string[]
103+
---@field vmArgs? string
104+
---@field noDebug? boolean
105+
---@field javaExec? string
106+
---@field args? string
107+
---@field env? { [string]: string; }
108+
---@field envFile? string
109+
---@field sourcePaths? string[]
110+
---@field preLaunchTask? string
111+
---@field postDebugTask? string
112+
113+
---@class java-dap.DapLauncherConfig
114+
---@field name string
115+
---@field type string
116+
---@field request string
117+
---@field mainClass string
118+
---@field projectName string
119+
---@field cwd string
120+
---@field classPaths string[]
121+
---@field modulePaths string[]
122+
---@field vmArgs string
123+
---@field noDebug boolean
124+
---@field javaExec string
125+
---@field args string
126+
---@field env? { [string]: string; }
127+
---@field envFile? string
128+
---@field sourcePaths string[]
129+
---@field preLaunchTask? string
130+
---@field postDebugTask? string

lua/java-dap/data/adapters.lua

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
local M = {}
2+
3+
---Returns the dap config record
4+
---@param main JavaDebugResolveMainClassRecord
5+
---@return java-dap.DapLauncherConfig
6+
function M.main_to_dap_launch_config(main)
7+
local project_name = main.projectName
8+
local main_class = main.mainClass
9+
10+
return {
11+
request = 'launch',
12+
type = 'java',
13+
name = string.format('%s -> %s', project_name, main_class),
14+
projectName = project_name,
15+
mainClass = main_class,
16+
}
17+
end
18+
19+
return M

lua/java-dap/init.lua

Whitespace-only changes.

tests/before-test.lua

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/java-dap/java_dap_spec.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
local plugin = require('java-dap')
2-
31
describe('setup', function()
42
it('java-dap', function()
5-
assert('plugin module should be avaiable', plugin)
3+
assert('setup module should be avaiable', require('java-dap.api.setup'))
64
end)
75
end)

tests/prepare-config.lua

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
22

3+
---@diagnostic disable: assign-type-mismatch
4+
---@param path string
5+
---@return string|nil
6+
local function local_plug(path)
7+
return vim.fn.isdirectory(path) == 1 and path or nil
8+
end
9+
310
if not vim.loop.fs_stat(lazypath) then
411
vim.fn.system({
512
'git',
@@ -20,6 +27,12 @@ require('lazy').setup({
2027
'nvim-lua/plenary.nvim',
2128
lazy = false,
2229
},
30+
{
31+
'nvim-java/nvim-java-core',
32+
---@diagnostic disable-next-line: assign-type-mismatch
33+
dir = local_plug('~/Workspace/nvim-java-core'),
34+
lazy = false,
35+
},
2336
}, {
2437
root = temp_path,
2538
lockfile = temp_path .. '/lazy-lock.json',

tests/test-config.lua

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---@diagnostic disable: assign-type-mismatch
2+
---@param dev_path string
3+
---@param plug_path string
4+
---@return string|nil
5+
local function local_plug(dev_path, plug_path)
6+
return (vim.fn.isdirectory(dev_path) == 1) and dev_path or plug_path
7+
end
8+
9+
local plug_path = './.test_plugins'
10+
11+
vim.opt.rtp:append(plug_path .. '/plenary.nvim')
12+
vim.opt.rtp:append(
13+
local_plug('~/Workspace/nvim-java-core', plug_path .. '/nvim-java-core')
14+
)

0 commit comments

Comments
 (0)