@@ -3,7 +3,6 @@ use crate::interface::{Compiler, Result};
3
3
use crate :: proc_macro_decls;
4
4
use crate :: util;
5
5
6
- use ast:: CRATE_NODE_ID ;
7
6
use rustc_ast:: { self as ast, visit} ;
8
7
use rustc_borrowck as mir_borrowck;
9
8
use rustc_codegen_ssa:: traits:: CodegenBackend ;
@@ -76,22 +75,14 @@ pub fn register_plugins<'a>(
76
75
sess : & ' a Session ,
77
76
metadata_loader : & ' a dyn MetadataLoader ,
78
77
register_lints : impl Fn ( & Session , & mut LintStore ) ,
79
- krate : & mut ast:: Crate ,
78
+ pre_configured_attrs : & [ ast:: Attribute ] ,
80
79
crate_name : Symbol ,
81
80
) -> Result < LintStore > {
82
- sess. time ( "attributes_injection" , || {
83
- rustc_builtin_macros:: cmdline_attrs:: inject (
84
- krate,
85
- & sess. parse_sess ,
86
- & sess. opts . unstable_opts . crate_attr ,
87
- )
88
- } ) ;
89
-
90
- let features = rustc_expand:: config:: features ( sess, krate, CRATE_NODE_ID ) ;
91
81
// these need to be set "early" so that expansion sees `quote` if enabled.
82
+ let features = rustc_expand:: config:: features ( sess, pre_configured_attrs) ;
92
83
sess. init_features ( features) ;
93
84
94
- let crate_types = util:: collect_crate_types ( sess, & krate . attrs ) ;
85
+ let crate_types = util:: collect_crate_types ( sess, pre_configured_attrs ) ;
95
86
sess. init_crate_types ( crate_types) ;
96
87
97
88
let stable_crate_id = StableCrateId :: new (
@@ -117,8 +108,9 @@ pub fn register_plugins<'a>(
117
108
let mut lint_store = rustc_lint:: new_lint_store ( sess. enable_internal_lints ( ) ) ;
118
109
register_lints ( sess, & mut lint_store) ;
119
110
120
- let registrars = sess
121
- . time ( "plugin_loading" , || plugin:: load:: load_plugins ( sess, metadata_loader, & krate. attrs ) ) ;
111
+ let registrars = sess. time ( "plugin_loading" , || {
112
+ plugin:: load:: load_plugins ( sess, metadata_loader, pre_configured_attrs)
113
+ } ) ;
122
114
sess. time ( "plugin_registration" , || {
123
115
let mut registry = plugin:: Registry { lint_store : & mut lint_store } ;
124
116
for registrar in registrars {
@@ -173,19 +165,28 @@ impl LintStoreExpand for LintStoreExpandImpl<'_> {
173
165
/// harness if one is to be provided, injection of a dependency on the
174
166
/// standard library and prelude, and name resolution.
175
167
#[ instrument( level = "trace" , skip( krate, resolver) ) ]
176
- fn configure_and_expand ( mut krate : ast:: Crate , resolver : & mut Resolver < ' _ , ' _ > ) -> ast:: Crate {
168
+ fn configure_and_expand (
169
+ mut krate : ast:: Crate ,
170
+ pre_configured_attrs : & [ ast:: Attribute ] ,
171
+ resolver : & mut Resolver < ' _ , ' _ > ,
172
+ ) -> ast:: Crate {
177
173
let tcx = resolver. tcx ( ) ;
178
174
let sess = tcx. sess ;
179
175
let lint_store = unerased_lint_store ( tcx) ;
180
176
let crate_name = tcx. crate_name ( LOCAL_CRATE ) ;
181
177
pre_expansion_lint ( sess, lint_store, tcx. registered_tools ( ( ) ) , & krate, crate_name) ;
182
178
rustc_builtin_macros:: register_builtin_macros ( resolver) ;
183
179
184
- sess. time ( "crate_injection" , || {
185
- rustc_builtin_macros:: standard_library_imports:: inject ( & mut krate, resolver, sess)
180
+ let num_standard_library_imports = sess. time ( "crate_injection" , || {
181
+ rustc_builtin_macros:: standard_library_imports:: inject (
182
+ & mut krate,
183
+ pre_configured_attrs,
184
+ resolver,
185
+ sess,
186
+ )
186
187
} ) ;
187
188
188
- util:: check_attr_crate_type ( sess, & krate . attrs , & mut resolver. lint_buffer ( ) ) ;
189
+ util:: check_attr_crate_type ( sess, pre_configured_attrs , & mut resolver. lint_buffer ( ) ) ;
189
190
190
191
// Expand all macros
191
192
krate = sess. time ( "macro_expand_crate" , || {
@@ -222,7 +223,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
222
223
223
224
// Create the config for macro expansion
224
225
let features = sess. features_untracked ( ) ;
225
- let recursion_limit = get_recursion_limit ( & krate . attrs , sess) ;
226
+ let recursion_limit = get_recursion_limit ( pre_configured_attrs , sess) ;
226
227
let cfg = rustc_expand:: expand:: ExpansionConfig {
227
228
features : Some ( features) ,
228
229
recursion_limit,
@@ -235,6 +236,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
235
236
236
237
let lint_store = LintStoreExpandImpl ( lint_store) ;
237
238
let mut ecx = ExtCtxt :: new ( sess, cfg, resolver, Some ( & lint_store) ) ;
239
+ ecx. num_standard_library_imports = num_standard_library_imports;
238
240
// Expand macros now!
239
241
let krate = sess. time ( "expand_crate" , || ecx. monotonic_expander ( ) . expand_crate ( krate) ) ;
240
242
@@ -557,9 +559,9 @@ fn resolver_for_lowering<'tcx>(
557
559
) -> & ' tcx Steal < ( ty:: ResolverAstLowering , Lrc < ast:: Crate > ) > {
558
560
let arenas = Resolver :: arenas ( ) ;
559
561
let _ = tcx. registered_tools ( ( ) ) ; // Uses `crate_for_resolver`.
560
- let krate = tcx. crate_for_resolver ( ( ) ) . steal ( ) ;
561
- let mut resolver = Resolver :: new ( tcx, & krate, & arenas) ;
562
- let krate = configure_and_expand ( krate, & mut resolver) ;
562
+ let ( krate, pre_configured_attrs ) = tcx. crate_for_resolver ( ( ) ) . steal ( ) ;
563
+ let mut resolver = Resolver :: new ( tcx, & pre_configured_attrs , krate. spans . inner_span , & arenas) ;
564
+ let krate = configure_and_expand ( krate, & pre_configured_attrs , & mut resolver) ;
563
565
564
566
// Make sure we don't mutate the cstore from here on.
565
567
tcx. untracked ( ) . cstore . leak ( ) ;
0 commit comments