diff options
Diffstat (limited to 'crates/ra_mbe/src/mbe_expander/matcher.rs')
-rw-r--r-- | crates/ra_mbe/src/mbe_expander/matcher.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/crates/ra_mbe/src/mbe_expander/matcher.rs b/crates/ra_mbe/src/mbe_expander/matcher.rs index 49c53183a..f9d4952c6 100644 --- a/crates/ra_mbe/src/mbe_expander/matcher.rs +++ b/crates/ra_mbe/src/mbe_expander/matcher.rs | |||
@@ -11,6 +11,7 @@ use crate::{ | |||
11 | use ra_parser::{FragmentKind::*, TreeSink}; | 11 | use ra_parser::{FragmentKind::*, TreeSink}; |
12 | use ra_syntax::{SmolStr, SyntaxKind}; | 12 | use ra_syntax::{SmolStr, SyntaxKind}; |
13 | use tt::buffer::{Cursor, TokenBuffer}; | 13 | use tt::buffer::{Cursor, TokenBuffer}; |
14 | use super::ExpandResult; | ||
14 | 15 | ||
15 | impl Bindings { | 16 | impl Bindings { |
16 | fn push_optional(&mut self, name: &SmolStr) { | 17 | fn push_optional(&mut self, name: &SmolStr) { |
@@ -64,19 +65,19 @@ macro_rules! bail { | |||
64 | }; | 65 | }; |
65 | } | 66 | } |
66 | 67 | ||
67 | pub(super) fn match_(pattern: &tt::Subtree, src: &tt::Subtree) -> Result<Bindings, ExpandError> { | 68 | pub(super) fn match_(pattern: &tt::Subtree, src: &tt::Subtree) -> ExpandResult<Bindings> { |
68 | assert!(pattern.delimiter == None); | 69 | assert!(pattern.delimiter == None); |
69 | 70 | ||
70 | let mut res = Bindings::default(); | 71 | let mut res = Bindings::default(); |
71 | let mut src = TtIter::new(src); | 72 | let mut src = TtIter::new(src); |
72 | 73 | ||
73 | match_subtree(&mut res, pattern, &mut src)?; | 74 | let mut err = match_subtree(&mut res, pattern, &mut src).err(); |
74 | 75 | ||
75 | if src.len() > 0 { | 76 | if src.len() > 0 && err.is_none() { |
76 | bail!("leftover tokens"); | 77 | err = Some(err!("leftover tokens")); |
77 | } | 78 | } |
78 | 79 | ||
79 | Ok(res) | 80 | (res, err) |
80 | } | 81 | } |
81 | 82 | ||
82 | fn match_subtree( | 83 | fn match_subtree( |