flux_macros/
lib.rs

1#![feature(proc_macro_diagnostic, never_type, proc_macro_span, let_chains, if_let_guard)]
2
3mod diagnostics;
4mod fold;
5mod primops;
6
7use quote::quote;
8use synstructure::decl_derive;
9
10decl_derive!(
11    [Diagnostic, attributes(
12        // struct attributes
13        diag,
14        help,
15        note,
16        warning,
17        // field attributes
18        skip_arg,
19        primary_span,
20        label,
21        subdiagnostic,
22        suggestion,
23        suggestion_short,
24        suggestion_hidden,
25        suggestion_verbose)] => diagnostics::diagnostic_derive
26);
27
28decl_derive!(
29    [Subdiagnostic, attributes(
30        // struct/variant attributes
31        label,
32        help,
33        note,
34        warning,
35        suggestion,
36        suggestion_short,
37        suggestion_hidden,
38        suggestion_verbose,
39        multipart_suggestion,
40        multipart_suggestion_short,
41        multipart_suggestion_hidden,
42        multipart_suggestion_verbose,
43        // field attributes
44        skip_arg,
45        primary_span,
46        suggestion_part,
47        applicability)] => diagnostics::subdiagnostic_derive
48);
49
50decl_derive!(
51    [TypeFoldable] => fold::type_foldable_derive
52);
53
54decl_derive!(
55    [TypeVisitable] => fold::type_visitable_derive
56);
57
58#[proc_macro]
59pub fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
60    diagnostics::fluent_messages(input)
61}
62
63#[proc_macro]
64pub fn primop_rules(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
65    primops::primop_rules(input)
66}
67
68decl_derive!(
69    [DebugAsJson] => debug_as_json
70);
71
72fn debug_as_json(s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
73    s.gen_impl(quote! {
74        gen impl std::fmt::Debug for @Self {
75            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
76                let s = serde_json::to_string(&self).map_err(|_| std::fmt::Error::default())?;
77                write!(f, "{}", s)
78            }
79        }
80    })
81}