Skip to content

Commit c209b5f

Browse files
committed
fix: Fix syntax bridge assigning invalid span to lifetime tokens
1 parent 98a8053 commit c209b5f

File tree

2 files changed

+22
-28
lines changed

2 files changed

+22
-28
lines changed

crates/hir-expand/src/span.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,27 +75,40 @@ pub struct RealSpanMap {
7575
/// Invariant: Sorted vec over TextSize
7676
// FIXME: SortedVec<(TextSize, ErasedFileAstId)>?
7777
pairs: Box<[(TextSize, ErasedFileAstId)]>,
78+
end: TextSize,
7879
}
7980

8081
impl RealSpanMap {
8182
/// Creates a real file span map that returns absolute ranges (relative ranges to the root ast id).
8283
pub fn absolute(file_id: FileId) -> Self {
83-
RealSpanMap { file_id, pairs: Box::from([(TextSize::new(0), ROOT_ERASED_FILE_AST_ID)]) }
84+
RealSpanMap {
85+
file_id,
86+
pairs: Box::from([(TextSize::new(0), ROOT_ERASED_FILE_AST_ID)]),
87+
end: TextSize::new(!0),
88+
}
8489
}
8590

8691
pub fn from_file(db: &dyn ExpandDatabase, file_id: FileId) -> Self {
8792
let mut pairs = vec![(TextSize::new(0), ROOT_ERASED_FILE_AST_ID)];
8893
let ast_id_map = db.ast_id_map(file_id.into());
89-
pairs.extend(
90-
db.parse(file_id)
91-
.tree()
92-
.items()
93-
.map(|item| (item.syntax().text_range().start(), ast_id_map.ast_id(&item).erase())),
94-
);
95-
RealSpanMap { file_id, pairs: pairs.into_boxed_slice() }
94+
let tree = db.parse(file_id).tree();
95+
pairs
96+
.extend(tree.items().map(|item| {
97+
(item.syntax().text_range().start(), ast_id_map.ast_id(&item).erase())
98+
}));
99+
RealSpanMap {
100+
file_id,
101+
pairs: pairs.into_boxed_slice(),
102+
end: tree.syntax().text_range().end(),
103+
}
96104
}
97105

98106
pub fn span_for_range(&self, range: TextRange) -> SpanData {
107+
assert!(
108+
range.end() <= self.end,
109+
"range {range:?} goes beyond the end of the file {:?}",
110+
self.end
111+
);
99112
let start = range.start();
100113
let idx = self
101114
.pairs

crates/mbe/src/syntax_bridge.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ where
311311

312312
let ident = tt::Leaf::from(tt::Ident {
313313
text: SmolStr::new(&token.to_text(conv)[1..]),
314-
span: conv.span_for(TextRange::at(
314+
span: conv.span_for(TextRange::new(
315315
abs_range.start() + TextSize::of('\''),
316316
abs_range.end(),
317317
)),
@@ -625,25 +625,6 @@ impl<SpanMap, S> Converter<SpanMap, S> {
625625
}
626626

627627
fn next_token(&mut self) -> Option<SyntaxToken> {
628-
// while let Some(ev) = self.preorder.next() {
629-
// match ev {
630-
// WalkEvent::Enter(SyntaxElement::Token(t)) => {
631-
// if let Some(leafs) = self.append.remove(&t.clone().into()) {
632-
// self.current_leafs.extend(leafs);
633-
// }
634-
// return Some(t);
635-
// }
636-
// WalkEvent::Enter(SyntaxElement::Node(n)) if self.remove.contains(&n) => {
637-
// self.preorder.skip_subtree();
638-
// if let Some(leafs) = self.append.remove(&n.into()) {
639-
// self.current_leafs.extend(leafs);
640-
// }
641-
// }
642-
// _ => (),
643-
// }
644-
// }
645-
// None;
646-
647628
while let Some(ev) = self.preorder.next() {
648629
match ev {
649630
WalkEvent::Enter(SyntaxElement::Token(t)) => return Some(t),

0 commit comments

Comments
 (0)