editor: support stepIn, stepOut, next and pause commands
This commit is contained in:
parent
dfc70a12f3
commit
d93cd2a261
4 changed files with 73 additions and 6 deletions
|
@ -30,6 +30,7 @@ pub struct Client {
|
|||
pub breakpoints: HashMap<PathBuf, Vec<SourceBreakpoint>>,
|
||||
// TODO: multiple threads support
|
||||
pub stack_pointer: Option<StackFrame>,
|
||||
pub stopped_thread: Option<usize>,
|
||||
pub is_running: bool,
|
||||
}
|
||||
|
||||
|
@ -52,6 +53,7 @@ impl Client {
|
|||
//
|
||||
breakpoints: HashMap::new(),
|
||||
stack_pointer: None,
|
||||
stopped_thread: None,
|
||||
is_running: false,
|
||||
};
|
||||
|
||||
|
@ -346,9 +348,7 @@ impl Client {
|
|||
}
|
||||
|
||||
pub async fn pause(&mut self, thread_id: usize) -> Result<()> {
|
||||
let args = requests::PauseArguments {
|
||||
thread_id,
|
||||
};
|
||||
let args = requests::PauseArguments { thread_id };
|
||||
|
||||
self.request::<requests::Pause>(args).await
|
||||
}
|
||||
|
|
|
@ -276,6 +276,7 @@ impl Application {
|
|||
if let Some(main) = main {
|
||||
let (bt, _) = debugger.stack_trace(main.id).await.unwrap();
|
||||
debugger.stack_pointer = bt.get(0).cloned();
|
||||
debugger.stopped_thread = Some(main.id);
|
||||
}
|
||||
|
||||
let scope = match thread_id {
|
||||
|
|
|
@ -307,6 +307,10 @@ impl Command {
|
|||
dap_start, "Start debug session",
|
||||
dap_run, "Begin 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_terminate, "End debug session",
|
||||
suspend, "Suspend"
|
||||
|
@ -4394,15 +4398,73 @@ fn dap_continue(cx: &mut Context) {
|
|||
.set_status("Debuggee is already running".to_owned());
|
||||
return;
|
||||
}
|
||||
// assume 0 to continue all threads for now
|
||||
// FIXME: spec conformant behavior here
|
||||
let request = debugger.continue_thread(0);
|
||||
|
||||
let request = debugger.continue_thread(debugger.stopped_thread.unwrap());
|
||||
let _ = block_on(request).unwrap();
|
||||
debugger.is_running = true;
|
||||
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) {
|
||||
use helix_lsp::block_on;
|
||||
|
||||
|
|
|
@ -490,6 +490,10 @@ impl Default for Keymaps {
|
|||
"b" => dap_toggle_breakpoint,
|
||||
"r" => dap_run,
|
||||
"c" => dap_continue,
|
||||
"h" => dap_pause,
|
||||
"j" => dap_in,
|
||||
"k" => dap_out,
|
||||
"l" => dap_next,
|
||||
"z" => dap_variable_scopes,
|
||||
"t" => dap_terminate,
|
||||
},
|
||||
|
|
Loading…
Add table
Reference in a new issue