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>>,
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Reference in a new issue