diff options
Diffstat (limited to 'crates/mbe/src/expander/transcriber.rs')
-rw-r--r-- | crates/mbe/src/expander/transcriber.rs | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/crates/mbe/src/expander/transcriber.rs b/crates/mbe/src/expander/transcriber.rs index ad9953a7d..dd7fa97d7 100644 --- a/crates/mbe/src/expander/transcriber.rs +++ b/crates/mbe/src/expander/transcriber.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | //! `$ident => foo`, interpolates variables in the template, to get `fn foo() {}` | 2 | //! `$ident => foo`, interpolates variables in the template, to get `fn foo() {}` |
3 | 3 | ||
4 | use syntax::SmolStr; | 4 | use syntax::SmolStr; |
5 | use tt::Delimiter; | 5 | use tt::{Delimiter, Subtree}; |
6 | 6 | ||
7 | use super::ExpandResult; | 7 | use super::ExpandResult; |
8 | use crate::{ | 8 | use crate::{ |
@@ -13,17 +13,13 @@ use crate::{ | |||
13 | 13 | ||
14 | impl Bindings { | 14 | impl Bindings { |
15 | fn contains(&self, name: &str) -> bool { | 15 | fn contains(&self, name: &str) -> bool { |
16 | self.inner.iter().any(|(n, _)| n == name) | 16 | self.inner.contains_key(name) |
17 | } | 17 | } |
18 | 18 | ||
19 | fn get(&self, name: &str, nesting: &mut [NestingState]) -> Result<&Fragment, ExpandError> { | 19 | fn get(&self, name: &str, nesting: &mut [NestingState]) -> Result<&Fragment, ExpandError> { |
20 | let mut b: &Binding = self | 20 | let mut b: &Binding = self.inner.get(name).ok_or_else(|| { |
21 | .inner | 21 | ExpandError::BindingError(format!("could not find binding `{}`", name)) |
22 | .iter() | 22 | })?; |
23 | .find_map(|(n, b)| if n == name { Some(b) } else { None }) | ||
24 | .ok_or_else(|| { | ||
25 | ExpandError::BindingError(format!("could not find binding `{}`", name)) | ||
26 | })?; | ||
27 | for nesting_state in nesting.iter_mut() { | 23 | for nesting_state in nesting.iter_mut() { |
28 | nesting_state.hit = true; | 24 | nesting_state.hit = true; |
29 | b = match b { | 25 | b = match b { |
@@ -179,7 +175,10 @@ fn expand_repeat( | |||
179 | counter += 1; | 175 | counter += 1; |
180 | if counter == limit { | 176 | if counter == limit { |
181 | log::warn!("expand_tt in repeat pattern exceed limit => {:#?}\n{:#?}", template, ctx); | 177 | log::warn!("expand_tt in repeat pattern exceed limit => {:#?}\n{:#?}", template, ctx); |
182 | break; | 178 | return ExpandResult { |
179 | value: Fragment::Tokens(Subtree::default().into()), | ||
180 | err: Some(ExpandError::Other("Expand exceed limit".to_string())), | ||
181 | }; | ||
183 | } | 182 | } |
184 | 183 | ||
185 | if e.is_some() { | 184 | if e.is_some() { |