Struct cranelift_isle::error::Span
source · Expand description
A span in a given source.
Fields§
§from: Pos
The byte offset of the start of the span.
to: Pos
The byte offset of the end of the span.
Implementations§
source§impl Span
impl Span
sourcepub fn new_single(pos: Pos) -> Span
pub fn new_single(pos: Pos) -> Span
Create a new span that covers one character at the given offset.
Examples found in repository?
More examples
src/trie_again.rs (line 312)
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
fn add_rule(&mut self, rule: &sema::Rule, termenv: &sema::TermEnv, errors: &mut Vec<Error>) {
self.current_rule.pos = rule.pos;
self.current_rule.prio = rule.prio;
self.current_rule.result = rule.visit(self, termenv);
self.normalize_equivalence_classes();
let rule = std::mem::take(&mut self.current_rule);
if self.unreachable.is_empty() {
self.rules.rules.push(rule);
} else {
// If this rule can never match, drop it so it doesn't affect overlap checking.
errors.extend(
self.unreachable
.drain(..)
.map(|err| Error::UnreachableError {
msg: format!(
"rule requires binding to match both {:?} and {:?}",
err.constraint_a, err.constraint_b
),
span: Span::new_single(err.pos),
}),
)
}
}
src/overlap.rs (line 62)
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
fn report(mut self) -> Vec<Error> {
let mut errors = Vec::new();
while let Some((&pos, _)) = self
.nodes
.iter()
.max_by_key(|(pos, edges)| (edges.len(), *pos))
{
let node = self.nodes.remove(&pos).unwrap();
for other in node.iter() {
if let Entry::Occupied(mut entry) = self.nodes.entry(*other) {
let back_edges = entry.get_mut();
back_edges.remove(&pos);
if back_edges.is_empty() {
entry.remove();
}
}
}
// build the real error
let mut rules = vec![Span::new_single(pos)];
rules.extend(node.into_iter().map(Span::new_single));
errors.push(Error::OverlapError {
msg: String::from("rules are overlapping"),
rules,
});
}
errors.extend(
self.shadowed
.into_iter()
.map(|(mask, shadowed)| Error::ShadowedError {
shadowed: shadowed.into_iter().map(Span::new_single).collect(),
mask: Span::new_single(mask),
}),
);
errors.sort_by_key(|err| match err {
Error::ShadowedError { mask, .. } => mask.from,
Error::OverlapError { rules, .. } => rules[0].from,
_ => Pos::default(),
});
errors
}