diff options
author | Edwin Cheng <[email protected]> | 2019-04-07 17:12:07 +0100 |
---|---|---|
committer | Edwin Cheng <[email protected]> | 2019-04-07 17:12:07 +0100 |
commit | a7254201df07fb929ca689857d7472564d484c3e (patch) | |
tree | bb32649bf733ed892971ff5ada4fabbe58acc77c /crates/ra_mbe/src/subtree_source.rs | |
parent | 7f1e93a3c934342a9b9c418865ff395b8ad245ce (diff) |
Combine all tokensource to one and refactoring
Diffstat (limited to 'crates/ra_mbe/src/subtree_source.rs')
-rw-r--r-- | crates/ra_mbe/src/subtree_source.rs | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/crates/ra_mbe/src/subtree_source.rs b/crates/ra_mbe/src/subtree_source.rs index 8f5ce4ed5..d9ba5d3d0 100644 --- a/crates/ra_mbe/src/subtree_source.rs +++ b/crates/ra_mbe/src/subtree_source.rs | |||
@@ -9,12 +9,12 @@ struct TtToken { | |||
9 | pub n_tokens: usize, | 9 | pub n_tokens: usize, |
10 | } | 10 | } |
11 | 11 | ||
12 | /// SubtreeSourceQuerier let outside to query internal tokens as string | 12 | /// Querier let outside to query internal tokens as string |
13 | pub(crate) struct SubtreeSourceQuerier<'a> { | 13 | pub(crate) struct Querier<'a> { |
14 | src: &'a SubtreeTokenSource<'a>, | 14 | src: &'a SubtreeTokenSource<'a>, |
15 | } | 15 | } |
16 | 16 | ||
17 | impl<'a> SubtreeSourceQuerier<'a> { | 17 | impl<'a> Querier<'a> { |
18 | pub(crate) fn token(&self, uidx: usize) -> (SyntaxKind, &SmolStr) { | 18 | pub(crate) fn token(&self, uidx: usize) -> (SyntaxKind, &SmolStr) { |
19 | let tkn = &self.src.tokens[uidx]; | 19 | let tkn = &self.src.tokens[uidx]; |
20 | (tkn.kind, &tkn.text) | 20 | (tkn.kind, &tkn.text) |
@@ -32,7 +32,8 @@ impl<'a> SubtreeTokenSource<'a> { | |||
32 | SubtreeTokenSource { tokens: TtTokenBuilder::build(subtree), tt_pos: 0, subtree } | 32 | SubtreeTokenSource { tokens: TtTokenBuilder::build(subtree), tt_pos: 0, subtree } |
33 | } | 33 | } |
34 | 34 | ||
35 | pub fn advance(&mut self, curr: usize, skip_first_delimiter: bool) { | 35 | // Advance token source and skip the first delimiter |
36 | pub fn advance(&mut self, n_token: usize, skip_first_delimiter: bool) { | ||
36 | if skip_first_delimiter { | 37 | if skip_first_delimiter { |
37 | self.tt_pos += 1; | 38 | self.tt_pos += 1; |
38 | } | 39 | } |
@@ -47,32 +48,20 @@ impl<'a> SubtreeTokenSource<'a> { | |||
47 | // Such that we cannot simpliy advance the cursor | 48 | // Such that we cannot simpliy advance the cursor |
48 | // We have to bump it one by one | 49 | // We have to bump it one by one |
49 | let mut pos = 0; | 50 | let mut pos = 0; |
50 | while pos < curr { | 51 | while pos < n_token { |
51 | pos += self.bump(&self.subtree.token_trees[pos]); | 52 | pos += self.bump(&self.subtree.token_trees[pos]); |
52 | } | 53 | } |
53 | } | 54 | } |
54 | 55 | ||
55 | pub fn querier(&self) -> SubtreeSourceQuerier { | 56 | pub fn querier(&self) -> Querier { |
56 | SubtreeSourceQuerier { src: self } | 57 | Querier { src: self } |
57 | } | ||
58 | |||
59 | fn count(&self, tt: &tt::TokenTree) -> usize { | ||
60 | assert!(!self.tokens.is_empty()); | ||
61 | TtTokenBuilder::count_tt_tokens(tt, None) | ||
62 | } | ||
63 | |||
64 | pub(crate) fn bump(&mut self, tt: &tt::TokenTree) -> usize { | ||
65 | let cur = &self.tokens[self.tt_pos]; | ||
66 | let n_tokens = cur.n_tokens; | ||
67 | self.tt_pos += self.count(tt); | ||
68 | n_tokens | ||
69 | } | 58 | } |
70 | 59 | ||
71 | pub(crate) fn bump_n( | 60 | pub(crate) fn bump_n( |
72 | &mut self, | 61 | &mut self, |
73 | n_tokens: usize, | 62 | n_tt_tokens: usize, |
74 | mut token_pos: usize, | 63 | token_pos: &mut usize, |
75 | ) -> (usize, Vec<&tt::TokenTree>) { | 64 | ) -> Vec<&tt::TokenTree> { |
76 | let mut res = vec![]; | 65 | let mut res = vec![]; |
77 | // Matching `TtToken` cursor to `tt::TokenTree` cursor | 66 | // Matching `TtToken` cursor to `tt::TokenTree` cursor |
78 | // It is because TtToken is not One to One mapping to tt::Token | 67 | // It is because TtToken is not One to One mapping to tt::Token |
@@ -83,17 +72,28 @@ impl<'a> SubtreeTokenSource<'a> { | |||
83 | // | 72 | // |
84 | // Such that we cannot simpliy advance the cursor | 73 | // Such that we cannot simpliy advance the cursor |
85 | // We have to bump it one by one | 74 | // We have to bump it one by one |
86 | let next_pos = self.tt_pos + n_tokens; | 75 | let next_pos = self.tt_pos + n_tt_tokens; |
87 | let old_token_pos = token_pos; | ||
88 | 76 | ||
89 | while self.tt_pos < next_pos { | 77 | while self.tt_pos < next_pos { |
90 | let current = &self.subtree.token_trees[token_pos]; | 78 | let current = &self.subtree.token_trees[*token_pos]; |
91 | let n = self.bump(current); | 79 | let n = self.bump(current); |
92 | res.extend((0..n).map(|i| &self.subtree.token_trees[token_pos + i])); | 80 | res.extend((0..n).map(|i| &self.subtree.token_trees[*token_pos + i])); |
93 | token_pos += n; | 81 | *token_pos += n; |
94 | } | 82 | } |
95 | 83 | ||
96 | (token_pos - old_token_pos, res) | 84 | res |
85 | } | ||
86 | |||
87 | fn count(&self, tt: &tt::TokenTree) -> usize { | ||
88 | assert!(!self.tokens.is_empty()); | ||
89 | TtTokenBuilder::count_tt_tokens(tt, None) | ||
90 | } | ||
91 | |||
92 | fn bump(&mut self, tt: &tt::TokenTree) -> usize { | ||
93 | let cur = &self.tokens[self.tt_pos]; | ||
94 | let n_tokens = cur.n_tokens; | ||
95 | self.tt_pos += self.count(tt); | ||
96 | n_tokens | ||
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||