aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src/subtree_parser.rs
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-05-23 15:31:26 +0100
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-05-23 15:31:26 +0100
commitef00b5af1c7a7a7cac685eff661a10252825d84a (patch)
treeb48cf769d66b2c9366c5488cfa254520730a98a3 /crates/ra_mbe/src/subtree_parser.rs
parenteef24bddc96ddcdbcad5fddb9c0cf0e2ccad7681 (diff)
parent63b67134fdbfedfeab655ac9ff03730575fdf475 (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.rs6
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
3use ra_parser::{TokenSource, TreeSink}; 3use ra_parser::{TokenSource, TreeSink};
4use ra_syntax::{SyntaxKind}; 4use ra_syntax::{SyntaxKind};
5use tt::buffer::TokenBuffer;
5 6
6struct OffsetTokenSink { 7struct 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,