flux_macros/
lib.rs

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