1*a3b620ffSPaolo Bonzini // Procedural macro utilities. 2*a3b620ffSPaolo Bonzini // Author(s): Paolo Bonzini <pbonzini@redhat.com> 3*a3b620ffSPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later 4*a3b620ffSPaolo Bonzini 5*a3b620ffSPaolo Bonzini use proc_macro2::Span; 6*a3b620ffSPaolo Bonzini use quote::quote_spanned; 7*a3b620ffSPaolo Bonzini 8*a3b620ffSPaolo Bonzini pub enum MacroError { 9*a3b620ffSPaolo Bonzini Message(String, Span), 10*a3b620ffSPaolo Bonzini ParseError(syn::Error), 11*a3b620ffSPaolo Bonzini } 12*a3b620ffSPaolo Bonzini 13*a3b620ffSPaolo Bonzini impl From<syn::Error> for MacroError { from(err: syn::Error) -> Self14*a3b620ffSPaolo Bonzini fn from(err: syn::Error) -> Self { 15*a3b620ffSPaolo Bonzini MacroError::ParseError(err) 16*a3b620ffSPaolo Bonzini } 17*a3b620ffSPaolo Bonzini } 18*a3b620ffSPaolo Bonzini 19*a3b620ffSPaolo Bonzini impl From<MacroError> for proc_macro2::TokenStream { from(err: MacroError) -> Self20*a3b620ffSPaolo Bonzini fn from(err: MacroError) -> Self { 21*a3b620ffSPaolo Bonzini match err { 22*a3b620ffSPaolo Bonzini MacroError::Message(msg, span) => quote_spanned! { span => compile_error!(#msg); }, 23*a3b620ffSPaolo Bonzini MacroError::ParseError(err) => err.into_compile_error(), 24*a3b620ffSPaolo Bonzini } 25*a3b620ffSPaolo Bonzini } 26*a3b620ffSPaolo Bonzini } 27