Skip to content

Commit 6cc33b7

Browse files
committed
expand: Pass ast::Crate by reference to AST transforming passes
Also some more attributes are passed by reference.
1 parent 84dd6df commit 6cc33b7

File tree

9 files changed

+62
-79
lines changed

9 files changed

+62
-79
lines changed

Diff for: compiler/rustc_builtin_macros/src/cmdline_attrs.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_ast::{self as ast, AttrItem, AttrStyle};
66
use rustc_session::parse::ParseSess;
77
use rustc_span::FileName;
88

9-
pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -> ast::Crate {
9+
pub fn inject(krate: &mut ast::Crate, parse_sess: &ParseSess, attrs: &[String]) {
1010
for raw_attr in attrs {
1111
let mut parser = rustc_parse::new_parser_from_source_str(
1212
parse_sess,
@@ -36,6 +36,4 @@ pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -
3636
start_span.to(end_span),
3737
));
3838
}
39-
40-
krate
4139
}

Diff for: compiler/rustc_builtin_macros/src/proc_macro_harness.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ struct CollectProcMacros<'a> {
4343
}
4444

4545
pub fn inject(
46+
krate: &mut ast::Crate,
4647
sess: &Session,
4748
resolver: &mut dyn ResolverExpand,
48-
mut krate: ast::Crate,
4949
is_proc_macro_crate: bool,
5050
has_proc_macro_decls: bool,
5151
is_test_crate: bool,
5252
handler: &rustc_errors::Handler,
53-
) -> ast::Crate {
53+
) {
5454
let ecfg = ExpansionConfig::default("proc_macro".to_string());
5555
let mut cx = ExtCtxt::new(sess, ecfg, resolver, None);
5656

@@ -64,22 +64,20 @@ pub fn inject(
6464
};
6565

6666
if has_proc_macro_decls || is_proc_macro_crate {
67-
visit::walk_crate(&mut collect, &krate);
67+
visit::walk_crate(&mut collect, krate);
6868
}
6969
let macros = collect.macros;
7070

7171
if !is_proc_macro_crate {
72-
return krate;
72+
return;
7373
}
7474

7575
if is_test_crate {
76-
return krate;
76+
return;
7777
}
7878

7979
let decls = mk_decls(&mut cx, &macros);
8080
krate.items.push(decls);
81-
82-
krate
8381
}
8482

8583
impl<'a> CollectProcMacros<'a> {

Diff for: compiler/rustc_builtin_macros/src/standard_library_imports.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,12 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
88
use rustc_span::DUMMY_SP;
99
use thin_vec::thin_vec;
1010

11-
pub fn inject(
12-
mut krate: ast::Crate,
13-
resolver: &mut dyn ResolverExpand,
14-
sess: &Session,
15-
) -> ast::Crate {
11+
pub fn inject(krate: &mut ast::Crate, resolver: &mut dyn ResolverExpand, sess: &Session) {
1612
let edition = sess.parse_sess.edition;
1713

1814
// the first name in this list is the crate name of the crate with the prelude
1915
let names: &[Symbol] = if attr::contains_name(&krate.attrs, sym::no_core) {
20-
return krate;
16+
return;
2117
} else if attr::contains_name(&krate.attrs, sym::no_std) {
2218
if attr::contains_name(&krate.attrs, sym::compiler_builtins) {
2319
&[sym::core]
@@ -88,6 +84,4 @@ pub fn inject(
8884
);
8985

9086
krate.items.insert(0, use_item);
91-
92-
krate
9387
}

Diff for: compiler/rustc_builtin_macros/src/test_harness.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ struct TestCtxt<'a> {
3737

3838
/// Traverse the crate, collecting all the test functions, eliding any
3939
/// existing main functions, and synthesizing a main test harness
40-
pub fn inject(sess: &Session, resolver: &mut dyn ResolverExpand, krate: &mut ast::Crate) {
40+
pub fn inject(krate: &mut ast::Crate, sess: &Session, resolver: &mut dyn ResolverExpand) {
4141
let span_diagnostic = sess.diagnostic();
4242
let panic_strategy = sess.panic_strategy();
4343
let platform_panic_strategy = sess.target.panic_strategy;

Diff for: compiler/rustc_expand/src/config.rs

+32-39
Original file line numberDiff line numberDiff line change
@@ -192,38 +192,32 @@ fn get_features(sess: &Session, krate_attrs: &[ast::Attribute]) -> Features {
192192
}
193193

194194
/// `cfg_attr`-process the crate's attributes and compute the crate's features.
195-
pub fn features(
196-
sess: &Session,
197-
mut krate: ast::Crate,
198-
lint_node_id: NodeId,
199-
) -> (ast::Crate, Features) {
195+
pub fn features(sess: &Session, krate: &mut ast::Crate, lint_node_id: NodeId) -> Features {
200196
let mut strip_unconfigured =
201197
StripUnconfigured { sess, features: None, config_tokens: false, lint_node_id };
202198

203-
let unconfigured_attrs = krate.attrs.clone();
199+
let mut unconfigured_attrs = krate.attrs.clone();
204200
let diag = &sess.parse_sess.span_diagnostic;
205201
let err_count = diag.err_count();
206-
let features = match strip_unconfigured.configure_krate_attrs(krate.attrs) {
207-
None => {
208-
// The entire crate is unconfigured.
209-
krate.attrs = ast::AttrVec::new();
210-
krate.items = ThinVec::new();
211-
Features::default()
212-
}
213-
Some(attrs) => {
214-
krate.attrs = attrs;
215-
let features = get_features(sess, &krate.attrs);
216-
if err_count == diag.err_count() {
217-
// Avoid reconfiguring malformed `cfg_attr`s.
218-
strip_unconfigured.features = Some(&features);
219-
// Run configuration again, this time with features available
220-
// so that we can perform feature-gating.
221-
strip_unconfigured.configure_krate_attrs(unconfigured_attrs);
222-
}
223-
features
202+
203+
krate.attrs.flat_map_in_place(|attr| strip_unconfigured.process_cfg_attr(&attr));
204+
if !strip_unconfigured.in_cfg(&krate.attrs) {
205+
// The entire crate is unconfigured.
206+
krate.attrs = ast::AttrVec::new();
207+
krate.items = ThinVec::new();
208+
Features::default()
209+
} else {
210+
let features = get_features(sess, &krate.attrs);
211+
if err_count == diag.err_count() {
212+
// Avoid reconfiguring malformed `cfg_attr`s.
213+
strip_unconfigured.features = Some(&features);
214+
// Run configuration again, this time with features available
215+
// so that we can perform feature-gating.
216+
unconfigured_attrs.flat_map_in_place(|attr| strip_unconfigured.process_cfg_attr(&attr));
217+
strip_unconfigured.in_cfg(&unconfigured_attrs);
224218
}
225-
};
226-
(krate, features)
219+
features
220+
}
227221
}
228222

229223
#[macro_export]
@@ -254,11 +248,6 @@ impl<'a> StripUnconfigured<'a> {
254248
}
255249
}
256250

257-
fn configure_krate_attrs(&self, mut attrs: ast::AttrVec) -> Option<ast::AttrVec> {
258-
attrs.flat_map_in_place(|attr| self.process_cfg_attr(attr));
259-
self.in_cfg(&attrs).then_some(attrs)
260-
}
261-
262251
/// Performs cfg-expansion on `stream`, producing a new `AttrTokenStream`.
263252
/// This is only used during the invocation of `derive` proc-macros,
264253
/// which require that we cfg-expand their entire input.
@@ -281,7 +270,7 @@ impl<'a> StripUnconfigured<'a> {
281270
.iter()
282271
.flat_map(|tree| match tree.clone() {
283272
AttrTokenTree::Attributes(mut data) => {
284-
data.attrs.flat_map_in_place(|attr| self.process_cfg_attr(attr));
273+
data.attrs.flat_map_in_place(|attr| self.process_cfg_attr(&attr));
285274

286275
if self.in_cfg(&data.attrs) {
287276
data.tokens = LazyAttrTokenStream::new(
@@ -319,12 +308,16 @@ impl<'a> StripUnconfigured<'a> {
319308
/// the syntax of any `cfg_attr` is incorrect.
320309
fn process_cfg_attrs<T: HasAttrs>(&self, node: &mut T) {
321310
node.visit_attrs(|attrs| {
322-
attrs.flat_map_in_place(|attr| self.process_cfg_attr(attr));
311+
attrs.flat_map_in_place(|attr| self.process_cfg_attr(&attr));
323312
});
324313
}
325314

326-
fn process_cfg_attr(&self, attr: Attribute) -> Vec<Attribute> {
327-
if attr.has_name(sym::cfg_attr) { self.expand_cfg_attr(attr, true) } else { vec![attr] }
315+
fn process_cfg_attr(&self, attr: &Attribute) -> Vec<Attribute> {
316+
if attr.has_name(sym::cfg_attr) {
317+
self.expand_cfg_attr(attr, true)
318+
} else {
319+
vec![attr.clone()]
320+
}
328321
}
329322

330323
/// Parse and expand a single `cfg_attr` attribute into a list of attributes
@@ -334,9 +327,9 @@ impl<'a> StripUnconfigured<'a> {
334327
/// Gives a compiler warning when the `cfg_attr` contains no attributes and
335328
/// is in the original source file. Gives a compiler error if the syntax of
336329
/// the attribute is incorrect.
337-
pub(crate) fn expand_cfg_attr(&self, attr: Attribute, recursive: bool) -> Vec<Attribute> {
330+
pub(crate) fn expand_cfg_attr(&self, attr: &Attribute, recursive: bool) -> Vec<Attribute> {
338331
let Some((cfg_predicate, expanded_attrs)) =
339-
rustc_parse::parse_cfg_attr(&attr, &self.sess.parse_sess) else {
332+
rustc_parse::parse_cfg_attr(attr, &self.sess.parse_sess) else {
340333
return vec![];
341334
};
342335

@@ -365,10 +358,10 @@ impl<'a> StripUnconfigured<'a> {
365358
// `#[cfg_attr(false, cfg_attr(true, some_attr))]`.
366359
expanded_attrs
367360
.into_iter()
368-
.flat_map(|item| self.process_cfg_attr(self.expand_cfg_attr_item(&attr, item)))
361+
.flat_map(|item| self.process_cfg_attr(&self.expand_cfg_attr_item(attr, item)))
369362
.collect()
370363
} else {
371-
expanded_attrs.into_iter().map(|item| self.expand_cfg_attr_item(&attr, item)).collect()
364+
expanded_attrs.into_iter().map(|item| self.expand_cfg_attr_item(attr, item)).collect()
372365
}
373366
}
374367

Diff for: compiler/rustc_expand/src/expand.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
16881688
res
16891689
}
16901690

1691-
fn expand_cfg_attr(&self, node: &mut impl HasAttrs, attr: ast::Attribute, pos: usize) {
1691+
fn expand_cfg_attr(&self, node: &mut impl HasAttrs, attr: &ast::Attribute, pos: usize) {
16921692
node.visit_attrs(|attrs| {
16931693
// Repeated `insert` calls is inefficient, but the number of
16941694
// insertions is almost always 0 or 1 in practice.
@@ -1712,7 +1712,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
17121712
Default::default()
17131713
}
17141714
sym::cfg_attr => {
1715-
self.expand_cfg_attr(&mut node, attr, pos);
1715+
self.expand_cfg_attr(&mut node, &attr, pos);
17161716
continue;
17171717
}
17181718
_ => {
@@ -1760,7 +1760,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
17601760
continue;
17611761
}
17621762
sym::cfg_attr => {
1763-
self.expand_cfg_attr(node, attr, pos);
1763+
self.expand_cfg_attr(node, &attr, pos);
17641764
continue;
17651765
}
17661766
_ => visit_clobber(node, |node| {

Diff for: compiler/rustc_interface/src/passes.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,18 @@ pub fn register_plugins<'a>(
7676
sess: &'a Session,
7777
metadata_loader: &'a dyn MetadataLoader,
7878
register_lints: impl Fn(&Session, &mut LintStore),
79-
mut krate: ast::Crate,
79+
krate: &mut ast::Crate,
8080
crate_name: Symbol,
81-
) -> Result<(ast::Crate, LintStore)> {
82-
krate = sess.time("attributes_injection", || {
81+
) -> Result<LintStore> {
82+
sess.time("attributes_injection", || {
8383
rustc_builtin_macros::cmdline_attrs::inject(
8484
krate,
8585
&sess.parse_sess,
8686
&sess.opts.unstable_opts.crate_attr,
8787
)
8888
});
8989

90-
let (krate, features) = rustc_expand::config::features(sess, krate, CRATE_NODE_ID);
90+
let features = rustc_expand::config::features(sess, krate, CRATE_NODE_ID);
9191
// these need to be set "early" so that expansion sees `quote` if enabled.
9292
sess.init_features(features);
9393

@@ -117,16 +117,16 @@ pub fn register_plugins<'a>(
117117
let mut lint_store = rustc_lint::new_lint_store(sess.enable_internal_lints());
118118
register_lints(sess, &mut lint_store);
119119

120-
let registrars =
121-
sess.time("plugin_loading", || plugin::load::load_plugins(sess, metadata_loader, &krate));
120+
let registrars = sess
121+
.time("plugin_loading", || plugin::load::load_plugins(sess, metadata_loader, &krate.attrs));
122122
sess.time("plugin_registration", || {
123123
let mut registry = plugin::Registry { lint_store: &mut lint_store };
124124
for registrar in registrars {
125125
registrar(&mut registry);
126126
}
127127
});
128128

129-
Ok((krate, lint_store))
129+
Ok(lint_store)
130130
}
131131

132132
fn pre_expansion_lint<'a>(
@@ -181,8 +181,8 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
181181
pre_expansion_lint(sess, lint_store, tcx.registered_tools(()), &krate, crate_name);
182182
rustc_builtin_macros::register_builtin_macros(resolver);
183183

184-
krate = sess.time("crate_injection", || {
185-
rustc_builtin_macros::standard_library_imports::inject(krate, resolver, sess)
184+
sess.time("crate_injection", || {
185+
rustc_builtin_macros::standard_library_imports::inject(&mut krate, resolver, sess)
186186
});
187187

188188
util::check_attr_crate_type(sess, &krate.attrs, &mut resolver.lint_buffer());
@@ -263,7 +263,7 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
263263
});
264264

265265
sess.time("maybe_building_test_harness", || {
266-
rustc_builtin_macros::test_harness::inject(sess, resolver, &mut krate)
266+
rustc_builtin_macros::test_harness::inject(&mut krate, sess, resolver)
267267
});
268268

269269
let has_proc_macro_decls = sess.time("AST_validation", || {
@@ -287,12 +287,12 @@ fn configure_and_expand(mut krate: ast::Crate, resolver: &mut Resolver<'_, '_>)
287287
sess.emit_warning(errors::ProcMacroCratePanicAbort);
288288
}
289289

290-
krate = sess.time("maybe_create_a_macro_crate", || {
290+
sess.time("maybe_create_a_macro_crate", || {
291291
let is_test_crate = sess.opts.test;
292292
rustc_builtin_macros::proc_macro_harness::inject(
293+
&mut krate,
293294
sess,
294295
resolver,
295-
krate,
296296
is_proc_macro_crate,
297297
has_proc_macro_decls,
298298
is_test_crate,

Diff for: compiler/rustc_interface/src/queries.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,14 @@ impl<'tcx> Queries<'tcx> {
136136
pub fn register_plugins(&self) -> Result<QueryResult<'_, (ast::Crate, Lrc<LintStore>)>> {
137137
self.register_plugins.compute(|| {
138138
let crate_name = *self.crate_name()?.borrow();
139-
let krate = self.parse()?.steal();
139+
let mut krate = self.parse()?.steal();
140140

141141
let empty: &(dyn Fn(&Session, &mut LintStore) + Sync + Send) = &|_, _| {};
142-
let (krate, lint_store) = passes::register_plugins(
142+
let lint_store = passes::register_plugins(
143143
self.session(),
144144
&*self.codegen_backend().metadata_loader(),
145145
self.compiler.register_lints.as_deref().unwrap_or_else(|| empty),
146-
krate,
146+
&mut krate,
147147
crate_name,
148148
)?;
149149

Diff for: compiler/rustc_plugin_impl/src/load.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::errors::{LoadPluginError, MalformedPluginAttribute};
44
use crate::Registry;
55
use libloading::Library;
6-
use rustc_ast::Crate;
6+
use rustc_ast::Attribute;
77
use rustc_metadata::locator;
88
use rustc_session::cstore::MetadataLoader;
99
use rustc_session::Session;
@@ -20,11 +20,11 @@ type PluginRegistrarFn = fn(&mut Registry<'_>);
2020
pub fn load_plugins(
2121
sess: &Session,
2222
metadata_loader: &dyn MetadataLoader,
23-
krate: &Crate,
23+
attrs: &[Attribute],
2424
) -> Vec<PluginRegistrarFn> {
2525
let mut plugins = Vec::new();
2626

27-
for attr in &krate.attrs {
27+
for attr in attrs {
2828
if !attr.has_name(sym::plugin) {
2929
continue;
3030
}

0 commit comments

Comments
 (0)