pub trait SpanError { #[allow(non_snake_case)] fn EXPECTED_Span_OR_ToTokens(&self, msg: D) -> syn::Error; } pub trait ToTokensError { #[allow(non_snake_case)] fn EXPECTED_Span_OR_ToTokens(&self, msg: D) -> syn::Error; } impl ToTokensError for T { fn EXPECTED_Span_OR_ToTokens(&self, msg: D) -> syn::Error { // Curb monomorphization from generating too many identical `new_spanned`. syn::Error::new_spanned(self.to_token_stream(), msg) } } impl SpanError for proc_macro2::Span { fn EXPECTED_Span_OR_ToTokens(&self, msg: D) -> syn::Error { syn::Error::new(*self, msg) } }