Skip to main content

rustc_builtin_macros/
lib.rs

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