aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src/subtree_source.rs
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2019-04-07 17:12:07 +0100
committerEdwin Cheng <[email protected]>2019-04-07 17:12:07 +0100
commita7254201df07fb929ca689857d7472564d484c3e (patch)
treebb32649bf733ed892971ff5ada4fabbe58acc77c /crates/ra_mbe/src/subtree_source.rs
parent7f1e93a3c934342a9b9c418865ff395b8ad245ce (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.rs56
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
13pub(crate) struct SubtreeSourceQuerier<'a> { 13pub(crate) struct Querier<'a> {
14 src: &'a SubtreeTokenSource<'a>, 14 src: &'a SubtreeTokenSource<'a>,
15} 15}
16 16
17impl<'a> SubtreeSourceQuerier<'a> { 17impl<'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