1*26bd9402SBenno Lossin // SPDX-License-Identifier: Apache-2.0 OR MIT 2*26bd9402SBenno Lossin 3*26bd9402SBenno Lossin use std::fmt::Display; 4*26bd9402SBenno Lossin 5*26bd9402SBenno Lossin use proc_macro2::TokenStream; 6*26bd9402SBenno Lossin use syn::{spanned::Spanned, Error}; 7*26bd9402SBenno Lossin 8*26bd9402SBenno Lossin pub(crate) struct DiagCtxt(TokenStream); 9*26bd9402SBenno Lossin pub(crate) struct ErrorGuaranteed(()); 10*26bd9402SBenno Lossin 11*26bd9402SBenno Lossin impl DiagCtxt { 12*26bd9402SBenno Lossin pub(crate) fn error(&mut self, span: impl Spanned, msg: impl Display) -> ErrorGuaranteed { 13*26bd9402SBenno Lossin let error = Error::new(span.span(), msg); 14*26bd9402SBenno Lossin self.0.extend(error.into_compile_error()); 15*26bd9402SBenno Lossin ErrorGuaranteed(()) 16*26bd9402SBenno Lossin } 17*26bd9402SBenno Lossin 18*26bd9402SBenno Lossin pub(crate) fn with( 19*26bd9402SBenno Lossin fun: impl FnOnce(&mut DiagCtxt) -> Result<TokenStream, ErrorGuaranteed>, 20*26bd9402SBenno Lossin ) -> TokenStream { 21*26bd9402SBenno Lossin let mut dcx = Self(TokenStream::new()); 22*26bd9402SBenno Lossin match fun(&mut dcx) { 23*26bd9402SBenno Lossin Ok(mut stream) => { 24*26bd9402SBenno Lossin stream.extend(dcx.0); 25*26bd9402SBenno Lossin stream 26*26bd9402SBenno Lossin } 27*26bd9402SBenno Lossin Err(ErrorGuaranteed(())) => dcx.0, 28*26bd9402SBenno Lossin } 29*26bd9402SBenno Lossin } 30*26bd9402SBenno Lossin } 31