self.ranges.push((relative_range, token_id.clone()))
}
- pub fn ranges(&self, to: &TokenMap) -> Vec<(TextRange, TextRange)> {
+ pub fn ranges(&self, to: &TokenMap, start: TextUnit) -> Vec<(TextRange, TextRange)> {
+ dbg!(&self.ranges);
self.ranges
.iter()
.filter_map(|(r, tid)| {
- if to.map_id == tid.map_id() {
+ if to.map_id != tid.map_id() {
return None;
}
if let Some(to_range) = to.relative_range_of(*tid) {
- Some((*r, to_range))
+ Some((*r, TextRange::from_to(to_range.start() + start, to_range.end() + start)))
} else {
None
}
cursor: Cursor<'a>,
text_pos: TextUnit,
inner: SyntaxTreeBuilder,
- range_marker: Option<(TextRange, tt::TokenId)>,
range_map: &'a mut ExpandedRangeMap,
// Number of roots
inner: SyntaxTreeBuilder::default(),
roots: smallvec::SmallVec::new(),
range_map,
- range_marker: None,
}
}
}
return;
}
- let mut last_ident = None;
-
for _ in 0..n_tokens {
if self.cursor.eof() {
break;
match self.cursor.token_tree() {
Some(tt::TokenTree::Leaf(leaf)) => {
- self.cursor = self.cursor.bump();
- self.buf += &format!("{}", leaf);
-
+ // Mark the range if needed
if let tt::Leaf::Ident(ident) = leaf {
- last_ident = Some(ident);
+ if kind == IDENT {
+ let range = TextRange::offset_len(
+ self.text_pos + TextUnit::of_str(&self.buf),
+ TextUnit::of_str(&ident.text),
+ );
+ let token_id = ident.id;
+ self.range_map.set(range, &token_id);
+ }
}
+
+ self.cursor = self.cursor.bump();
+ self.buf += &format!("{}", leaf);
}
Some(tt::TokenTree::Subtree(subtree)) => {
self.cursor = self.cursor.subtree().unwrap();
self.buf.clear();
self.inner.token(kind, text);
- // Mark the range if needed
- if let Some((range, token_id)) = self.range_marker.as_mut() {
- if let Some(ident) = last_ident {
- *range = TextRange::offset_len(range.start(), TextUnit::of_str(&ident.text));
- *token_id = ident.id;
- }
- }
-
// Add whitespace between adjoint puncts
let next = self.cursor.bump();
if let (
fn start_node(&mut self, kind: SyntaxKind) {
self.inner.start_node(kind);
- self.range_marker = if kind == IDENT {
- Some((
- TextRange::offset_len(self.text_pos, TextUnit::from_usize(0)),
- tt::TokenId::unspecified(),
- ))
- } else {
- None
- };
-
match self.roots.last_mut() {
None | Some(0) => self.roots.push(1),
Some(ref mut n) => **n += 1,
fn finish_node(&mut self) {
self.inner.finish_node();
*self.roots.last_mut().unwrap() -= 1;
-
- if let Some(range) = self.range_marker {
- if range.1 != tt::TokenId::unspecified() {
- self.range_map.set(range.0, &range.1)
- }
- }
}
fn error(&mut self, error: ParseError) {