debugger: Surface validity of breakpoints (#30380)
We now show on the breakpoint itself whether it can ever be hit.  Release Notes: - N/A --------- Signed-off-by: Umesh Yadav <git@umesh.dev> Co-authored-by: Anthony <anthony@zed.dev> Co-authored-by: Cole Miller <cole@zed.dev> Co-authored-by: Michael Sloan <michael@zed.dev> Co-authored-by: Marshall Bowers <git@maxdeviant.com> Co-authored-by: Ben Kunkle <ben@zed.dev> Co-authored-by: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Co-authored-by: Agus Zubiaga <hi@aguz.me> Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com> Co-authored-by: Agus Zubiaga <agus@zed.dev> Co-authored-by: Danilo Leal <daniloleal09@gmail.com> Co-authored-by: Richard Feldman <oss@rtfeldman.com> Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com> Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com> Co-authored-by: peppidesu <bakker.pepijn@gmail.com> Co-authored-by: Kirill Bulatov <kirill@zed.dev> Co-authored-by: Ben Kunkle <ben.kunkle@gmail.com> Co-authored-by: Jens Krause <47693+sectore@users.noreply.github.com> Co-authored-by: Bennet Bo Fenner <bennet@zed.dev> Co-authored-by: Max Nordlund <max.nordlund@gmail.com> Co-authored-by: Finn Evers <dev@bahn.sh> Co-authored-by: tidely <43219534+tidely@users.noreply.github.com> Co-authored-by: Sergei Kartsev <kartsevsb@gmail.com> Co-authored-by: Shardul Vaidya <31039336+5herlocked@users.noreply.github.com> Co-authored-by: Chris Kelly <amateurhuman@gmail.com> Co-authored-by: Peter Tripp <peter@zed.dev> Co-authored-by: Umesh Yadav <23421535+imumesh18@users.noreply.github.com> Co-authored-by: Julia Ryan <juliaryan3.14@gmail.com> Co-authored-by: Cole Miller <m@cole-miller.net> Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com> Co-authored-by: william341 <wwokwilliam@gmail.com> Co-authored-by: Liam <33645555+lj3954@users.noreply.github.com> Co-authored-by: AidanV <aidanvanduyne@gmail.com> Co-authored-by: imumesh18 <umesh4257@gmail.com> Co-authored-by: d1y <chenhonzhou@gmail.com> Co-authored-by: AidanV <84053180+AidanV@users.noreply.github.com> Co-authored-by: Anthony Eid <56899983+Anthony-Eid@users.noreply.github.com> Co-authored-by: 张小白 <364772080@qq.com> Co-authored-by: THELOSTSOUL <1095533751@qq.com> Co-authored-by: Ron Harel <55725807+ronharel02@users.noreply.github.com> Co-authored-by: Tristan Hume <tristan@anthropic.com> Co-authored-by: Stanislav Alekseev <43210583+WeetHet@users.noreply.github.com> Co-authored-by: Joseph T. Lyons <JosephTLyons@gmail.com> Co-authored-by: Remco Smits <djsmits12@gmail.com> Co-authored-by: Anthony Eid <hello@anthonyeid.me> Co-authored-by: Oleksiy Syvokon <oleksiy@zed.dev> Co-authored-by: Thomas David Baker <bakert@gmail.com> Co-authored-by: Nate Butler <iamnbutler@gmail.com> Co-authored-by: Mikayla Maki <mikayla@zed.dev> Co-authored-by: Rob McBroom <github@skurfer.com> Co-authored-by: CharlesChen0823 <yongchen0823@gmail.com>
This commit is contained in:
parent
36ae564b61
commit
17cf04558b
11 changed files with 439 additions and 237 deletions
|
@ -122,10 +122,11 @@ use markdown::Markdown;
|
|||
use mouse_context_menu::MouseContextMenu;
|
||||
use persistence::DB;
|
||||
use project::{
|
||||
ProjectPath,
|
||||
BreakpointWithPosition, ProjectPath,
|
||||
debugger::{
|
||||
breakpoint_store::{
|
||||
BreakpointEditAction, BreakpointState, BreakpointStore, BreakpointStoreEvent,
|
||||
BreakpointEditAction, BreakpointSessionState, BreakpointState, BreakpointStore,
|
||||
BreakpointStoreEvent,
|
||||
},
|
||||
session::{Session, SessionEvent},
|
||||
},
|
||||
|
@ -198,7 +199,7 @@ use theme::{
|
|||
};
|
||||
use ui::{
|
||||
ButtonSize, ButtonStyle, ContextMenu, Disclosure, IconButton, IconButtonShape, IconName,
|
||||
IconSize, Key, Tooltip, h_flex, prelude::*,
|
||||
IconSize, Indicator, Key, Tooltip, h_flex, prelude::*,
|
||||
};
|
||||
use util::{RangeExt, ResultExt, TryFutureExt, maybe, post_inc};
|
||||
use workspace::{
|
||||
|
@ -6997,7 +6998,7 @@ impl Editor {
|
|||
range: Range<DisplayRow>,
|
||||
window: &mut Window,
|
||||
cx: &mut Context<Self>,
|
||||
) -> HashMap<DisplayRow, (Anchor, Breakpoint)> {
|
||||
) -> HashMap<DisplayRow, (Anchor, Breakpoint, Option<BreakpointSessionState>)> {
|
||||
let mut breakpoint_display_points = HashMap::default();
|
||||
|
||||
let Some(breakpoint_store) = self.breakpoint_store.clone() else {
|
||||
|
@ -7031,15 +7032,17 @@ impl Editor {
|
|||
buffer_snapshot,
|
||||
cx,
|
||||
);
|
||||
for (anchor, breakpoint) in breakpoints {
|
||||
for (breakpoint, state) in breakpoints {
|
||||
let multi_buffer_anchor =
|
||||
Anchor::in_buffer(excerpt_id, buffer_snapshot.remote_id(), *anchor);
|
||||
Anchor::in_buffer(excerpt_id, buffer_snapshot.remote_id(), breakpoint.position);
|
||||
let position = multi_buffer_anchor
|
||||
.to_point(&multi_buffer_snapshot)
|
||||
.to_display_point(&snapshot);
|
||||
|
||||
breakpoint_display_points
|
||||
.insert(position.row(), (multi_buffer_anchor, breakpoint.clone()));
|
||||
breakpoint_display_points.insert(
|
||||
position.row(),
|
||||
(multi_buffer_anchor, breakpoint.bp.clone(), state),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7214,8 +7217,10 @@ impl Editor {
|
|||
position: Anchor,
|
||||
row: DisplayRow,
|
||||
breakpoint: &Breakpoint,
|
||||
state: Option<BreakpointSessionState>,
|
||||
cx: &mut Context<Self>,
|
||||
) -> IconButton {
|
||||
let is_rejected = state.is_some_and(|s| !s.verified);
|
||||
// Is it a breakpoint that shows up when hovering over gutter?
|
||||
let (is_phantom, collides_with_existing) = self.gutter_breakpoint_indicator.0.map_or(
|
||||
(false, false),
|
||||
|
@ -7241,6 +7246,8 @@ impl Editor {
|
|||
|
||||
let color = if is_phantom {
|
||||
Color::Hint
|
||||
} else if is_rejected {
|
||||
Color::Disabled
|
||||
} else {
|
||||
Color::Debugger
|
||||
};
|
||||
|
@ -7268,9 +7275,18 @@ impl Editor {
|
|||
}
|
||||
let primary_text = SharedString::from(primary_text);
|
||||
let focus_handle = self.focus_handle.clone();
|
||||
|
||||
let meta = if is_rejected {
|
||||
"No executable code is associated with this line."
|
||||
} else {
|
||||
"Right-click for more options."
|
||||
};
|
||||
IconButton::new(("breakpoint_indicator", row.0 as usize), icon)
|
||||
.icon_size(IconSize::XSmall)
|
||||
.size(ui::ButtonSize::None)
|
||||
.when(is_rejected, |this| {
|
||||
this.indicator(Indicator::icon(Icon::new(IconName::Warning)).color(Color::Warning))
|
||||
})
|
||||
.icon_color(color)
|
||||
.style(ButtonStyle::Transparent)
|
||||
.on_click(cx.listener({
|
||||
|
@ -7302,14 +7318,7 @@ impl Editor {
|
|||
);
|
||||
}))
|
||||
.tooltip(move |window, cx| {
|
||||
Tooltip::with_meta_in(
|
||||
primary_text.clone(),
|
||||
None,
|
||||
"Right-click for more options",
|
||||
&focus_handle,
|
||||
window,
|
||||
cx,
|
||||
)
|
||||
Tooltip::with_meta_in(primary_text.clone(), None, meta, &focus_handle, window, cx)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -7449,11 +7458,11 @@ impl Editor {
|
|||
_style: &EditorStyle,
|
||||
is_active: bool,
|
||||
row: DisplayRow,
|
||||
breakpoint: Option<(Anchor, Breakpoint)>,
|
||||
breakpoint: Option<(Anchor, Breakpoint, Option<BreakpointSessionState>)>,
|
||||
cx: &mut Context<Self>,
|
||||
) -> IconButton {
|
||||
let color = Color::Muted;
|
||||
let position = breakpoint.as_ref().map(|(anchor, _)| *anchor);
|
||||
let position = breakpoint.as_ref().map(|(anchor, _, _)| *anchor);
|
||||
|
||||
IconButton::new(("run_indicator", row.0 as usize), ui::IconName::Play)
|
||||
.shape(ui::IconButtonShape::Square)
|
||||
|
@ -9633,16 +9642,16 @@ impl Editor {
|
|||
cx,
|
||||
)
|
||||
.next()
|
||||
.and_then(|(anchor, bp)| {
|
||||
.and_then(|(bp, _)| {
|
||||
let breakpoint_row = buffer_snapshot
|
||||
.summary_for_anchor::<text::PointUtf16>(anchor)
|
||||
.summary_for_anchor::<text::PointUtf16>(&bp.position)
|
||||
.row;
|
||||
|
||||
if breakpoint_row == row {
|
||||
snapshot
|
||||
.buffer_snapshot
|
||||
.anchor_in_excerpt(enclosing_excerpt, *anchor)
|
||||
.map(|anchor| (anchor, bp.clone()))
|
||||
.anchor_in_excerpt(enclosing_excerpt, bp.position)
|
||||
.map(|position| (position, bp.bp.clone()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -9805,7 +9814,10 @@ impl Editor {
|
|||
breakpoint_store.update(cx, |breakpoint_store, cx| {
|
||||
breakpoint_store.toggle_breakpoint(
|
||||
buffer,
|
||||
(breakpoint_position.text_anchor, breakpoint),
|
||||
BreakpointWithPosition {
|
||||
position: breakpoint_position.text_anchor,
|
||||
bp: breakpoint,
|
||||
},
|
||||
edit_action,
|
||||
cx,
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue