Implement Display for macro expansion errors

This commit is contained in:
Jonas Schievink 2020-11-26 16:56:22 +01:00
parent db061fb274
commit 2c85db8eb6
2 changed files with 27 additions and 0 deletions

View File

@ -12,6 +12,8 @@ mod subtree_source;
#[cfg(test)]
mod tests;
use std::fmt;
pub use tt::{Delimiter, Punct};
use crate::{
@ -42,6 +44,20 @@ impl From<tt::ExpansionError> for ExpandError {
}
}
impl fmt::Display for ExpandError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExpandError::NoMatchingRule => f.write_str("no rule matches input tokens"),
ExpandError::UnexpectedToken => f.write_str("unexpected token in input"),
ExpandError::BindingError(e) => f.write_str(e),
ExpandError::ConversionError => f.write_str("could not convert tokens"),
ExpandError::InvalidRepeat => f.write_str("invalid repeat expression"),
ExpandError::ProcMacroError(e) => write!(f, "{}", e),
ExpandError::Other(e) => f.write_str(e),
}
}
}
pub use crate::syntax_bridge::{
ast_to_token_tree, parse_to_token_tree, syntax_node_to_token_tree, token_tree_to_syntax_node,
TokenMap,

View File

@ -240,6 +240,17 @@ pub enum ExpansionError {
ExpansionError(String),
}
impl fmt::Display for ExpansionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExpansionError::IOError(e) => write!(f, "I/O error: {}", e),
ExpansionError::JsonError(e) => write!(f, "JSON decoding error: {}", e),
ExpansionError::Unknown(e) => write!(f, "{}", e),
ExpansionError::ExpansionError(e) => write!(f, "proc macro returned error: {}", e),
}
}
}
pub trait TokenExpander: Debug + Send + Sync + RefUnwindSafe {
fn expand(&self, subtree: &Subtree, attrs: Option<&Subtree>)
-> Result<Subtree, ExpansionError>;