Support logpoints

Tested with Node (Delve and LLDB do not support logpoints)
pull/574/head
Dmitry Sharshakov 3 years ago
parent ec599a1eac
commit 5d3c69d565
No known key found for this signature in database
GPG Key ID: 471FD32E15FD8473

@ -1924,42 +1924,30 @@ mod cmd {
Ok(()) Ok(())
} }
fn debug_breakpoint_condition( fn impl_edit_breakpoint(
cx: &mut compositor::Context, cx: &mut compositor::Context,
args: &[&str], condition: Option<String>,
_event: PromptEvent, log_message: Option<String>,
) -> anyhow::Result<()> { ) {
use helix_lsp::block_on; use helix_lsp::block_on;
let condition = args.join(" ");
let condition = if condition.is_empty() {
None
} else {
Some(condition)
};
let (view, doc) = current!(cx.editor); let (view, doc) = current!(cx.editor);
let text = doc.text().slice(..); let text = doc.text().slice(..);
let pos = doc.selection(view.id).primary().cursor(text); let pos = doc.selection(view.id).primary().cursor(text);
let breakpoint = helix_dap::SourceBreakpoint { let breakpoint = helix_dap::SourceBreakpoint {
line: text.char_to_line(pos) + 1, // convert from 0-indexing to 1-indexing (TODO: could set debugger to 0-indexing on init) line: text.char_to_line(pos) + 1, // convert from 0-indexing to 1-indexing (TODO: could set debugger to 0-indexing on init)
condition, condition,
log_message,
..Default::default() ..Default::default()
}; };
let path = match doc.path() { let path = match doc.path() {
Some(path) => path.to_path_buf(), Some(path) => path.to_path_buf(),
None => { None => {
cx.editor cx.editor
.set_error("Can't edit breakpoint: document has no path".to_string()); .set_error("Can't edit breakpoint: document has no path".to_string());
return Ok(()); return;
} }
}; };
// TODO: need to map breakpoints over edits and update them?
// we shouldn't really allow editing while debug is running though
if let Some(debugger) = &mut cx.editor.debugger { if let Some(debugger) = &mut cx.editor.debugger {
let breakpoints = debugger.breakpoints.entry(path.clone()).or_default(); let breakpoints = debugger.breakpoints.entry(path.clone()).or_default();
if let Some(pos) = breakpoints.iter().position(|b| b.line == breakpoint.line) { if let Some(pos) = breakpoints.iter().position(|b| b.line == breakpoint.line) {
@ -1972,6 +1960,37 @@ mod cmd {
let _ = block_on(request).unwrap(); let _ = block_on(request).unwrap();
} }
} }
}
fn debug_breakpoint_condition(
cx: &mut compositor::Context,
args: &[&str],
_event: PromptEvent,
) -> anyhow::Result<()> {
let condition = args.join(" ");
let condition = if condition.is_empty() {
None
} else {
Some(condition)
};
impl_edit_breakpoint(cx, condition, None);
Ok(())
}
fn debug_set_logpoint(
cx: &mut compositor::Context,
args: &[&str],
_event: PromptEvent,
) -> anyhow::Result<()> {
let log_message = args.join(" ");
let log_message = if log_message.is_empty() {
None
} else {
Some(log_message)
};
impl_edit_breakpoint(cx, None, log_message);
Ok(()) Ok(())
} }
@ -2227,6 +2246,13 @@ mod cmd {
doc: "Set current breakpoint condition.", doc: "Set current breakpoint condition.",
fun: debug_breakpoint_condition, fun: debug_breakpoint_condition,
completer: None, completer: None,
},
TypableCommand {
name: "debug-set-logpoint",
alias: None,
doc: "Make current breakpoint a log point.",
fun: debug_set_logpoint,
completer: None,
} }
]; ];

@ -476,6 +476,8 @@ impl EditorView {
{ {
if breakpoint.condition.is_some() { if breakpoint.condition.is_some() {
surface.set_stringn(viewport.x, viewport.y + i as u16, "▲", 1, error); surface.set_stringn(viewport.x, viewport.y + i as u16, "▲", 1, error);
} else if breakpoint.log_message.is_some() {
surface.set_stringn(viewport.x, viewport.y + i as u16, "▲", 1, info);
} else { } else {
surface.set_stringn(viewport.x, viewport.y + i as u16, "▲", 1, warning); surface.set_stringn(viewport.x, viewport.y + i as u16, "▲", 1, warning);
} }
@ -581,6 +583,12 @@ impl EditorView {
.lines, .lines,
); );
} }
if let Some(log_message) = &breakpoint.log_message {
lines.extend(
Text::styled(log_message, info.add_modifier(Modifier::UNDERLINED))
.lines,
);
}
} }
} }
} }

Loading…
Cancel
Save