Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/mbe/src/syntax_bridge.rs')
| -rw-r--r-- | crates/mbe/src/syntax_bridge.rs | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/crates/mbe/src/syntax_bridge.rs b/crates/mbe/src/syntax_bridge.rs index 109842b0cd..39129b0305 100644 --- a/crates/mbe/src/syntax_bridge.rs +++ b/crates/mbe/src/syntax_bridge.rs @@ -1,6 +1,5 @@ //! Conversions between [`SyntaxNode`] and [`tt::TokenTree`]. -use parser::{ParseError, TreeSink}; use rustc_hash::{FxHashMap, FxHashSet}; use syntax::{ ast::{self, make::tokens::doc_comment}, @@ -56,8 +55,18 @@ pub fn token_tree_to_syntax_node( _ => TokenBuffer::from_subtree(tt), }; let parser_tokens = to_parser_tokens(&buffer); + let tree_traversal = parser::parse(&parser_tokens, entry_point); let mut tree_sink = TtTreeSink::new(buffer.begin()); - parser::parse(&parser_tokens, &mut tree_sink, entry_point); + for event in tree_traversal.iter() { + match event { + parser::TraversalStep::Token { kind, n_raw_tokens } => { + tree_sink.token(kind, n_raw_tokens) + } + parser::TraversalStep::EnterNode { kind } => tree_sink.start_node(kind), + parser::TraversalStep::LeaveNode => tree_sink.finish_node(), + parser::TraversalStep::Error { msg } => tree_sink.error(msg.to_string()), + } + } if tree_sink.roots.len() != 1 { return Err(ExpandError::ConversionError); } @@ -643,7 +652,7 @@ fn delim_to_str(d: tt::DelimiterKind, closing: bool) -> &'static str { &texts[idx..texts.len() - (1 - idx)] } -impl<'a> TreeSink for TtTreeSink<'a> { +impl<'a> TtTreeSink<'a> { fn token(&mut self, kind: SyntaxKind, mut n_tokens: u8) { if kind == LIFETIME_IDENT { n_tokens = 2; @@ -741,7 +750,7 @@ impl<'a> TreeSink for TtTreeSink<'a> { *self.roots.last_mut().unwrap() -= 1; } - fn error(&mut self, error: ParseError) { + fn error(&mut self, error: String) { self.inner.error(error, self.text_pos) } } |