diff options
author | Edwin Cheng <[email protected]> | 2019-05-27 17:28:46 +0100 |
---|---|---|
committer | Edwin Cheng <[email protected]> | 2019-05-27 17:38:55 +0100 |
commit | 98aac6b751879305dd236c3f22c44755514c8162 (patch) | |
tree | d2c854a0adecc4e3e7c90466433f1f6a1389ab2f /crates/ra_mbe/src/subtree_source.rs | |
parent | c8c9230dd2c2b981fbc90ff587b41b7342b72480 (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.rs | 63 |
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 | ||
13 | pub(crate) struct SubtreeTokenSource<'a> { | 13 | pub(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 | ||
134 | impl<'a> TokenSource for SubtreeTokenSource<'a> { | 85 | impl<'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? |