aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src/tt_cursor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_mbe/src/tt_cursor.rs')
-rw-r--r--crates/ra_mbe/src/tt_cursor.rs58
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 @@
1use crate::ParseError; 1use crate::ParseError;
2use crate::subtree_source::SubtreeTokenSource; 2use crate::subtree_parser::Parser;
3
4use ra_parser::{TokenSource, TreeSink};
5
6use ra_syntax::{
7 SyntaxKind
8};
9
10struct SubtreeTokenSink {
11 token_pos: usize,
12}
13
14impl 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)]
25pub(crate) struct TtCursor<'a> { 5pub(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> {