Crate devise::proc_macro2_diagnostics [−]
Expand description
Diagnostic emulation on stable and nightly.
Usage
- Depend on the library in your proc-macro.
[dependencies] proc_macro2_diagnostics = "0.9"
- Import
SpanDiagnosticExt
and use its methods on a [proc_macro2::Span
] to createDiagnostic
s:
use syn::spanned::Spanned; use proc_macro2::TokenStream; use proc_macro2_diagnostics::{SpanDiagnosticExt, Diagnostic}; fn my_macro(input: TokenStream) -> Result<TokenStream, Diagnostic> { Err(input.span().error("there's a problem here...")) }
- If there’s an error, emit the diagnostic as tokens:
extern crate proc_macro; #[proc_macro] pub fn real_macro(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream { match my_macro(tokens.into()) { Ok(tokens) => tokens.into(), Err(diag) => diag.emit_as_expr_tokens().into() } }
This does the right thing on nightly or stable.
Caveats
On stable, due to limitations, any top-level, non-error diagnostics are
emitted as errors. This will abort compilation. To avoid this, you may want
to cfg
-gate emitting non-error diagnostics to nightly.
Colors
By default, error messages are colored on stable. To disable, disable default features:
[dependencies] proc_macro2_diagnostics = { version = "0.9", default-features = false }
The compiler always colors diagnostics on nightly.
Structs
A structure representing a diagnostic message and associated children messages.
Enums
An enum representing a diagnostic level.
Traits
Extension trait for proc_macro2::Span
emulating the proc-macro diagnostic
API on stable and nightly.