aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src/mbe_expander/matcher.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2020-03-13 12:03:31 +0000
committerFlorian Diebold <[email protected]>2020-03-16 17:38:19 +0000
commitb973158aeb337041d4e1434cf5d8c609a0b02bef (patch)
treee3da1bb7a3c2d89623382865edc7ef64c039496d /crates/ra_mbe/src/mbe_expander/matcher.rs
parentd3773ec1522681de117d354f0c82e753c68c6d0b (diff)
Make MBE expansion more resilient (WIP)
Diffstat (limited to 'crates/ra_mbe/src/mbe_expander/matcher.rs')
-rw-r--r--crates/ra_mbe/src/mbe_expander/matcher.rs11
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::{
11use ra_parser::{FragmentKind::*, TreeSink}; 11use ra_parser::{FragmentKind::*, TreeSink};
12use ra_syntax::{SmolStr, SyntaxKind}; 12use ra_syntax::{SmolStr, SyntaxKind};
13use tt::buffer::{Cursor, TokenBuffer}; 13use tt::buffer::{Cursor, TokenBuffer};
14use super::ExpandResult;
14 15
15impl Bindings { 16impl 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
67pub(super) fn match_(pattern: &tt::Subtree, src: &tt::Subtree) -> Result<Bindings, ExpandError> { 68pub(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
82fn match_subtree( 83fn match_subtree(