diff options
author | Edwin Cheng <[email protected]> | 2021-01-04 16:22:42 +0000 |
---|---|---|
committer | Edwin Cheng <[email protected]> | 2021-01-04 18:00:46 +0000 |
commit | af3d75ad2e760dc885f54e6179543718ef8f141f (patch) | |
tree | 821093073f61fbfb2d3d31304dfe0eacbef0bcf0 /crates/mbe/src/syntax_bridge.rs | |
parent | f1ffd14922d2dc885ba6441ca8380f7d4cb75269 (diff) |
Refactor TokenBuffer for reduc cloning
Diffstat (limited to 'crates/mbe/src/syntax_bridge.rs')
-rw-r--r-- | crates/mbe/src/syntax_bridge.rs | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/crates/mbe/src/syntax_bridge.rs b/crates/mbe/src/syntax_bridge.rs index 423a4934e..671036e1c 100644 --- a/crates/mbe/src/syntax_bridge.rs +++ b/crates/mbe/src/syntax_bridge.rs | |||
@@ -70,15 +70,12 @@ pub fn token_tree_to_syntax_node( | |||
70 | tt: &tt::Subtree, | 70 | tt: &tt::Subtree, |
71 | fragment_kind: FragmentKind, | 71 | fragment_kind: FragmentKind, |
72 | ) -> Result<(Parse<SyntaxNode>, TokenMap), ExpandError> { | 72 | ) -> Result<(Parse<SyntaxNode>, TokenMap), ExpandError> { |
73 | let tmp; | 73 | let buffer = match tt { |
74 | let tokens = match tt { | 74 | tt::Subtree { delimiter: None, token_trees } => { |
75 | tt::Subtree { delimiter: None, token_trees } => token_trees.as_slice(), | 75 | TokenBuffer::from_tokens(token_trees.as_slice()) |
76 | _ => { | ||
77 | tmp = [tt.clone().into()]; | ||
78 | &tmp[..] | ||
79 | } | 76 | } |
77 | _ => TokenBuffer::from_subtree(tt), | ||
80 | }; | 78 | }; |
81 | let buffer = TokenBuffer::new(&tokens); | ||
82 | let mut token_source = SubtreeTokenSource::new(&buffer); | 79 | let mut token_source = SubtreeTokenSource::new(&buffer); |
83 | let mut tree_sink = TtTreeSink::new(buffer.begin()); | 80 | let mut tree_sink = TtTreeSink::new(buffer.begin()); |
84 | parser::parse_fragment(&mut token_source, &mut tree_sink, fragment_kind); | 81 | parser::parse_fragment(&mut token_source, &mut tree_sink, fragment_kind); |
@@ -631,7 +628,7 @@ impl<'a> TreeSink for TtTreeSink<'a> { | |||
631 | } | 628 | } |
632 | last = self.cursor; | 629 | last = self.cursor; |
633 | let text: &str = match self.cursor.token_tree() { | 630 | let text: &str = match self.cursor.token_tree() { |
634 | Some(tt::TokenTree::Leaf(leaf)) => { | 631 | Some(tt::buffer::TokenTreeRef::Leaf(leaf, _)) => { |
635 | // Mark the range if needed | 632 | // Mark the range if needed |
636 | let (text, id) = match leaf { | 633 | let (text, id) = match leaf { |
637 | tt::Leaf::Ident(ident) => (&ident.text, ident.id), | 634 | tt::Leaf::Ident(ident) => (&ident.text, ident.id), |
@@ -650,7 +647,7 @@ impl<'a> TreeSink for TtTreeSink<'a> { | |||
650 | self.cursor = self.cursor.bump(); | 647 | self.cursor = self.cursor.bump(); |
651 | text | 648 | text |
652 | } | 649 | } |
653 | Some(tt::TokenTree::Subtree(subtree)) => { | 650 | Some(tt::buffer::TokenTreeRef::Subtree(subtree, _)) => { |
654 | self.cursor = self.cursor.subtree().unwrap(); | 651 | self.cursor = self.cursor.subtree().unwrap(); |
655 | if let Some(id) = subtree.delimiter.map(|it| it.id) { | 652 | if let Some(id) = subtree.delimiter.map(|it| it.id) { |
656 | self.open_delims.insert(id, self.text_pos); | 653 | self.open_delims.insert(id, self.text_pos); |
@@ -684,8 +681,8 @@ impl<'a> TreeSink for TtTreeSink<'a> { | |||
684 | // Add whitespace between adjoint puncts | 681 | // Add whitespace between adjoint puncts |
685 | let next = last.bump(); | 682 | let next = last.bump(); |
686 | if let ( | 683 | if let ( |
687 | Some(tt::TokenTree::Leaf(tt::Leaf::Punct(curr))), | 684 | Some(tt::buffer::TokenTreeRef::Leaf(tt::Leaf::Punct(curr), _)), |
688 | Some(tt::TokenTree::Leaf(tt::Leaf::Punct(_))), | 685 | Some(tt::buffer::TokenTreeRef::Leaf(tt::Leaf::Punct(_), _)), |
689 | ) = (last.token_tree(), next.token_tree()) | 686 | ) = (last.token_tree(), next.token_tree()) |
690 | { | 687 | { |
691 | // Note: We always assume the semi-colon would be the last token in | 688 | // Note: We always assume the semi-colon would be the last token in |
@@ -744,7 +741,7 @@ mod tests { | |||
744 | ) | 741 | ) |
745 | .expand_tt("literals!(foo);"); | 742 | .expand_tt("literals!(foo);"); |
746 | let tts = &[expansion.into()]; | 743 | let tts = &[expansion.into()]; |
747 | let buffer = tt::buffer::TokenBuffer::new(tts); | 744 | let buffer = tt::buffer::TokenBuffer::from_tokens(tts); |
748 | let mut tt_src = SubtreeTokenSource::new(&buffer); | 745 | let mut tt_src = SubtreeTokenSource::new(&buffer); |
749 | let mut tokens = vec![]; | 746 | let mut tokens = vec![]; |
750 | while tt_src.current().kind != EOF { | 747 | while tt_src.current().kind != EOF { |