Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/mbe/src/lib.rs')
| -rw-r--r-- | crates/mbe/src/lib.rs | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/crates/mbe/src/lib.rs b/crates/mbe/src/lib.rs index 8d223c375a..135282a3cb 100644 --- a/crates/mbe/src/lib.rs +++ b/crates/mbe/src/lib.rs @@ -37,12 +37,22 @@ pub use crate::{ #[derive(Debug, PartialEq, Eq, Clone)] pub enum ParseError { - UnexpectedToken(String), - Expected(String), + UnexpectedToken(Box<str>), + Expected(Box<str>), InvalidRepeat, RepetitionEmptyTokenTree, } +impl ParseError { + fn expected(e: &str) -> ParseError { + ParseError::Expected(e.into()) + } + + fn unexpected(e: &str) -> ParseError { + ParseError::UnexpectedToken(e.into()) + } +} + impl fmt::Display for ParseError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { @@ -58,11 +68,17 @@ impl fmt::Display for ParseError { pub enum ExpandError { NoMatchingRule, UnexpectedToken, - BindingError(String), + BindingError(Box<str>), ConversionError, // FIXME: no way mbe should know about proc macros. UnresolvedProcMacro, - Other(String), + Other(Box<str>), +} + +impl ExpandError { + fn binding_error(e: &str) -> ExpandError { + ExpandError::BindingError(e.into()) + } } impl fmt::Display for ExpandError { @@ -107,28 +123,25 @@ impl Shift { // Find the max token id inside a subtree fn max_id(subtree: &tt::Subtree) -> Option<u32> { - subtree - .token_trees - .iter() - .filter_map(|tt| match tt { - tt::TokenTree::Subtree(subtree) => { - let tree_id = max_id(subtree); - match subtree.delimiter { - Some(it) if it.id != tt::TokenId::unspecified() => { - Some(tree_id.map_or(it.id.0, |t| t.max(it.id.0))) - } - _ => tree_id, + let filter = |tt: &_| match tt { + tt::TokenTree::Subtree(subtree) => { + let tree_id = max_id(subtree); + match subtree.delimiter { + Some(it) if it.id != tt::TokenId::unspecified() => { + Some(tree_id.map_or(it.id.0, |t| t.max(it.id.0))) } + _ => tree_id, } - tt::TokenTree::Leaf(leaf) => { - let &(tt::Leaf::Ident(tt::Ident { id, .. }) - | tt::Leaf::Punct(tt::Punct { id, .. }) - | tt::Leaf::Literal(tt::Literal { id, .. })) = leaf; + } + tt::TokenTree::Leaf(leaf) => { + let &(tt::Leaf::Ident(tt::Ident { id, .. }) + | tt::Leaf::Punct(tt::Punct { id, .. }) + | tt::Leaf::Literal(tt::Literal { id, .. })) = leaf; - (id != tt::TokenId::unspecified()).then(|| id.0) - } - }) - .max() + (id != tt::TokenId::unspecified()).then(|| id.0) + } + }; + subtree.token_trees.iter().filter_map(filter).max() } } @@ -183,7 +196,7 @@ impl DeclarativeMacro { rules.push(rule); if let Err(()) = src.expect_char(';') { if src.len() > 0 { - return Err(ParseError::Expected("expected `;`".to_string())); + return Err(ParseError::expected("expected `;`")); } break; } @@ -208,9 +221,7 @@ impl DeclarativeMacro { rules.push(rule); if let Err(()) = src.expect_any_char(&[';', ',']) { if src.len() > 0 { - return Err(ParseError::Expected( - "expected `;` or `,` to delimit rules".to_string(), - )); + return Err(ParseError::expected("expected `;` or `,` to delimit rules")); } break; } @@ -219,7 +230,7 @@ impl DeclarativeMacro { cov_mark::hit!(parse_macro_def_simple); let rule = Rule::parse(&mut src, false)?; if src.len() != 0 { - return Err(ParseError::Expected("remaining tokens in macro def".to_string())); + return Err(ParseError::expected("remaining tokens in macro def")); } rules.push(rule); } @@ -256,16 +267,12 @@ impl DeclarativeMacro { impl Rule { fn parse(src: &mut TtIter, expect_arrow: bool) -> Result<Self, ParseError> { - let lhs = src - .expect_subtree() - .map_err(|()| ParseError::Expected("expected subtree".to_string()))?; + let lhs = src.expect_subtree().map_err(|()| ParseError::expected("expected subtree"))?; if expect_arrow { - src.expect_char('=').map_err(|()| ParseError::Expected("expected `=`".to_string()))?; - src.expect_char('>').map_err(|()| ParseError::Expected("expected `>`".to_string()))?; + src.expect_char('=').map_err(|()| ParseError::expected("expected `=`"))?; + src.expect_char('>').map_err(|()| ParseError::expected("expected `>`"))?; } - let rhs = src - .expect_subtree() - .map_err(|()| ParseError::Expected("expected subtree".to_string()))?; + let rhs = src.expect_subtree().map_err(|()| ParseError::expected("expected subtree"))?; let lhs = MetaTemplate::parse_pattern(lhs)?; let rhs = MetaTemplate::parse_template(rhs)?; @@ -325,7 +332,7 @@ impl<T> ExpandResult<T> { where T: Default, { - Self::only_err(ExpandError::Other(err)) + Self::only_err(ExpandError::Other(err.into())) } pub fn map<U>(self, f: impl FnOnce(T) -> U) -> ExpandResult<U> { |