Skip to content

Commit 574da48

Browse files
committed
Use visit_item instead of flat_map_item in test_harness.rs
1 parent 0dda1e6 commit 574da48

File tree

1 file changed

+23
-31
lines changed

1 file changed

+23
-31
lines changed

compiler/rustc_builtin_macros/src/test_harness.rs

+23-31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Code that generates a test runner to run all the tests in a crate
22

3-
use std::{iter, mem};
3+
use std::ops::DerefMut;
4+
use std::mem;
45

56
use rustc_ast as ast;
67
use rustc_ast::entry::EntryPointType;
@@ -19,7 +20,7 @@ use rustc_span::hygiene::{AstPass, SyntaxContext, Transparency};
1920
use rustc_span::symbol::{Ident, Symbol, sym};
2021
use rustc_span::{DUMMY_SP, Span};
2122
use rustc_target::spec::PanicStrategy;
22-
use smallvec::{SmallVec, smallvec};
23+
use smallvec::smallvec;
2324
use thin_vec::{ThinVec, thin_vec};
2425
use tracing::debug;
2526

@@ -129,8 +130,8 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
129130
c.items.push(mk_main(&mut self.cx));
130131
}
131132

132-
fn flat_map_item(&mut self, mut i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> {
133-
let item = &mut *i;
133+
fn visit_item(&mut self, i: &mut P<ast::Item>) {
134+
let item = i.deref_mut();
134135
if let Some(name) = get_test_name(&item) {
135136
debug!("this is a test item");
136137

@@ -158,7 +159,6 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
158159
// But in those cases, we emit a lint to warn the user of these missing tests.
159160
walk_item(&mut InnerItemLinter { sess: self.cx.ext_cx.sess }, &item);
160161
}
161-
smallvec![i]
162162
}
163163
}
164164

@@ -198,40 +198,32 @@ struct EntryPointCleaner<'a> {
198198
}
199199

200200
impl<'a> MutVisitor for EntryPointCleaner<'a> {
201-
fn flat_map_item(&mut self, i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> {
201+
fn visit_item(&mut self, i: &mut P<ast::Item>) {
202202
self.depth += 1;
203-
let item = walk_flat_map_item(self, i).expect_one("noop did something");
203+
ast::mut_visit::walk_item(self, i, ());
204204
self.depth -= 1;
205205

206+
let item = i.deref_mut();
207+
206208
// Remove any #[rustc_main] or #[start] from the AST so it doesn't
207209
// clash with the one we're going to add, but mark it as
208210
// #[allow(dead_code)] to avoid printing warnings.
209-
let item = match entry_point_type(&item, self.depth == 0) {
211+
match entry_point_type(&item, self.depth == 0) {
210212
EntryPointType::MainNamed | EntryPointType::RustcMainAttr | EntryPointType::Start => {
211-
item.map(|ast::Item { id, ident, attrs, kind, vis, span, tokens }| {
212-
let allow_dead_code = attr::mk_attr_nested_word(
213-
&self.sess.psess.attr_id_generator,
214-
ast::AttrStyle::Outer,
215-
ast::Safety::Default,
216-
sym::allow,
217-
sym::dead_code,
218-
self.def_site,
219-
);
220-
let attrs = attrs
221-
.into_iter()
222-
.filter(|attr| {
223-
!attr.has_name(sym::rustc_main) && !attr.has_name(sym::start)
224-
})
225-
.chain(iter::once(allow_dead_code))
226-
.collect();
227-
228-
ast::Item { id, ident, attrs, kind, vis, span, tokens }
229-
})
213+
let allow_dead_code = attr::mk_attr_nested_word(
214+
&self.sess.psess.attr_id_generator,
215+
ast::AttrStyle::Outer,
216+
ast::Safety::Default,
217+
sym::allow,
218+
sym::dead_code,
219+
self.def_site,
220+
);
221+
item.attrs
222+
.retain(|attr| !attr.has_name(sym::rustc_main) && !attr.has_name(sym::start));
223+
item.attrs.push(allow_dead_code);
230224
}
231-
EntryPointType::None | EntryPointType::OtherMain => item,
225+
EntryPointType::None | EntryPointType::OtherMain => {}
232226
};
233-
234-
smallvec![item]
235227
}
236228
}
237229

@@ -292,7 +284,7 @@ fn generate_test_harness(
292284
/// Most of the Ident have the usual def-site hygiene for the AST pass. The
293285
/// exception is the `test_const`s. These have a syntax context that has two
294286
/// opaque marks: one from the expansion of `test` or `test_case`, and one
295-
/// generated in `TestHarnessGenerator::flat_map_item`. When resolving this
287+
/// generated in `TestHarnessGenerator::visit_item`. When resolving this
296288
/// identifier after failing to find a matching identifier in the root module
297289
/// we remove the outer mark, and try resolving at its def-site, which will
298290
/// then resolve to `test_const`.

0 commit comments

Comments
 (0)