1 pub trait SpanError { 2 #[allow(non_snake_case)] EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error3 fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error; 4 } 5 6 pub trait ToTokensError { 7 #[allow(non_snake_case)] EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error8 fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error; 9 } 10 11 impl<T: quote::ToTokens> ToTokensError for T { EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error12 fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error { 13 // Curb monomorphization from generating too many identical `new_spanned`. 14 syn::Error::new_spanned(self.to_token_stream(), msg) 15 } 16 } 17 18 impl SpanError for proc_macro2::Span { EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error19 fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error { 20 syn::Error::new(*self, msg) 21 } 22 } 23