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