From c785c7312da834c62b44c4f2736dbde3404b64dd Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Mon, 8 Apr 2019 19:21:07 +0800 Subject: Fixed infintite loop bug --- crates/ra_mbe/src/subtree_source.rs | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) (limited to 'crates/ra_mbe/src') diff --git a/crates/ra_mbe/src/subtree_source.rs b/crates/ra_mbe/src/subtree_source.rs index 997a600a5..5f20112ce 100644 --- a/crates/ra_mbe/src/subtree_source.rs +++ b/crates/ra_mbe/src/subtree_source.rs @@ -237,34 +237,13 @@ pub(crate) trait Querier { pub(crate) struct WalkerOwner<'a> { walker: RefCell>, offset: usize, - temp: RefCell>>, } impl<'a> WalkerOwner<'a> { fn token_idx<'b>(&self, pos: usize) -> Option { self.set_walker_pos(pos); let walker = self.walker.borrow(); - let r = walker.current().cloned(); - - if walker.subtree.token_trees.len() == 1 { - if let tt::TokenTree::Leaf(_) = &walker.subtree.token_trees[0] { - let mut temp = self.temp.borrow_mut(); - - if r.is_none() { - if let Some(Some(p)) = temp.get(&pos) { - unreachable!( - "nWWWWWWWWWWWW~~~~~~~~~~~~~~,\n{:#?}\n{:#?}\n{:#?}", - pos, p, self - ); - } - } - - // eprintln!("===>{:#?}\n{:#?}\n{:#?}", pos, r, self); - temp.insert(pos, r.clone()); - } - } - - r + walker.current().cloned() } fn start_from_nth(&mut self, pos: usize) { @@ -275,21 +254,16 @@ impl<'a> WalkerOwner<'a> { fn set_walker_pos(&self, mut pos: usize) { pos += self.offset; let mut walker = self.walker.borrow_mut(); - while pos > walker.pos { + while pos > walker.pos && walker.idx != WalkIndex::Eof { walker.forward(); } while pos < walker.pos { walker.backward(); } - assert!(pos == walker.pos); } fn new(subtree: &'a tt::Subtree) -> Self { - WalkerOwner { - walker: RefCell::new(SubTreeWalker::new(subtree)), - offset: 0, - temp: RefCell::new(Default::default()), - } + WalkerOwner { walker: RefCell::new(SubTreeWalker::new(subtree)), offset: 0 } } fn collect_token_tree(&mut self, n: usize) -> Vec<&tt::TokenTree> { @@ -501,7 +475,7 @@ fn convert_ident(ident: &tt::Ident) -> TtToken { } fn convert_punct(p: &tt::Punct, parent: &tt::Subtree, next: usize) -> TtToken { - let iter = parent.token_trees[next..].iter(); + let iter = parent.token_trees[next + 1..].iter(); let mut peek = TokenPeek::new(iter); if let Some((kind, is_joint_to_next, text, size)) = convert_multi_char_punct(p, &mut peek) { -- cgit v1.2.3