aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src/subtree_source.rs
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2019-05-27 17:28:46 +0100
committerEdwin Cheng <[email protected]>2019-05-27 17:38:55 +0100
commit98aac6b751879305dd236c3f22c44755514c8162 (patch)
treed2c854a0adecc4e3e7c90466433f1f6a1389ab2f /crates/ra_mbe/src/subtree_source.rs
parentc8c9230dd2c2b981fbc90ff587b41b7342b72480 (diff)
Simpliy how collecting token from src
Diffstat (limited to 'crates/ra_mbe/src/subtree_source.rs')
-rw-r--r--crates/ra_mbe/src/subtree_source.rs63
1 files changed, 7 insertions, 56 deletions
diff --git a/crates/ra_mbe/src/subtree_source.rs b/crates/ra_mbe/src/subtree_source.rs
index 2ba0b1601..8d6fd3e43 100644
--- a/crates/ra_mbe/src/subtree_source.rs
+++ b/crates/ra_mbe/src/subtree_source.rs
@@ -11,8 +11,7 @@ struct TtToken {
11} 11}
12 12
13pub(crate) struct SubtreeTokenSource<'a> { 13pub(crate) struct SubtreeTokenSource<'a> {
14 start: Cursor<'a>, 14 cached_cursor: Cell<Cursor<'a>>,
15 cursor: Cell<Cursor<'a>>,
16 cached: RefCell<Vec<Option<TtToken>>>, 15 cached: RefCell<Vec<Option<TtToken>>>,
17 curr: (Token, usize), 16 curr: (Token, usize),
18} 17}
@@ -34,19 +33,13 @@ impl<'a> SubtreeTokenSource<'a> {
34 33
35 let mut res = SubtreeTokenSource { 34 let mut res = SubtreeTokenSource {
36 curr: (Token { kind: EOF, is_jointed_to_next: false }, 0), 35 curr: (Token { kind: EOF, is_jointed_to_next: false }, 0),
37 start: cursor, 36 cached_cursor: Cell::new(cursor),
38 cursor: Cell::new(cursor),
39 cached: RefCell::new(Vec::with_capacity(10)), 37 cached: RefCell::new(Vec::with_capacity(10)),
40 }; 38 };
41 res.curr = (res.mk_token(0), 0); 39 res.curr = (res.mk_token(0), 0);
42 res 40 res
43 } 41 }
44 42
45 pub(crate) fn bump_n(&mut self, parsed_tokens: usize) -> Vec<tt::TokenTree> {
46 let res = self.collect_token_trees(parsed_tokens);
47 res
48 }
49
50 fn mk_token(&self, pos: usize) -> Token { 43 fn mk_token(&self, pos: usize) -> Token {
51 match self.get(pos) { 44 match self.get(pos) {
52 Some(tt) => Token { kind: tt.kind, is_jointed_to_next: tt.is_joint_to_next }, 45 Some(tt) => Token { kind: tt.kind, is_jointed_to_next: tt.is_joint_to_next },
@@ -61,7 +54,7 @@ impl<'a> SubtreeTokenSource<'a> {
61 } 54 }
62 55
63 while pos >= cached.len() { 56 while pos >= cached.len() {
64 let cursor = self.cursor.get(); 57 let cursor = self.cached_cursor.get();
65 if cursor.eof() { 58 if cursor.eof() {
66 cached.push(None); 59 cached.push(None);
67 continue; 60 continue;
@@ -70,16 +63,16 @@ impl<'a> SubtreeTokenSource<'a> {
70 match cursor.token_tree() { 63 match cursor.token_tree() {
71 Some(tt::TokenTree::Leaf(leaf)) => { 64 Some(tt::TokenTree::Leaf(leaf)) => {
72 cached.push(Some(convert_leaf(&leaf))); 65 cached.push(Some(convert_leaf(&leaf)));
73 self.cursor.set(cursor.bump()); 66 self.cached_cursor.set(cursor.bump());
74 } 67 }
75 Some(tt::TokenTree::Subtree(subtree)) => { 68 Some(tt::TokenTree::Subtree(subtree)) => {
76 self.cursor.set(cursor.subtree().unwrap()); 69 self.cached_cursor.set(cursor.subtree().unwrap());
77 cached.push(Some(convert_delim(subtree.delimiter, false))); 70 cached.push(Some(convert_delim(subtree.delimiter, false)));
78 } 71 }
79 None => { 72 None => {
80 if let Some(subtree) = cursor.end() { 73 if let Some(subtree) = cursor.end() {
81 cached.push(Some(convert_delim(subtree.delimiter, true))); 74 cached.push(Some(convert_delim(subtree.delimiter, true)));
82 self.cursor.set(cursor.bump()); 75 self.cached_cursor.set(cursor.bump());
83 } 76 }
84 } 77 }
85 } 78 }
@@ -87,48 +80,6 @@ impl<'a> SubtreeTokenSource<'a> {
87 80
88 return cached[pos].clone(); 81 return cached[pos].clone();
89 } 82 }
90
91 fn collect_token_trees(&self, n: usize) -> Vec<tt::TokenTree> {
92 let mut res = vec![];
93
94 let mut pos = 0;
95 let mut cursor = self.start;
96 let mut level = 0;
97
98 while pos < n {
99 if cursor.eof() {
100 break;
101 }
102
103 match cursor.token_tree() {
104 Some(tt::TokenTree::Leaf(leaf)) => {
105 if level == 0 {
106 res.push(leaf.into());
107 }
108 cursor = cursor.bump();
109 pos += 1;
110 }
111 Some(tt::TokenTree::Subtree(subtree)) => {
112 if level == 0 {
113 res.push(subtree.into());
114 }
115 pos += 1;
116 level += 1;
117 cursor = cursor.subtree().unwrap();
118 }
119
120 None => {
121 if let Some(_) = cursor.end() {
122 level -= 1;
123 pos += 1;
124 cursor = cursor.bump();
125 }
126 }
127 }
128 }
129
130 res
131 }
132} 83}
133 84
134impl<'a> TokenSource for SubtreeTokenSource<'a> { 85impl<'a> TokenSource for SubtreeTokenSource<'a> {
@@ -147,7 +98,7 @@ impl<'a> TokenSource for SubtreeTokenSource<'a> {
147 return; 98 return;
148 } 99 }
149 100
150 self.curr = (self.mk_token(self.curr.1 + 1), self.curr.1 + 1) 101 self.curr = (self.mk_token(self.curr.1 + 1), self.curr.1 + 1);
151 } 102 }
152 103
153 /// Is the current token a specified keyword? 104 /// Is the current token a specified keyword?