mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 21:43:37 +00:00
Auto merge of #16106 - Veykril:fix-lifetime-span-split, r=Veykril
fix: Fix syntax bridge assigning invalid span to lifetime tokens Fixes https://github.com/rust-lang/rust-analyzer/issues/16097 Fixes https://github.com/rust-lang/rust-analyzer/issues/16103
This commit is contained in:
commit
5d7453ccd6
2 changed files with 22 additions and 28 deletions
|
@ -75,27 +75,40 @@ pub struct RealSpanMap {
|
|||
/// Invariant: Sorted vec over TextSize
|
||||
// FIXME: SortedVec<(TextSize, ErasedFileAstId)>?
|
||||
pairs: Box<[(TextSize, ErasedFileAstId)]>,
|
||||
end: TextSize,
|
||||
}
|
||||
|
||||
impl RealSpanMap {
|
||||
/// Creates a real file span map that returns absolute ranges (relative ranges to the root ast id).
|
||||
pub fn absolute(file_id: FileId) -> Self {
|
||||
RealSpanMap { file_id, pairs: Box::from([(TextSize::new(0), ROOT_ERASED_FILE_AST_ID)]) }
|
||||
RealSpanMap {
|
||||
file_id,
|
||||
pairs: Box::from([(TextSize::new(0), ROOT_ERASED_FILE_AST_ID)]),
|
||||
end: TextSize::new(!0),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn from_file(db: &dyn ExpandDatabase, file_id: FileId) -> Self {
|
||||
let mut pairs = vec![(TextSize::new(0), ROOT_ERASED_FILE_AST_ID)];
|
||||
let ast_id_map = db.ast_id_map(file_id.into());
|
||||
pairs.extend(
|
||||
db.parse(file_id)
|
||||
.tree()
|
||||
.items()
|
||||
.map(|item| (item.syntax().text_range().start(), ast_id_map.ast_id(&item).erase())),
|
||||
);
|
||||
RealSpanMap { file_id, pairs: pairs.into_boxed_slice() }
|
||||
let tree = db.parse(file_id).tree();
|
||||
pairs
|
||||
.extend(tree.items().map(|item| {
|
||||
(item.syntax().text_range().start(), ast_id_map.ast_id(&item).erase())
|
||||
}));
|
||||
RealSpanMap {
|
||||
file_id,
|
||||
pairs: pairs.into_boxed_slice(),
|
||||
end: tree.syntax().text_range().end(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn span_for_range(&self, range: TextRange) -> SpanData {
|
||||
assert!(
|
||||
range.end() <= self.end,
|
||||
"range {range:?} goes beyond the end of the file {:?}",
|
||||
self.end
|
||||
);
|
||||
let start = range.start();
|
||||
let idx = self
|
||||
.pairs
|
||||
|
|
|
@ -311,7 +311,7 @@ where
|
|||
|
||||
let ident = tt::Leaf::from(tt::Ident {
|
||||
text: SmolStr::new(&token.to_text(conv)[1..]),
|
||||
span: conv.span_for(TextRange::at(
|
||||
span: conv.span_for(TextRange::new(
|
||||
abs_range.start() + TextSize::of('\''),
|
||||
abs_range.end(),
|
||||
)),
|
||||
|
@ -625,25 +625,6 @@ impl<SpanMap, S> Converter<SpanMap, S> {
|
|||
}
|
||||
|
||||
fn next_token(&mut self) -> Option<SyntaxToken> {
|
||||
// while let Some(ev) = self.preorder.next() {
|
||||
// match ev {
|
||||
// WalkEvent::Enter(SyntaxElement::Token(t)) => {
|
||||
// if let Some(leafs) = self.append.remove(&t.clone().into()) {
|
||||
// self.current_leafs.extend(leafs);
|
||||
// }
|
||||
// return Some(t);
|
||||
// }
|
||||
// WalkEvent::Enter(SyntaxElement::Node(n)) if self.remove.contains(&n) => {
|
||||
// self.preorder.skip_subtree();
|
||||
// if let Some(leafs) = self.append.remove(&n.into()) {
|
||||
// self.current_leafs.extend(leafs);
|
||||
// }
|
||||
// }
|
||||
// _ => (),
|
||||
// }
|
||||
// }
|
||||
// None;
|
||||
|
||||
while let Some(ev) = self.preorder.next() {
|
||||
match ev {
|
||||
WalkEvent::Enter(SyntaxElement::Token(t)) => return Some(t),
|
||||
|
|
Loading…
Reference in a new issue