#[macro_export]
macro_rules! define_error {
($name:ident $(< $($gen:ident : $bound:path),* >)? {
$build_fn:item
$location_fn:item
}) => {
$crate::define_diag!(
$crate::diagnostics::Severity::Error
=> $name $(< $($gen : $bound),* >)? {
$build_fn
$location_fn
}
);
};
}
#[macro_export]
macro_rules! define_warning {
($name:ident $(< $($gen:ident : $bound:path),* >)? {
$build_fn:item
$location_fn:item
}) => {
$crate::define_diag!(
$crate::diagnostics::Severity::Warning
=> $name $(< $($gen : $bound),* >)? {
$build_fn
$location_fn
}
);
};
}
#[macro_export]
macro_rules! define_bug {
($name:ident $(< $($gen:ident : $bound:path),* >)? {
$build_fn:item
$location_fn:item
}) => {
$crate::define_diag!(
$crate::diagnostics::Severity::Bug
=> $name $(< $($gen : $bound),* >)? {
$build_fn
$location_fn
}
);
};
}
#[macro_export]
macro_rules! define_diag {
(
$severity:expr
=>
$name:ident $(< $($gen:ident : $bound:path),* >)?
{
$build_fn:item
$location_fn:item
}
) => {
impl$(<$($gen : $bound),*>)? $crate::diagnostics::Diag for $name$(<$($gen),*>)? {
fn severity(&self) -> $crate::diagnostics::Severity {
$severity
}
$build_fn
}
impl$(<$($gen : $bound),*>)? $crate::utils::Located for $name$(<$($gen),*>)? {
$location_fn
}
impl$(<$($gen : $bound),*>)? std::fmt::Debug for $name$(<$($gen),*>)? {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let diag = <$name$(<$($gen),*>)? as $crate::diagnostics::Diag>::build(
&self,
$crate::diagnostics::Builder::new(
<$name$(<$($gen),*>)? as $crate::diagnostics::Diag>::severity(&self)
),
);
let mut joined = String::new();
for (i, lbl) in diag.labels.iter().enumerate() {
if i != 0 {
joined.push_str(", ");
}
joined.push_str(&lbl.message);
}
f.pad(&joined)
}
}
};
}