]> git.lizzy.rs Git - rust.git/commitdiff
Fixed bug in ExpandedRangeMap
authorEdwin Cheng <edwin0cheng@gmail.com>
Sun, 3 Nov 2019 17:45:58 +0000 (01:45 +0800)
committerEdwin Cheng <edwin0cheng@gmail.com>
Mon, 4 Nov 2019 17:38:20 +0000 (01:38 +0800)
crates/ra_mbe/src/syntax_bridge.rs

index 5db6647e3a4e134db2a04556780d83812518a614..4965f9c33b647ec18daa365ab427587fc96a35e4 100644 (file)
@@ -157,15 +157,16 @@ fn set(&mut self, relative_range: TextRange, token_id: &tt::TokenId) {
         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
                 }
@@ -320,7 +321,6 @@ struct TtTreeSink<'a> {
     cursor: Cursor<'a>,
     text_pos: TextUnit,
     inner: SyntaxTreeBuilder,
-    range_marker: Option<(TextRange, tt::TokenId)>,
     range_map: &'a mut ExpandedRangeMap,
 
     // Number of roots
@@ -337,7 +337,6 @@ fn new(cursor: Cursor<'a>, range_map: &'a mut ExpandedRangeMap) -> Self {
             inner: SyntaxTreeBuilder::default(),
             roots: smallvec::SmallVec::new(),
             range_map,
-            range_marker: None,
         }
     }
 }
@@ -362,8 +361,6 @@ fn token(&mut self, kind: SyntaxKind, n_tokens: u8) {
             return;
         }
 
-        let mut last_ident = None;
-
         for _ in 0..n_tokens {
             if self.cursor.eof() {
                 break;
@@ -371,12 +368,20 @@ fn token(&mut self, kind: SyntaxKind, n_tokens: u8) {
 
             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();
@@ -396,14 +401,6 @@ fn token(&mut self, kind: SyntaxKind, n_tokens: u8) {
         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 (
@@ -421,15 +418,6 @@ fn token(&mut self, kind: SyntaxKind, n_tokens: u8) {
     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,
@@ -439,12 +427,6 @@ fn start_node(&mut self, kind: SyntaxKind) {
     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) {