This repository was archived by the owner on Nov 30, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathdap.lua
More file actions
139 lines (113 loc) · 3.16 KB
/
dap.lua
File metadata and controls
139 lines (113 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
local log = require('java-core.utils.log')
local adapters = require('java-core.ls.adapters.test-adapter')
local List = require('java-core.utils.list')
local JavaDebug = require('java-core.ls.clients.java-debug-client')
local Promise = require('java-core.utils.promise')
---@class JavaCoreDap
---@field client LSPClient
---@field java_debug JavaCoreDebugClient
local M = {}
---Returns a new dap instance
---@param args { client: LSPClient }
---@return JavaCoreDap
function M:new(args)
local o = {
client = args.client,
}
o.java_debug = JavaDebug:new({
client = args.client,
})
setmetatable(o, self)
self.__index = self
return o
end
---@class JavaDapAdapter
---@field type string
---@field host string
---@field port integer
---Returns the dap adapter config
---@return Promise
function M:get_dap_adapter()
log.info('creating dap adapter for java')
return self.java_debug:start_debug_session():thenCall(
---@param port JavaDebugStartDebugSessionResponse
function(port)
return {
type = 'server',
host = '127.0.0.1',
port = port,
}
end
)
end
---@alias JavaDapConfigurationList JavaDapConfiguration[]
---Returns the dap configuration for the current project
---@return Promise
function M:get_dap_config()
log.info('creating dap configuration for java')
return self.java_debug:resolve_main_class():thenCall(
---@param mains JavaDebugResolveMainClassResponse
function(mains)
local config_promises = List:new(mains):map(function(main)
return self:get_dap_config_record(main)
end)
return Promise.all(config_promises)
end
)
end
---Returns the dap config for the given main class
---@param main JavaDebugResolveMainClassRecord
---@return Promise
function M:get_dap_config_record(main)
return Promise.all({
self.java_debug:resolve_classpath(main.mainClass, main.projectName),
self.java_debug:resolve_java_executable(main.mainClass, main.projectName),
}):thenCall(function(res)
---@type JavaDebugResolveClasspathResponse
local classpaths = res[1]
---@type JavaDebugResolveJavaExecutableResponse
local java_exec = res[2]
return adapters.get_dap_config(main, classpaths, java_exec)
end)
end
---Dap run with given config
---@param config JavaDapConfiguration
function M.dap_run(config)
log.info('running dap with config: ', config)
local function get_stream_reader(conn)
return vim.schedule_wrap(function(err, buffer)
assert(not err, err)
if buffer then
vim.print(buffer)
else
conn:close()
end
end)
end
---@type uv_tcp_t
local server
require('dap').run(config, {
before = function(conf)
log.debug('running before dap callback')
server = assert(vim.loop.new_tcp(), 'uv.new_tcp() must return handle')
server:bind('127.0.0.1', 0)
server:listen(128, function(err)
assert(not err, err)
local sock = assert(vim.loop.new_tcp(), 'uv.new_tcp must return handle')
server:accept(sock)
sock:read_start(get_stream_reader(sock))
end)
conf.args =
conf.args:gsub('-port ([0-9]+)', '-port ' .. server:getsockname().port)
return conf
end,
after = function()
vim.debug('running after dap callback')
if server then
server:shutdown()
server:close()
end
end,
})
end
return M