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