]> git.lizzy.rs Git - rust.git/blob - src/libsyntax_ext/lib.rs
libpanic_abort => 2018
[rust.git] / src / libsyntax_ext / lib.rs
1 //! Syntax extensions in the Rust compiler.
2
3 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
4        html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
5        html_root_url = "https://doc.rust-lang.org/nightly/")]
6
7 #![feature(in_band_lifetimes)]
8 #![feature(proc_macro_diagnostic)]
9 #![feature(proc_macro_internals)]
10 #![feature(proc_macro_span)]
11 #![feature(decl_macro)]
12 #![feature(nll)]
13 #![feature(str_escape)]
14 #![feature(rustc_diagnostic_macros)]
15
16 #![recursion_limit="256"]
17
18 extern crate fmt_macros;
19 #[macro_use]
20 extern crate syntax;
21 extern crate syntax_pos;
22 extern crate proc_macro;
23 extern crate rustc_data_structures;
24 extern crate rustc_errors as errors;
25 extern crate rustc_target;
26 #[macro_use]
27 extern crate smallvec;
28 #[macro_use]
29 extern crate log;
30
31 mod diagnostics;
32
33 mod asm;
34 mod assert;
35 mod cfg;
36 mod compile_error;
37 mod concat;
38 mod concat_idents;
39 mod env;
40 mod format;
41 mod format_foreign;
42 mod global_asm;
43 mod log_syntax;
44 mod proc_macro_server;
45 mod test;
46 mod test_case;
47 mod trace_macros;
48
49 pub mod deriving;
50 pub mod proc_macro_decls;
51 pub mod proc_macro_impl;
52
53 use rustc_data_structures::sync::Lrc;
54 use syntax::ast;
55 use syntax::ext::base::{MacroExpanderFn, NormalTT, NamedSyntaxExtension, MultiModifier};
56 use syntax::ext::hygiene;
57 use syntax::symbol::Symbol;
58
59 pub fn register_builtins(resolver: &mut dyn syntax::ext::base::Resolver,
60                          user_exts: Vec<NamedSyntaxExtension>) {
61     deriving::register_builtin_derives(resolver);
62
63     let mut register = |name, ext| {
64         resolver.add_builtin(ast::Ident::with_empty_ctxt(name), Lrc::new(ext));
65     };
66
67     macro_rules! register {
68         ($( $name:ident: $f:expr, )*) => { $(
69             register(Symbol::intern(stringify!($name)),
70                      NormalTT {
71                         expander: Box::new($f as MacroExpanderFn),
72                         def_info: None,
73                         allow_internal_unstable: false,
74                         allow_internal_unsafe: false,
75                         local_inner_macros: false,
76                         unstable_feature: None,
77                         edition: hygiene::default_edition(),
78                     });
79         )* }
80     }
81
82     use syntax::ext::source_util::*;
83     register! {
84         line: expand_line,
85         __rust_unstable_column: expand_column_gated,
86         column: expand_column,
87         file: expand_file,
88         stringify: expand_stringify,
89         include: expand_include,
90         include_str: expand_include_str,
91         include_bytes: expand_include_bytes,
92         module_path: expand_mod,
93
94         asm: asm::expand_asm,
95         global_asm: global_asm::expand_global_asm,
96         cfg: cfg::expand_cfg,
97         concat: concat::expand_syntax_ext,
98         concat_idents: concat_idents::expand_syntax_ext,
99         env: env::expand_env,
100         option_env: env::expand_option_env,
101         log_syntax: log_syntax::expand_syntax_ext,
102         trace_macros: trace_macros::expand_trace_macros,
103         compile_error: compile_error::expand_compile_error,
104         assert: assert::expand_assert,
105     }
106
107     register(Symbol::intern("test_case"), MultiModifier(Box::new(test_case::expand)));
108     register(Symbol::intern("test"), MultiModifier(Box::new(test::expand_test)));
109     register(Symbol::intern("bench"), MultiModifier(Box::new(test::expand_bench)));
110
111     // format_args uses `unstable` things internally.
112     register(Symbol::intern("format_args"),
113              NormalTT {
114                 expander: Box::new(format::expand_format_args),
115                 def_info: None,
116                 allow_internal_unstable: true,
117                 allow_internal_unsafe: false,
118                 local_inner_macros: false,
119                 unstable_feature: None,
120                 edition: hygiene::default_edition(),
121             });
122     register(Symbol::intern("format_args_nl"),
123              NormalTT {
124                  expander: Box::new(format::expand_format_args_nl),
125                  def_info: None,
126                  allow_internal_unstable: true,
127                  allow_internal_unsafe: false,
128                  local_inner_macros: false,
129                  unstable_feature: None,
130                  edition: hygiene::default_edition(),
131              });
132
133     for (name, ext) in user_exts {
134         register(name, ext);
135     }
136 }