editor: support stepIn, stepOut, next and pause commands

This commit is contained in:
Dmitry Sharshakov 2021-08-22 11:16:11 +03:00
parent dfc70a12f3
commit d93cd2a261
No known key found for this signature in database
GPG key ID: 471FD32E15FD8473
4 changed files with 73 additions and 6 deletions

View file

@ -30,6 +30,7 @@ pub struct Client {
pub breakpoints: HashMap<PathBuf, Vec<SourceBreakpoint>>, pub breakpoints: HashMap<PathBuf, Vec<SourceBreakpoint>>,
// TODO: multiple threads support // TODO: multiple threads support
pub stack_pointer: Option<StackFrame>, pub stack_pointer: Option<StackFrame>,
pub stopped_thread: Option<usize>,
pub is_running: bool, pub is_running: bool,
} }
@ -52,6 +53,7 @@ impl Client {
// //
breakpoints: HashMap::new(), breakpoints: HashMap::new(),
stack_pointer: None, stack_pointer: None,
stopped_thread: None,
is_running: false, is_running: false,
}; };
@ -346,9 +348,7 @@ impl Client {
} }
pub async fn pause(&mut self, thread_id: usize) -> Result<()> { pub async fn pause(&mut self, thread_id: usize) -> Result<()> {
let args = requests::PauseArguments { let args = requests::PauseArguments { thread_id };
thread_id,
};
self.request::<requests::Pause>(args).await self.request::<requests::Pause>(args).await
} }

View file

@ -276,6 +276,7 @@ impl Application {
if let Some(main) = main { if let Some(main) = main {
let (bt, _) = debugger.stack_trace(main.id).await.unwrap(); let (bt, _) = debugger.stack_trace(main.id).await.unwrap();
debugger.stack_pointer = bt.get(0).cloned(); debugger.stack_pointer = bt.get(0).cloned();
debugger.stopped_thread = Some(main.id);
} }
let scope = match thread_id { let scope = match thread_id {

View file

@ -307,6 +307,10 @@ impl Command {
dap_start, "Start debug session", dap_start, "Start debug session",
dap_run, "Begin program execution", dap_run, "Begin program execution",
dap_continue, "Continue program execution", dap_continue, "Continue program execution",
dap_pause, "Pause program execution",
dap_in, "Step in",
dap_out, "Step out",
dap_next, "Step to next",
dap_variable_scopes, "List variable scopes", dap_variable_scopes, "List variable scopes",
dap_terminate, "End debug session", dap_terminate, "End debug session",
suspend, "Suspend" suspend, "Suspend"
@ -4394,15 +4398,73 @@ fn dap_continue(cx: &mut Context) {
.set_status("Debuggee is already running".to_owned()); .set_status("Debuggee is already running".to_owned());
return; return;
} }
// assume 0 to continue all threads for now
// FIXME: spec conformant behavior here let request = debugger.continue_thread(debugger.stopped_thread.unwrap());
let request = debugger.continue_thread(0);
let _ = block_on(request).unwrap(); let _ = block_on(request).unwrap();
debugger.is_running = true; debugger.is_running = true;
debugger.stack_pointer = None; debugger.stack_pointer = None;
} }
} }
fn dap_pause(cx: &mut Context) {
use helix_lsp::block_on;
if let Some(debugger) = &mut cx.editor.debugger {
if !debugger.is_running {
cx.editor.set_status("Debuggee is not running".to_owned());
return;
}
let request = debugger.pause(debugger.stopped_thread.unwrap());
let _ = block_on(request).unwrap();
}
}
fn dap_in(cx: &mut Context) {
use helix_lsp::block_on;
if let Some(debugger) = &mut cx.editor.debugger {
if debugger.is_running {
cx.editor
.set_status("Debuggee is already running".to_owned());
return;
}
let request = debugger.step_in(debugger.stopped_thread.unwrap());
let _ = block_on(request).unwrap();
}
}
fn dap_out(cx: &mut Context) {
use helix_lsp::block_on;
if let Some(debugger) = &mut cx.editor.debugger {
if debugger.is_running {
cx.editor
.set_status("Debuggee is already running".to_owned());
return;
}
let request = debugger.step_out(debugger.stopped_thread.unwrap());
let _ = block_on(request).unwrap();
}
}
fn dap_next(cx: &mut Context) {
use helix_lsp::block_on;
if let Some(debugger) = &mut cx.editor.debugger {
if debugger.is_running {
cx.editor
.set_status("Debuggee is already running".to_owned());
return;
}
let request = debugger.next(debugger.stopped_thread.unwrap());
let _ = block_on(request).unwrap();
}
}
fn dap_variable_scopes(cx: &mut Context) { fn dap_variable_scopes(cx: &mut Context) {
use helix_lsp::block_on; use helix_lsp::block_on;

View file

@ -490,6 +490,10 @@ impl Default for Keymaps {
"b" => dap_toggle_breakpoint, "b" => dap_toggle_breakpoint,
"r" => dap_run, "r" => dap_run,
"c" => dap_continue, "c" => dap_continue,
"h" => dap_pause,
"j" => dap_in,
"k" => dap_out,
"l" => dap_next,
"z" => dap_variable_scopes, "z" => dap_variable_scopes,
"t" => dap_terminate, "t" => dap_terminate,
}, },