1#![allow(internal_features)]
6#![feature(decl_macro)]
7#![feature(default_field_values)]
8#![feature(deref_patterns)]
9#![feature(iter_order_by)]
10#![feature(proc_macro_internals)]
11#![feature(proc_macro_quote)]
12#![feature(try_blocks)]
13#![recursion_limit = "256"]
14use std::sync::Arc;
17
18use rustc_expand::base::{MacroExpanderFn, ResolverExpand, SyntaxExtensionKind};
19use rustc_expand::proc_macro::BangProcMacro;
20use rustc_span::sym;
21
22use crate::deriving::*;
23
24mod alloc_error_handler;
25mod assert;
26mod autodiff;
27mod cfg;
28mod cfg_accessible;
29mod cfg_eval;
30mod cfg_select;
31mod compile_error;
32mod concat;
33mod concat_bytes;
34mod define_opaque;
35mod derive;
36mod deriving;
37mod diagnostics;
38mod edition_panic;
39mod eii;
40mod env;
41mod format;
42mod format_foreign;
43mod gca;
44mod global_allocator;
45mod iter;
46mod log_syntax;
47mod offload;
48mod pattern_type;
49mod rustdoc_skip_body;
50mod source_util;
51mod test;
52mod test_binder_constraints;
53mod trace_macros;
54mod view_type;
55
56pub mod asm;
57pub mod cmdline_attrs;
58pub mod contracts;
59pub mod proc_macro_harness;
60pub mod standard_library_imports;
61pub mod test_harness;
62pub mod util;
63
64pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
65 let mut register = |name, kind| resolver.register_builtin_macro(name, kind);
66 macro register_bang($($name:ident: $f:expr,)*) {
67 $(register(sym::$name, SyntaxExtensionKind::AstBang(Arc::new($f as MacroExpanderFn)));)*
68 }
69 macro register_attr($($name:ident: $f:expr,)*) {
70 $(register(sym::$name, SyntaxExtensionKind::AstAttr(Arc::new($f)));)*
71 }
72 macro register_derive($($name:ident: $f:expr,)*) {
73 $(register(sym::$name, SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive($f))));)*
74 }
75
76 register(sym::asm,
SyntaxExtensionKind::AstBang(Arc::new(asm::expand_asm as
MacroExpanderFn)));
register(sym::assert,
SyntaxExtensionKind::AstBang(Arc::new(assert::expand_assert as
MacroExpanderFn)));
register(sym::cfg,
SyntaxExtensionKind::AstBang(Arc::new(cfg::expand_cfg as
MacroExpanderFn)));
register(sym::cfg_select,
SyntaxExtensionKind::AstBang(Arc::new(cfg_select::expand_cfg_select as
MacroExpanderFn)));
register(sym::column,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_column as
MacroExpanderFn)));
register(sym::compile_error,
SyntaxExtensionKind::AstBang(Arc::new(compile_error::expand_compile_error
as MacroExpanderFn)));
register(sym::concat,
SyntaxExtensionKind::AstBang(Arc::new(concat::expand_concat as
MacroExpanderFn)));
register(sym::concat_bytes,
SyntaxExtensionKind::AstBang(Arc::new(concat_bytes::expand_concat_bytes as
MacroExpanderFn)));
register(sym::const_format_args,
SyntaxExtensionKind::AstBang(Arc::new(format::expand_format_args as
MacroExpanderFn)));
register(sym::core_panic,
SyntaxExtensionKind::AstBang(Arc::new(edition_panic::expand_panic as
MacroExpanderFn)));
register(sym::env,
SyntaxExtensionKind::AstBang(Arc::new(env::expand_env as
MacroExpanderFn)));
register(sym::file,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_file as
MacroExpanderFn)));
register(sym::format_args,
SyntaxExtensionKind::AstBang(Arc::new(format::expand_format_args as
MacroExpanderFn)));
register(sym::format_args_nl,
SyntaxExtensionKind::AstBang(Arc::new(format::expand_format_args_nl as
MacroExpanderFn)));
register(sym::gca,
SyntaxExtensionKind::AstBang(Arc::new(gca::expand as MacroExpanderFn)));
register(sym::global_asm,
SyntaxExtensionKind::AstBang(Arc::new(asm::expand_global_asm as
MacroExpanderFn)));
register(sym::include,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_include as
MacroExpanderFn)));
register(sym::include_bytes,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_include_bytes as
MacroExpanderFn)));
register(sym::include_str,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_include_str as
MacroExpanderFn)));
register(sym::iter,
SyntaxExtensionKind::AstBang(Arc::new(iter::expand as MacroExpanderFn)));
register(sym::line,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_line as
MacroExpanderFn)));
register(sym::log_syntax,
SyntaxExtensionKind::AstBang(Arc::new(log_syntax::expand_log_syntax as
MacroExpanderFn)));
register(sym::module_path,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_mod as
MacroExpanderFn)));
register(sym::naked_asm,
SyntaxExtensionKind::AstBang(Arc::new(asm::expand_naked_asm as
MacroExpanderFn)));
register(sym::option_env,
SyntaxExtensionKind::AstBang(Arc::new(env::expand_option_env as
MacroExpanderFn)));
register(sym::pattern_type,
SyntaxExtensionKind::AstBang(Arc::new(pattern_type::expand as
MacroExpanderFn)));
register(sym::std_panic,
SyntaxExtensionKind::AstBang(Arc::new(edition_panic::expand_panic as
MacroExpanderFn)));
register(sym::stringify,
SyntaxExtensionKind::AstBang(Arc::new(source_util::expand_stringify as
MacroExpanderFn)));
register(sym::test_binder_constraints,
SyntaxExtensionKind::AstBang(Arc::new(test_binder_constraints::expand as
MacroExpanderFn)));
register(sym::trace_macros,
SyntaxExtensionKind::AstBang(Arc::new(trace_macros::expand_trace_macros as
MacroExpanderFn)));
register(sym::unreachable,
SyntaxExtensionKind::AstBang(Arc::new(edition_panic::expand_unreachable as
MacroExpanderFn)));
register(sym::view_type,
SyntaxExtensionKind::AstBang(Arc::new(view_type::expand as
MacroExpanderFn)));register_bang! {
77 asm: asm::expand_asm,
79 assert: assert::expand_assert,
80 cfg: cfg::expand_cfg,
81 cfg_select: cfg_select::expand_cfg_select,
82 column: source_util::expand_column,
83 compile_error: compile_error::expand_compile_error,
84 concat: concat::expand_concat,
85 concat_bytes: concat_bytes::expand_concat_bytes,
86 const_format_args: format::expand_format_args,
87 core_panic: edition_panic::expand_panic,
88 env: env::expand_env,
89 file: source_util::expand_file,
90 format_args: format::expand_format_args,
91 format_args_nl: format::expand_format_args_nl,
92 gca: gca::expand,
93 global_asm: asm::expand_global_asm,
94 include: source_util::expand_include,
95 include_bytes: source_util::expand_include_bytes,
96 include_str: source_util::expand_include_str,
97 iter: iter::expand,
98 line: source_util::expand_line,
99 log_syntax: log_syntax::expand_log_syntax,
100 module_path: source_util::expand_mod,
101 naked_asm: asm::expand_naked_asm,
102 option_env: env::expand_option_env,
103 pattern_type: pattern_type::expand,
104 std_panic: edition_panic::expand_panic,
105 stringify: source_util::expand_stringify,
106 test_binder_constraints: test_binder_constraints::expand,
107 trace_macros: trace_macros::expand_trace_macros,
108 unreachable: edition_panic::expand_unreachable,
109 view_type: view_type::expand,
110 }
112
113 register(sym::alloc_error_handler,
SyntaxExtensionKind::AstAttr(Arc::new(alloc_error_handler::expand)));
register(sym::autodiff_forward,
SyntaxExtensionKind::AstAttr(Arc::new(autodiff::expand_forward)));
register(sym::autodiff_reverse,
SyntaxExtensionKind::AstAttr(Arc::new(autodiff::expand_reverse)));
register(sym::bench,
SyntaxExtensionKind::AstAttr(Arc::new(test::expand_bench)));
register(sym::cfg_accessible,
SyntaxExtensionKind::AstAttr(Arc::new(cfg_accessible::Expander)));
register(sym::cfg_eval,
SyntaxExtensionKind::AstAttr(Arc::new(cfg_eval::expand)));
register(sym::define_opaque,
SyntaxExtensionKind::AstAttr(Arc::new(define_opaque::expand)));
register(sym::derive,
SyntaxExtensionKind::AstAttr(Arc::new(derive::Expander {
is_const: false,
})));
register(sym::derive_const,
SyntaxExtensionKind::AstAttr(Arc::new(derive::Expander {
is_const: true,
})));
register(sym::eii, SyntaxExtensionKind::AstAttr(Arc::new(eii::eii)));
register(sym::eii_declaration,
SyntaxExtensionKind::AstAttr(Arc::new(eii::eii_declaration)));
register(sym::eii_shared_macro,
SyntaxExtensionKind::AstAttr(Arc::new(eii::eii_shared_macro)));
register(sym::global_allocator,
SyntaxExtensionKind::AstAttr(Arc::new(global_allocator::expand)));
register(sym::offload_kernel,
SyntaxExtensionKind::AstAttr(Arc::new(offload::expand_kernel)));
register(sym::rustdoc_skip_body,
SyntaxExtensionKind::AstAttr(Arc::new(rustdoc_skip_body::expand)));
register(sym::test,
SyntaxExtensionKind::AstAttr(Arc::new(test::expand_test)));
register(sym::test_case,
SyntaxExtensionKind::AstAttr(Arc::new(test::expand_test_case)));
register(sym::unsafe_eii,
SyntaxExtensionKind::AstAttr(Arc::new(eii::unsafe_eii)));register_attr! {
114 alloc_error_handler: alloc_error_handler::expand,
116 autodiff_forward: autodiff::expand_forward,
117 autodiff_reverse: autodiff::expand_reverse,
118 bench: test::expand_bench,
119 cfg_accessible: cfg_accessible::Expander,
120 cfg_eval: cfg_eval::expand,
121 define_opaque: define_opaque::expand,
122 derive: derive::Expander { is_const: false },
123 derive_const: derive::Expander { is_const: true },
124 eii: eii::eii,
125 eii_declaration: eii::eii_declaration,
126 eii_shared_macro: eii::eii_shared_macro,
127 global_allocator: global_allocator::expand,
128 offload_kernel: offload::expand_kernel,
129 rustdoc_skip_body: rustdoc_skip_body::expand,
130 test: test::expand_test,
131 test_case: test::expand_test_case,
132 unsafe_eii: eii::unsafe_eii,
133 }
135
136 register(sym::Clone,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(clone::expand_deriving_clone))));
register(sym::CoerceShared,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(reborrow::expand_deriving_coerce_shared))));
register(sym::Copy,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(copy::expand_deriving_copy))));
register(sym::ConstParamTy,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(const_param_ty::expand_deriving_const_param_ty))));
register(sym::Debug,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(debug::expand_deriving_debug))));
register(sym::Default,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(default::expand_deriving_default))));
register(sym::Eq,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(eq::expand_deriving_eq))));
register(sym::Hash,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(hash::expand_deriving_hash))));
register(sym::Ord,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(ord::expand_deriving_ord))));
register(sym::PartialEq,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(partial_eq::expand_deriving_partial_eq))));
register(sym::PartialOrd,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(partial_ord::expand_deriving_partial_ord))));
register(sym::CoercePointee,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(coerce_pointee::expand_deriving_coerce_pointee))));
register(sym::Reborrow,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(reborrow::expand_deriving_reborrow))));
register(sym::From,
SyntaxExtensionKind::AstDerive(Arc::new(BuiltinDerive(from::expand_deriving_from))));register_derive! {
137 Clone: clone::expand_deriving_clone,
138 CoerceShared: reborrow::expand_deriving_coerce_shared,
139 Copy: copy::expand_deriving_copy,
140 ConstParamTy: const_param_ty::expand_deriving_const_param_ty,
141 Debug: debug::expand_deriving_debug,
142 Default: default::expand_deriving_default,
143 Eq: eq::expand_deriving_eq,
144 Hash: hash::expand_deriving_hash,
145 Ord: ord::expand_deriving_ord,
146 PartialEq: partial_eq::expand_deriving_partial_eq,
147 PartialOrd: partial_ord::expand_deriving_partial_ord,
148 CoercePointee: coerce_pointee::expand_deriving_coerce_pointee,
149 Reborrow: reborrow::expand_deriving_reborrow,
150 From: from::expand_deriving_from,
151 }
152
153 let client = rustc_proc_macro::bridge::client::Client::expand1(rustc_proc_macro::quote);
154 register(sym::quote, SyntaxExtensionKind::Bang(Arc::new(BangProcMacro { client })));
155 let requires = SyntaxExtensionKind::Attr(Arc::new(contracts::ExpandRequires));
156 register(sym::contracts_requires, requires);
157 let ensures = SyntaxExtensionKind::Attr(Arc::new(contracts::ExpandEnsures));
158 register(sym::contracts_ensures, ensures);
159}