@@ -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,29 @@ 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
- pre_expansion_lint ( sess, lint_store, tcx. registered_tools ( ( ) ) , & krate, crate_name) ;
177
+ let lint_check_node = ( & krate, pre_configured_attrs) ;
178
+ pre_expansion_lint ( sess, lint_store, tcx. registered_tools ( ( ) ) , lint_check_node, crate_name) ;
182
179
rustc_builtin_macros:: register_builtin_macros ( resolver) ;
183
180
184
- sess. time ( "crate_injection" , || {
185
- rustc_builtin_macros:: standard_library_imports:: inject ( & mut krate, resolver, sess)
181
+ let num_standard_library_imports = sess. time ( "crate_injection" , || {
182
+ rustc_builtin_macros:: standard_library_imports:: inject (
183
+ & mut krate,
184
+ pre_configured_attrs,
185
+ resolver,
186
+ sess,
187
+ )
186
188
} ) ;
187
189
188
- util:: check_attr_crate_type ( sess, & krate . attrs , & mut resolver. lint_buffer ( ) ) ;
190
+ util:: check_attr_crate_type ( sess, pre_configured_attrs , & mut resolver. lint_buffer ( ) ) ;
189
191
190
192
// Expand all macros
191
193
krate = sess. time ( "macro_expand_crate" , || {
@@ -222,7 +224,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
222
224
223
225
// Create the config for macro expansion
224
226
let features = sess. features_untracked ( ) ;
225
- let recursion_limit = get_recursion_limit ( & krate . attrs , sess) ;
227
+ let recursion_limit = get_recursion_limit ( pre_configured_attrs , sess) ;
226
228
let cfg = rustc_expand:: expand:: ExpansionConfig {
227
229
features : Some ( features) ,
228
230
recursion_limit,
@@ -235,6 +237,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
235
237
236
238
let lint_store = LintStoreExpandImpl ( lint_store) ;
237
239
let mut ecx = ExtCtxt :: new ( sess, cfg, resolver, Some ( & lint_store) ) ;
240
+ ecx. num_standard_library_imports = num_standard_library_imports;
238
241
// Expand macros now!
239
242
let krate = sess. time ( "expand_crate" , || ecx. monotonic_expander ( ) . expand_crate ( krate) ) ;
240
243
@@ -356,7 +359,7 @@ fn early_lint_checks(tcx: TyCtxt<'_>, (): ()) {
356
359
tcx. registered_tools ( ( ) ) ,
357
360
Some ( lint_buffer) ,
358
361
rustc_lint:: BuiltinCombinedEarlyLintPass :: new ( ) ,
359
- & * * krate,
362
+ ( & * * krate, & * krate . attrs ) ,
360
363
)
361
364
}
362
365
@@ -557,9 +560,9 @@ fn resolver_for_lowering<'tcx>(
557
560
) -> & ' tcx Steal < ( ty:: ResolverAstLowering , Lrc < ast:: Crate > ) > {
558
561
let arenas = Resolver :: arenas ( ) ;
559
562
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) ;
563
+ let ( krate, pre_configured_attrs ) = tcx. crate_for_resolver ( ( ) ) . steal ( ) ;
564
+ let mut resolver = Resolver :: new ( tcx, & pre_configured_attrs , krate. spans . inner_span , & arenas) ;
565
+ let krate = configure_and_expand ( krate, & pre_configured_attrs , & mut resolver) ;
563
566
564
567
// Make sure we don't mutate the cstore from here on.
565
568
tcx. untracked ( ) . cstore . leak ( ) ;
0 commit comments