Skip to main content

flux_macros/
lib.rs

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