diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-05-23 15:31:26 +0100 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-05-23 15:31:26 +0100 |
commit | ef00b5af1c7a7a7cac685eff661a10252825d84a (patch) | |
tree | b48cf769d66b2c9366c5488cfa254520730a98a3 /crates/ra_mbe/src/subtree_parser.rs | |
parent | eef24bddc96ddcdbcad5fddb9c0cf0e2ccad7681 (diff) | |
parent | 63b67134fdbfedfeab655ac9ff03730575fdf475 (diff) |
Merge #1312
1312: Introduce TokenBuffer r=matklad a=edwin0cheng
As discussed in Zulip, this PR Introduce `TokenBuffer` , a safe version of `syn` crate `TokenBuffer` which support cursor based traversal of `tt::TokenTree`. This is the basis of incoming refactoring of `TokenSource` iterator based API.
This PR do the following things:
* Add TokenBuffer in `ra_tt` crate.
* Try to use this new API to refactor the `SubtreeSource` to prove it usage.
Co-authored-by: Edwin Cheng <[email protected]>
Diffstat (limited to 'crates/ra_mbe/src/subtree_parser.rs')
-rw-r--r-- | crates/ra_mbe/src/subtree_parser.rs | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/crates/ra_mbe/src/subtree_parser.rs b/crates/ra_mbe/src/subtree_parser.rs index f07107414..709b87a38 100644 --- a/crates/ra_mbe/src/subtree_parser.rs +++ b/crates/ra_mbe/src/subtree_parser.rs | |||
@@ -2,6 +2,7 @@ use crate::subtree_source::SubtreeTokenSource; | |||
2 | 2 | ||
3 | use ra_parser::{TokenSource, TreeSink}; | 3 | use ra_parser::{TokenSource, TreeSink}; |
4 | use ra_syntax::{SyntaxKind}; | 4 | use ra_syntax::{SyntaxKind}; |
5 | use tt::buffer::TokenBuffer; | ||
5 | 6 | ||
6 | struct OffsetTokenSink { | 7 | struct OffsetTokenSink { |
7 | token_pos: usize, | 8 | token_pos: usize, |
@@ -69,7 +70,8 @@ impl<'a> Parser<'a> { | |||
69 | where | 70 | where |
70 | F: FnOnce(&dyn TokenSource, &mut dyn TreeSink), | 71 | F: FnOnce(&dyn TokenSource, &mut dyn TreeSink), |
71 | { | 72 | { |
72 | let mut src = SubtreeTokenSource::new(&self.subtree.token_trees[*self.cur_pos..]); | 73 | let buffer = TokenBuffer::new(&self.subtree.token_trees[*self.cur_pos..]); |
74 | let mut src = SubtreeTokenSource::new(&buffer); | ||
73 | let mut sink = OffsetTokenSink { token_pos: 0, error: false }; | 75 | let mut sink = OffsetTokenSink { token_pos: 0, error: false }; |
74 | 76 | ||
75 | f(&src, &mut sink); | 77 | f(&src, &mut sink); |
@@ -85,7 +87,7 @@ impl<'a> Parser<'a> { | |||
85 | let res = src.bump_n(parsed_token); | 87 | let res = src.bump_n(parsed_token); |
86 | *self.cur_pos += res.len(); | 88 | *self.cur_pos += res.len(); |
87 | 89 | ||
88 | let res: Vec<_> = res.into_iter().cloned().collect(); | 90 | let res: Vec<_> = res.into_iter().collect(); |
89 | 91 | ||
90 | match res.len() { | 92 | match res.len() { |
91 | 0 => None, | 93 | 0 => None, |