diff options
Diffstat (limited to 'crates/ra_mbe/src/tt_cursor.rs')
-rw-r--r-- | crates/ra_mbe/src/tt_cursor.rs | 58 |
1 files changed, 3 insertions, 55 deletions
diff --git a/crates/ra_mbe/src/tt_cursor.rs b/crates/ra_mbe/src/tt_cursor.rs index 52e072599..d29faa77c 100644 --- a/crates/ra_mbe/src/tt_cursor.rs +++ b/crates/ra_mbe/src/tt_cursor.rs | |||
@@ -1,25 +1,5 @@ | |||
1 | use crate::ParseError; | 1 | use crate::ParseError; |
2 | use crate::subtree_source::SubtreeTokenSource; | 2 | use crate::subtree_parser::Parser; |
3 | |||
4 | use ra_parser::{TokenSource, TreeSink}; | ||
5 | |||
6 | use ra_syntax::{ | ||
7 | SyntaxKind | ||
8 | }; | ||
9 | |||
10 | struct SubtreeTokenSink { | ||
11 | token_pos: usize, | ||
12 | } | ||
13 | |||
14 | impl TreeSink for SubtreeTokenSink { | ||
15 | fn token(&mut self, _kind: SyntaxKind, n_tokens: u8) { | ||
16 | self.token_pos += n_tokens as usize; | ||
17 | } | ||
18 | |||
19 | fn start_node(&mut self, _kind: SyntaxKind) {} | ||
20 | fn finish_node(&mut self) {} | ||
21 | fn error(&mut self, _error: ra_parser::ParseError) {} | ||
22 | } | ||
23 | 3 | ||
24 | #[derive(Clone)] | 4 | #[derive(Clone)] |
25 | pub(crate) struct TtCursor<'a> { | 5 | pub(crate) struct TtCursor<'a> { |
@@ -99,41 +79,9 @@ impl<'a> TtCursor<'a> { | |||
99 | }) | 79 | }) |
100 | } | 80 | } |
101 | 81 | ||
102 | fn eat_parse_result( | ||
103 | &mut self, | ||
104 | parsed_token: usize, | ||
105 | src: &mut SubtreeTokenSource, | ||
106 | ) -> Option<tt::TokenTree> { | ||
107 | let (adv, res) = src.bump_n(parsed_token, self.pos); | ||
108 | self.pos += adv; | ||
109 | |||
110 | let res: Vec<_> = res.into_iter().cloned().collect(); | ||
111 | |||
112 | match res.len() { | ||
113 | 0 => None, | ||
114 | 1 => Some(res[0].clone()), | ||
115 | _ => Some(tt::TokenTree::Subtree(tt::Subtree { | ||
116 | delimiter: tt::Delimiter::None, | ||
117 | token_trees: res, | ||
118 | })), | ||
119 | } | ||
120 | } | ||
121 | |||
122 | fn eat_parse<F>(&mut self, f: F) -> Option<tt::TokenTree> | ||
123 | where | ||
124 | F: FnOnce(&dyn TokenSource, &mut dyn TreeSink), | ||
125 | { | ||
126 | let mut src = SubtreeTokenSource::new(self.subtree); | ||
127 | src.advance(self.pos, true); | ||
128 | let mut sink = SubtreeTokenSink { token_pos: 0 }; | ||
129 | |||
130 | f(&src, &mut sink); | ||
131 | |||
132 | self.eat_parse_result(sink.token_pos, &mut src) | ||
133 | } | ||
134 | |||
135 | pub(crate) fn eat_path(&mut self) -> Option<tt::TokenTree> { | 82 | pub(crate) fn eat_path(&mut self) -> Option<tt::TokenTree> { |
136 | self.eat_parse(ra_parser::parse_path) | 83 | let parser = Parser::new(&mut self.pos, self.subtree); |
84 | parser.parse_path() | ||
137 | } | 85 | } |
138 | 86 | ||
139 | pub(crate) fn expect_char(&mut self, char: char) -> Result<(), ParseError> { | 87 | pub(crate) fn expect_char(&mut self, char: char) -> Result<(), ParseError> { |