Work on integrating error reporting using the ariadne crate

This commit is contained in:
2026-02-28 20:30:12 -05:00
parent 1b63eff783
commit ef0f66efaa
18 changed files with 763 additions and 540 deletions

View File

@@ -696,7 +696,7 @@ impl Completer {
tks
.iter()
.next()
.is_some_and(|tk| tk.span.start > cursor_pos)
.is_some_and(|tk| tk.span.range().start > cursor_pos)
})
.map(|i| i.saturating_sub(1))
.unwrap_or(segments.len().saturating_sub(1));
@@ -705,13 +705,13 @@ impl Completer {
let cword = if let Some(pos) = relevant
.iter()
.position(|tk| cursor_pos >= tk.span.start && cursor_pos <= tk.span.end)
.position(|tk| cursor_pos >= tk.span.range().start && cursor_pos <= tk.span.range().end)
{
pos
} else {
let insert_pos = relevant
.iter()
.position(|tk| tk.span.start > cursor_pos)
.position(|tk| tk.span.range().start > cursor_pos)
.unwrap_or(relevant.len());
let mut new_tk = Tk::default();
@@ -761,7 +761,7 @@ impl Completer {
// Set token_span from CompContext's current word
if let Some(cur) = ctx.words.get(ctx.cword) {
self.token_span = (cur.span.start, cur.span.end);
self.token_span = (cur.span.range().start, cur.span.range().end);
} else {
self.token_span = (cursor_pos, cursor_pos);
}
@@ -799,7 +799,7 @@ impl Completer {
return Ok(CompResult::from_candidates(candidates));
};
self.token_span = (cur_token.span.start, cur_token.span.end);
self.token_span = (cur_token.span.range().start, cur_token.span.range().end);
// Use marker-based context detection for sub-token awareness (e.g. VAR_SUB
// inside a token)
@@ -812,7 +812,7 @@ impl Completer {
// If token contains '=', only complete after the '='
let token_str = cur_token.span.as_str();
if let Some(eq_pos) = token_str.rfind('=') {
self.token_span.0 = cur_token.span.start + eq_pos + 1;
self.token_span.0 = cur_token.span.range().start + eq_pos + 1;
cur_token
.span
.set_range(self.token_span.0..self.token_span.1);

View File

@@ -70,11 +70,10 @@ impl HistEntry {
impl FromStr for HistEntry {
type Err = ShErr;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let err = Err(ShErr::Simple {
kind: ShErrKind::HistoryReadErr,
msg: format!("Bad formatting on history entry '{s}'"),
notes: vec![],
});
let err = Err(ShErr::simple(
ShErrKind::HistoryReadErr,
format!("Bad formatting on history entry '{s}'"),
));
//: 248972349;148;echo foo; echo bar
let Some(cleaned) = s.strip_prefix(": ") else {
@@ -133,11 +132,10 @@ impl FromStr for HistEntries {
while let Some((i, line)) = lines.next() {
if !line.starts_with(": ") {
return Err(ShErr::Simple {
kind: ShErrKind::HistoryReadErr,
msg: format!("Bad formatting on line {i}"),
notes: vec![],
});
return Err(ShErr::simple(
ShErrKind::HistoryReadErr,
format!("Bad formatting on line {i}"),
));
}
let mut chars = line.chars().peekable();
let mut feeding_lines = true;
@@ -163,11 +161,10 @@ impl FromStr for HistEntries {
}
if feeding_lines {
let Some((_, line)) = lines.next() else {
return Err(ShErr::Simple {
kind: ShErrKind::HistoryReadErr,
msg: format!("Bad formatting on line {i}"),
notes: vec![],
});
return Err(ShErr::simple(
ShErrKind::HistoryReadErr,
format!("Bad formatting on line {i}"),
));
};
chars = line.chars().peekable();
}

View File

@@ -975,7 +975,7 @@ pub fn annotate_token(token: Tk) -> Vec<(usize, Marker)> {
other => other,
}
});
stack.retain(|(i, m)| *i <= token.span.start && !markers::END_MARKERS.contains(m));
stack.retain(|(i, m)| *i <= token.span.range().start && !markers::END_MARKERS.contains(m));
let Some(ctx) = stack.last() else {
return false;
@@ -989,27 +989,27 @@ pub fn annotate_token(token: Tk) -> Vec<(usize, Marker)> {
if token.class != TkRule::Str
&& let Some(marker) = marker_for(&token.class)
{
insertions.push((token.span.end, markers::RESET));
insertions.push((token.span.start, marker));
insertions.push((token.span.range().end, markers::RESET));
insertions.push((token.span.range().start, marker));
return insertions;
} else if token.flags.contains(TkFlags::IS_SUBSH) {
let token_raw = token.span.as_str();
if token_raw.ends_with(')') {
insertions.push((token.span.end, markers::SUBSH_END));
insertions.push((token.span.range().end, markers::SUBSH_END));
}
insertions.push((token.span.start, markers::SUBSH));
insertions.push((token.span.range().start, markers::SUBSH));
return insertions;
} else if token.class == TkRule::CasePattern {
insertions.push((token.span.end, markers::RESET));
insertions.push((token.span.end - 1, markers::CASE_PAT));
insertions.push((token.span.start, markers::OPERATOR));
insertions.push((token.span.range().end, markers::RESET));
insertions.push((token.span.range().end - 1, markers::CASE_PAT));
insertions.push((token.span.range().start, markers::OPERATOR));
return insertions;
}
let token_raw = token.span.as_str();
let mut token_chars = token_raw.char_indices().peekable();
let span_start = token.span.start;
let span_start = token.span.range().start;
let mut qt_state = QuoteState::default();
let mut cmd_sub_depth = 0;
@@ -1031,7 +1031,7 @@ pub fn annotate_token(token: Tk) -> Vec<(usize, Marker)> {
insertions.insert(0, (span_start, markers::ASSIGNMENT));
}
insertions.insert(0, (token.span.end, markers::RESET)); // reset at the end of the token
insertions.insert(0, (token.span.range().end, markers::RESET)); // reset at the end of the token
while let Some((i, ch)) = token_chars.peek() {
let index = *i; // we have to dereference this here because rustc is a very pedantic program