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 diag,
14 help,
15 note,
16 warning,
17 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 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 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}