-
-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathrunner.lua
More file actions
143 lines (112 loc) · 3.09 KB
/
runner.lua
File metadata and controls
143 lines (112 loc) · 3.09 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
140
141
142
143
local ui = require('java.ui.utils')
local class = require('java-core.utils.class')
local lsp_utils = require('java-core.utils.lsp')
local profile_config = require('java.api.profile_config')
local Run = require('java-runner.run')
local RunLogger = require('java-runner.run-logger')
local DapSetup = require('java-dap.setup')
---@class java.Runner
---@field runs table<string, java.Run>
---@field logger java.RunLogger
local Runner = class()
function Runner:_init()
self.runs = {}
self.curr_run = nil
self.logger = RunLogger()
end
---Starts a new run
---@param args string
function Runner:start_run(args)
local cmd, dap_config = self:select_dap_config(args)
if not cmd or not dap_config then
return
end
local run = self.runs[dap_config.mainClass]
-- get the default run if exist or create new run
if run then
if run.is_running then
run:stop()
end
else
run = Run(dap_config, cmd)
self.runs[dap_config.mainClass] = run
end
self.curr_run = run
self.logger:set_buffer(run.buffer)
run:start(cmd)
end
---Stops the user selected run
function Runner:stop_run()
local run = self:select_run()
if not run then
return
end
run:stop()
end
function Runner:toggle_open_log()
if self.logger:is_opened() then
self.logger:close()
else
if self.curr_run then
self.logger:create(self.curr_run.buffer)
end
end
end
---Switches the log to selected run
function Runner:switch_log()
local selected_run = self:select_run()
if not selected_run then
return
end
self.curr_run = selected_run
self.logger:set_buffer(selected_run.buffer)
end
---Prompt the user to select an active run and returns the selected run
---@private
---@return java.Run | nil
function Runner:select_run()
local active_main_classes = {} ---@type string[]
for _, run in pairs(self.runs) do
table.insert(active_main_classes, run.main_class)
end
local selected_main = ui.select('Select main class', active_main_classes)
if not selected_main then
return
end
return self.runs[selected_main]
end
---Returns the dap config for user selected main
---@param args string additional program arguments to pass
---@return string[] | nil
---@return java-dap.DapLauncherConfig | nil
function Runner:select_dap_config(args)
local dap = DapSetup(lsp_utils.get_jdtls())
local dap_config_list = dap:get_dap_config()
local selected_dap_config = ui.select('Select the main class (module -> mainClass)', dap_config_list, function(config)
return config.name
end)
if not selected_dap_config then
return nil, nil
end
local enriched_config = dap:enrich_config(selected_dap_config)
local class_paths = table.concat(enriched_config.classPaths, ':')
local main_class = enriched_config.mainClass
local java_exec = enriched_config.javaExec
local active_profile = profile_config.get_active_profile(enriched_config.name)
local vm_args = ''
local prog_args = args
if active_profile then
prog_args = (active_profile.prog_args or '') .. ' ' .. (args or '')
vm_args = active_profile.vm_args or ''
end
local cmd = {
java_exec,
vm_args,
'-cp',
class_paths,
main_class,
prog_args,
}
return cmd, selected_dap_config
end
return Runner