@@ -3,7 +3,6 @@ use crate::interface::{Compiler, Result};
33use crate :: proc_macro_decls;
44use crate :: util;
55
6- use ast:: CRATE_NODE_ID ;
76use rustc_ast:: { self as ast, visit} ;
87use rustc_borrowck as mir_borrowck;
98use rustc_codegen_ssa:: traits:: CodegenBackend ;
@@ -76,22 +75,14 @@ pub fn register_plugins<'a>(
7675 sess : & ' a Session ,
7776 metadata_loader : & ' a dyn MetadataLoader ,
7877 register_lints : impl Fn ( & Session , & mut LintStore ) ,
79- krate : & mut ast:: Crate ,
78+ pre_configured_attrs : & [ ast:: Attribute ] ,
8079 crate_name : Symbol ,
8180) -> 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 ) ;
9181 // these need to be set "early" so that expansion sees `quote` if enabled.
82+ let features = rustc_expand:: config:: features ( sess, pre_configured_attrs) ;
9283 sess. init_features ( features) ;
9384
94- let crate_types = util:: collect_crate_types ( sess, & krate . attrs ) ;
85+ let crate_types = util:: collect_crate_types ( sess, pre_configured_attrs ) ;
9586 sess. init_crate_types ( crate_types) ;
9687
9788 let stable_crate_id = StableCrateId :: new (
@@ -117,8 +108,9 @@ pub fn register_plugins<'a>(
117108 let mut lint_store = rustc_lint:: new_lint_store ( sess. enable_internal_lints ( ) ) ;
118109 register_lints ( sess, & mut lint_store) ;
119110
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+ } ) ;
122114 sess. time ( "plugin_registration" , || {
123115 let mut registry = plugin:: Registry { lint_store : & mut lint_store } ;
124116 for registrar in registrars {
@@ -173,19 +165,29 @@ impl LintStoreExpand for LintStoreExpandImpl<'_> {
173165/// harness if one is to be provided, injection of a dependency on the
174166/// standard library and prelude, and name resolution.
175167#[ 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 {
177173 let tcx = resolver. tcx ( ) ;
178174 let sess = tcx. sess ;
179175 let lint_store = unerased_lint_store ( tcx) ;
180176 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) ;
182179 rustc_builtin_macros:: register_builtin_macros ( resolver) ;
183180
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+ )
186188 } ) ;
187189
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 ( ) ) ;
189191
190192 // Expand all macros
191193 krate = sess. time ( "macro_expand_crate" , || {
@@ -222,7 +224,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
222224
223225 // Create the config for macro expansion
224226 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) ;
226228 let cfg = rustc_expand:: expand:: ExpansionConfig {
227229 features : Some ( features) ,
228230 recursion_limit,
@@ -235,6 +237,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
235237
236238 let lint_store = LintStoreExpandImpl ( lint_store) ;
237239 let mut ecx = ExtCtxt :: new ( sess, cfg, resolver, Some ( & lint_store) ) ;
240+ ecx. num_standard_library_imports = num_standard_library_imports;
238241 // Expand macros now!
239242 let krate = sess. time ( "expand_crate" , || ecx. monotonic_expander ( ) . expand_crate ( krate) ) ;
240243
@@ -356,7 +359,7 @@ fn early_lint_checks(tcx: TyCtxt<'_>, (): ()) {
356359 tcx. registered_tools ( ( ) ) ,
357360 Some ( lint_buffer) ,
358361 rustc_lint:: BuiltinCombinedEarlyLintPass :: new ( ) ,
359- & * * krate,
362+ ( & * * krate, & * krate . attrs ) ,
360363 )
361364}
362365
@@ -557,9 +560,9 @@ fn resolver_for_lowering<'tcx>(
557560) -> & ' tcx Steal < ( ty:: ResolverAstLowering , Lrc < ast:: Crate > ) > {
558561 let arenas = Resolver :: arenas ( ) ;
559562 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) ;
563566
564567 // Make sure we don't mutate the cstore from here on.
565568 tcx. untracked ( ) . cstore . leak ( ) ;
0 commit comments