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 diag,
21 help,
22 note,
23 warning,
24 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 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 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}