Rollup merge of #133153 - maxcabrajac:flat_maps, r=petrochenkov

Add visits to nodes that already have flat_maps in ast::MutVisitor

This PR aims to add `visit_` methods for every node that has a `flat_map_` in MutVisitor, giving implementers free choice over overriding `flat_map` for 1-to-n conversions or `visit` for a 1-to-1.

There is one major problem: `flat_map_stmt`.
While all other default implementations of `flat_map`s are 1-to-1 conversion, as they either only call visits or a internal 1-to-many conversions are natural, `flat_map_stmt` doesn't follow this pattern.

`flat_map_stmt`'s default implementation is a 1-to-n conversion that panics if n > 1 (effectively being a 1-to-[0;1]). This means that it cannot be used as is for a default `visit_stmt`, which would be required to be a 1-to-1.

Implementing `visit_stmt` without runtime checks would require it to reach over a potential `flat_map_item` or `filter_map_expr` overrides and call for their `visit` counterparts directly.
Other than that, if we want to keep the behavior of `flat_map_stmt` it cannot call `visit_stmt` internally.

To me, it seems reasonable to make all default implementations 1-to-1 conversions and let implementers handle `visit_stmt` if they need it, but I don't know if calling `visit` directly when a 1-to-1 is required is ok or not.

related to #128974 & #127615

r? ``@petrochenkov``
This commit is contained in:
Matthias Krüger 2024-11-21 07:56:12 +01:00 committed by GitHub
commit 9d70af54e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 178 additions and 89 deletions

View File

@ -104,8 +104,16 @@ pub trait MutVisitor: Sized {
walk_use_tree(self, use_tree); walk_use_tree(self, use_tree);
} }
fn visit_foreign_item(&mut self, ni: &mut P<ForeignItem>) {
walk_item(self, ni);
}
fn flat_map_foreign_item(&mut self, ni: P<ForeignItem>) -> SmallVec<[P<ForeignItem>; 1]> { fn flat_map_foreign_item(&mut self, ni: P<ForeignItem>) -> SmallVec<[P<ForeignItem>; 1]> {
walk_flat_map_item(self, ni) walk_flat_map_foreign_item(self, ni)
}
fn visit_item(&mut self, i: &mut P<Item>) {
walk_item(self, i);
} }
fn flat_map_item(&mut self, i: P<Item>) -> SmallVec<[P<Item>; 1]> { fn flat_map_item(&mut self, i: P<Item>) -> SmallVec<[P<Item>; 1]> {
@ -116,10 +124,18 @@ pub trait MutVisitor: Sized {
walk_fn_header(self, header); walk_fn_header(self, header);
} }
fn visit_field_def(&mut self, fd: &mut FieldDef) {
walk_field_def(self, fd);
}
fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]> { fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]> {
walk_flat_map_field_def(self, fd) walk_flat_map_field_def(self, fd)
} }
fn visit_assoc_item(&mut self, i: &mut P<AssocItem>, ctxt: AssocCtxt) {
walk_assoc_item(self, i, ctxt)
}
fn flat_map_assoc_item( fn flat_map_assoc_item(
&mut self, &mut self,
i: P<AssocItem>, i: P<AssocItem>,
@ -153,6 +169,10 @@ pub trait MutVisitor: Sized {
walk_flat_map_stmt(self, s) walk_flat_map_stmt(self, s)
} }
fn visit_arm(&mut self, arm: &mut Arm) {
walk_arm(self, arm);
}
fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> { fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> {
walk_flat_map_arm(self, arm) walk_flat_map_arm(self, arm)
} }
@ -199,6 +219,10 @@ pub trait MutVisitor: Sized {
walk_foreign_mod(self, nm); walk_foreign_mod(self, nm);
} }
fn visit_variant(&mut self, v: &mut Variant) {
walk_variant(self, v);
}
fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> { fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
walk_flat_map_variant(self, v) walk_flat_map_variant(self, v)
} }
@ -251,6 +275,10 @@ pub trait MutVisitor: Sized {
walk_attribute(self, at); walk_attribute(self, at);
} }
fn visit_param(&mut self, param: &mut Param) {
walk_param(self, param);
}
fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]> { fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]> {
walk_flat_map_param(self, param) walk_flat_map_param(self, param)
} }
@ -271,6 +299,10 @@ pub trait MutVisitor: Sized {
walk_variant_data(self, vdata); walk_variant_data(self, vdata);
} }
fn visit_generic_param(&mut self, param: &mut GenericParam) {
walk_generic_param(self, param)
}
fn flat_map_generic_param(&mut self, param: GenericParam) -> SmallVec<[GenericParam; 1]> { fn flat_map_generic_param(&mut self, param: GenericParam) -> SmallVec<[GenericParam; 1]> {
walk_flat_map_generic_param(self, param) walk_flat_map_generic_param(self, param)
} }
@ -287,6 +319,10 @@ pub trait MutVisitor: Sized {
walk_mt(self, mt); walk_mt(self, mt);
} }
fn visit_expr_field(&mut self, f: &mut ExprField) {
walk_expr_field(self, f);
}
fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]> { fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]> {
walk_flat_map_expr_field(self, f) walk_flat_map_expr_field(self, f)
} }
@ -311,6 +347,10 @@ pub trait MutVisitor: Sized {
// Do nothing. // Do nothing.
} }
fn visit_pat_field(&mut self, fp: &mut PatField) {
walk_pat_field(self, fp)
}
fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]> { fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]> {
walk_flat_map_pat_field(self, fp) walk_flat_map_pat_field(self, fp)
} }
@ -429,16 +469,20 @@ pub fn visit_delim_span<T: MutVisitor>(vis: &mut T, DelimSpan { open, close }: &
vis.visit_span(close); vis.visit_span(close);
} }
pub fn walk_flat_map_pat_field<T: MutVisitor>( pub fn walk_pat_field<T: MutVisitor>(vis: &mut T, fp: &mut PatField) {
vis: &mut T, let PatField { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = fp;
mut fp: PatField,
) -> SmallVec<[PatField; 1]> {
let PatField { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = &mut fp;
vis.visit_id(id); vis.visit_id(id);
visit_attrs(vis, attrs); visit_attrs(vis, attrs);
vis.visit_ident(ident); vis.visit_ident(ident);
vis.visit_pat(pat); vis.visit_pat(pat);
vis.visit_span(span); vis.visit_span(span);
}
pub fn walk_flat_map_pat_field<T: MutVisitor>(
vis: &mut T,
mut fp: PatField,
) -> SmallVec<[PatField; 1]> {
vis.visit_pat_field(&mut fp);
smallvec![fp] smallvec![fp]
} }
@ -459,14 +503,18 @@ fn walk_use_tree<T: MutVisitor>(vis: &mut T, use_tree: &mut UseTree) {
vis.visit_span(span); vis.visit_span(span);
} }
pub fn walk_flat_map_arm<T: MutVisitor>(vis: &mut T, mut arm: Arm) -> SmallVec<[Arm; 1]> { pub fn walk_arm<T: MutVisitor>(vis: &mut T, arm: &mut Arm) {
let Arm { attrs, pat, guard, body, span, id, is_placeholder: _ } = &mut arm; let Arm { attrs, pat, guard, body, span, id, is_placeholder: _ } = arm;
vis.visit_id(id); vis.visit_id(id);
visit_attrs(vis, attrs); visit_attrs(vis, attrs);
vis.visit_pat(pat); vis.visit_pat(pat);
visit_opt(guard, |guard| vis.visit_expr(guard)); visit_opt(guard, |guard| vis.visit_expr(guard));
visit_opt(body, |body| vis.visit_expr(body)); visit_opt(body, |body| vis.visit_expr(body));
vis.visit_span(span); vis.visit_span(span);
}
pub fn walk_flat_map_arm<T: MutVisitor>(vis: &mut T, mut arm: Arm) -> SmallVec<[Arm; 1]> {
vis.visit_arm(&mut arm);
smallvec![arm] smallvec![arm]
} }
@ -543,11 +591,8 @@ fn walk_foreign_mod<T: MutVisitor>(vis: &mut T, foreign_mod: &mut ForeignMod) {
items.flat_map_in_place(|item| vis.flat_map_foreign_item(item)); items.flat_map_in_place(|item| vis.flat_map_foreign_item(item));
} }
pub fn walk_flat_map_variant<T: MutVisitor>( pub fn walk_variant<T: MutVisitor>(visitor: &mut T, variant: &mut Variant) {
visitor: &mut T, let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = variant;
mut variant: Variant,
) -> SmallVec<[Variant; 1]> {
let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = &mut variant;
visitor.visit_id(id); visitor.visit_id(id);
visit_attrs(visitor, attrs); visit_attrs(visitor, attrs);
visitor.visit_vis(vis); visitor.visit_vis(vis);
@ -555,6 +600,13 @@ pub fn walk_flat_map_variant<T: MutVisitor>(
visitor.visit_variant_data(data); visitor.visit_variant_data(data);
visit_opt(disr_expr, |disr_expr| visitor.visit_anon_const(disr_expr)); visit_opt(disr_expr, |disr_expr| visitor.visit_anon_const(disr_expr));
visitor.visit_span(span); visitor.visit_span(span);
}
pub fn walk_flat_map_variant<T: MutVisitor>(
vis: &mut T,
mut variant: Variant,
) -> SmallVec<[Variant; 1]> {
vis.visit_variant(&mut variant);
smallvec![variant] smallvec![variant]
} }
@ -685,13 +737,17 @@ fn walk_meta_item<T: MutVisitor>(vis: &mut T, mi: &mut MetaItem) {
vis.visit_span(span); vis.visit_span(span);
} }
pub fn walk_flat_map_param<T: MutVisitor>(vis: &mut T, mut param: Param) -> SmallVec<[Param; 1]> { pub fn walk_param<T: MutVisitor>(vis: &mut T, param: &mut Param) {
let Param { attrs, id, pat, span, ty, is_placeholder: _ } = &mut param; let Param { attrs, id, pat, span, ty, is_placeholder: _ } = param;
vis.visit_id(id); vis.visit_id(id);
visit_attrs(vis, attrs); visit_attrs(vis, attrs);
vis.visit_pat(pat); vis.visit_pat(pat);
vis.visit_ty(ty); vis.visit_ty(ty);
vis.visit_span(span); vis.visit_span(span);
}
pub fn walk_flat_map_param<T: MutVisitor>(vis: &mut T, mut param: Param) -> SmallVec<[Param; 1]> {
vis.visit_param(&mut param);
smallvec![param] smallvec![param]
} }
@ -950,11 +1006,8 @@ fn walk_precise_capturing_arg<T: MutVisitor>(vis: &mut T, arg: &mut PreciseCaptu
} }
} }
pub fn walk_flat_map_generic_param<T: MutVisitor>( pub fn walk_generic_param<T: MutVisitor>(vis: &mut T, param: &mut GenericParam) {
vis: &mut T, let GenericParam { id, ident, attrs, bounds, kind, colon_span, is_placeholder: _ } = param;
mut param: GenericParam,
) -> SmallVec<[GenericParam; 1]> {
let GenericParam { id, ident, attrs, bounds, kind, colon_span, is_placeholder: _ } = &mut param;
vis.visit_id(id); vis.visit_id(id);
visit_attrs(vis, attrs); visit_attrs(vis, attrs);
vis.visit_ident(ident); vis.visit_ident(ident);
@ -972,6 +1025,13 @@ pub fn walk_flat_map_generic_param<T: MutVisitor>(
if let Some(colon_span) = colon_span { if let Some(colon_span) = colon_span {
vis.visit_span(colon_span); vis.visit_span(colon_span);
} }
}
pub fn walk_flat_map_generic_param<T: MutVisitor>(
vis: &mut T,
mut param: GenericParam,
) -> SmallVec<[GenericParam; 1]> {
vis.visit_generic_param(&mut param);
smallvec![param] smallvec![param]
} }
@ -1054,30 +1114,38 @@ fn walk_poly_trait_ref<T: MutVisitor>(vis: &mut T, p: &mut PolyTraitRef) {
vis.visit_span(span); vis.visit_span(span);
} }
pub fn walk_flat_map_field_def<T: MutVisitor>( pub fn walk_field_def<T: MutVisitor>(visitor: &mut T, fd: &mut FieldDef) {
visitor: &mut T, let FieldDef { span, ident, vis, id, ty, attrs, is_placeholder: _ } = fd;
mut fd: FieldDef,
) -> SmallVec<[FieldDef; 1]> {
let FieldDef { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut fd;
visitor.visit_id(id); visitor.visit_id(id);
visit_attrs(visitor, attrs); visit_attrs(visitor, attrs);
visitor.visit_vis(vis); visitor.visit_vis(vis);
visit_opt(ident, |ident| visitor.visit_ident(ident)); visit_opt(ident, |ident| visitor.visit_ident(ident));
visitor.visit_ty(ty); visitor.visit_ty(ty);
visitor.visit_span(span); visitor.visit_span(span);
}
pub fn walk_flat_map_field_def<T: MutVisitor>(
vis: &mut T,
mut fd: FieldDef,
) -> SmallVec<[FieldDef; 1]> {
vis.visit_field_def(&mut fd);
smallvec![fd] smallvec![fd]
} }
pub fn walk_expr_field<T: MutVisitor>(vis: &mut T, f: &mut ExprField) {
let ExprField { ident, expr, span, is_shorthand: _, attrs, id, is_placeholder: _ } = f;
vis.visit_id(id);
visit_attrs(vis, attrs);
vis.visit_ident(ident);
vis.visit_expr(expr);
vis.visit_span(span);
}
pub fn walk_flat_map_expr_field<T: MutVisitor>( pub fn walk_flat_map_expr_field<T: MutVisitor>(
vis: &mut T, vis: &mut T,
mut f: ExprField, mut f: ExprField,
) -> SmallVec<[ExprField; 1]> { ) -> SmallVec<[ExprField; 1]> {
let ExprField { ident, expr, span, is_shorthand: _, attrs, id, is_placeholder: _ } = &mut f; vis.visit_expr_field(&mut f);
vis.visit_id(id);
visit_attrs(vis, attrs);
vis.visit_ident(ident);
vis.visit_expr(expr);
vis.visit_span(span);
smallvec![f] smallvec![f]
} }
@ -1331,18 +1399,19 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
vis.visit_span(inject_use_span); vis.visit_span(inject_use_span);
} }
pub fn walk_flat_map_item<K: WalkItemKind<Ctxt = ()>>( pub fn walk_item(visitor: &mut impl MutVisitor, item: &mut P<Item<impl WalkItemKind<Ctxt = ()>>>) {
visitor: &mut impl MutVisitor, walk_item_ctxt(visitor, item, ())
item: P<Item<K>>,
) -> SmallVec<[P<Item<K>>; 1]> {
walk_flat_map_assoc_item(visitor, item, ())
} }
pub fn walk_flat_map_assoc_item<K: WalkItemKind>( pub fn walk_assoc_item(visitor: &mut impl MutVisitor, item: &mut P<AssocItem>, ctxt: AssocCtxt) {
walk_item_ctxt(visitor, item, ctxt)
}
fn walk_item_ctxt<K: WalkItemKind>(
visitor: &mut impl MutVisitor, visitor: &mut impl MutVisitor,
mut item: P<Item<K>>, item: &mut P<Item<K>>,
ctxt: K::Ctxt, ctxt: K::Ctxt,
) -> SmallVec<[P<Item<K>>; 1]> { ) {
let Item { ident, attrs, id, kind, vis, span, tokens } = item.deref_mut(); let Item { ident, attrs, id, kind, vis, span, tokens } = item.deref_mut();
visitor.visit_id(id); visitor.visit_id(id);
visit_attrs(visitor, attrs); visit_attrs(visitor, attrs);
@ -1351,6 +1420,27 @@ pub fn walk_flat_map_assoc_item<K: WalkItemKind>(
kind.walk(*span, *id, ident, vis, ctxt, visitor); kind.walk(*span, *id, ident, vis, ctxt, visitor);
visit_lazy_tts(visitor, tokens); visit_lazy_tts(visitor, tokens);
visitor.visit_span(span); visitor.visit_span(span);
}
pub fn walk_flat_map_item(vis: &mut impl MutVisitor, mut item: P<Item>) -> SmallVec<[P<Item>; 1]> {
vis.visit_item(&mut item);
smallvec![item]
}
pub fn walk_flat_map_foreign_item(
vis: &mut impl MutVisitor,
mut item: P<ForeignItem>,
) -> SmallVec<[P<ForeignItem>; 1]> {
vis.visit_foreign_item(&mut item);
smallvec![item]
}
pub fn walk_flat_map_assoc_item(
vis: &mut impl MutVisitor,
mut item: P<AssocItem>,
ctxt: AssocCtxt,
) -> SmallVec<[P<AssocItem>; 1]> {
vis.visit_assoc_item(&mut item, ctxt);
smallvec![item] smallvec![item]
} }

View File

@ -463,13 +463,6 @@ impl WalkItemKind for ItemKind {
} }
} }
pub fn walk_item<'a, V: Visitor<'a>>(
visitor: &mut V,
item: &'a Item<impl WalkItemKind<Ctxt = ()>>,
) -> V::Result {
walk_assoc_item(visitor, item, ())
}
pub fn walk_enum_def<'a, V: Visitor<'a>>( pub fn walk_enum_def<'a, V: Visitor<'a>>(
visitor: &mut V, visitor: &mut V,
EnumDef { variants }: &'a EnumDef, EnumDef { variants }: &'a EnumDef,
@ -931,7 +924,22 @@ impl WalkItemKind for AssocItemKind {
} }
} }
pub fn walk_assoc_item<'a, V: Visitor<'a>, K: WalkItemKind>( pub fn walk_item<'a, V: Visitor<'a>>(
visitor: &mut V,
item: &'a Item<impl WalkItemKind<Ctxt = ()>>,
) -> V::Result {
walk_item_ctxt(visitor, item, ())
}
pub fn walk_assoc_item<'a, V: Visitor<'a>>(
visitor: &mut V,
item: &'a AssocItem,
ctxt: AssocCtxt,
) -> V::Result {
walk_item_ctxt(visitor, item, ctxt)
}
fn walk_item_ctxt<'a, V: Visitor<'a>, K: WalkItemKind>(
visitor: &mut V, visitor: &mut V,
item: &'a Item<K>, item: &'a Item<K>,
ctxt: K::Ctxt, ctxt: K::Ctxt,

View File

@ -215,7 +215,7 @@ impl MutVisitor for CfgEval<'_> {
foreign_item: P<ast::ForeignItem>, foreign_item: P<ast::ForeignItem>,
) -> SmallVec<[P<ast::ForeignItem>; 1]> { ) -> SmallVec<[P<ast::ForeignItem>; 1]> {
let foreign_item = configure!(self, foreign_item); let foreign_item = configure!(self, foreign_item);
mut_visit::walk_flat_map_item(self, foreign_item) mut_visit::walk_flat_map_foreign_item(self, foreign_item)
} }
fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> { fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> {

View File

@ -1,6 +1,6 @@
// Code that generates a test runner to run all the tests in a crate // Code that generates a test runner to run all the tests in a crate
use std::{iter, mem}; use std::mem;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_ast::entry::EntryPointType; use rustc_ast::entry::EntryPointType;
@ -19,7 +19,7 @@ use rustc_span::hygiene::{AstPass, SyntaxContext, Transparency};
use rustc_span::symbol::{Ident, Symbol, sym}; use rustc_span::symbol::{Ident, Symbol, sym};
use rustc_span::{DUMMY_SP, Span}; use rustc_span::{DUMMY_SP, Span};
use rustc_target::spec::PanicStrategy; use rustc_target::spec::PanicStrategy;
use smallvec::{SmallVec, smallvec}; use smallvec::smallvec;
use thin_vec::{ThinVec, thin_vec}; use thin_vec::{ThinVec, thin_vec};
use tracing::debug; use tracing::debug;
@ -129,8 +129,9 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
c.items.push(mk_main(&mut self.cx)); c.items.push(mk_main(&mut self.cx));
} }
fn flat_map_item(&mut self, mut i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> { fn visit_item(&mut self, item: &mut P<ast::Item>) {
let item = &mut *i; let item = &mut **item;
if let Some(name) = get_test_name(&item) { if let Some(name) = get_test_name(&item) {
debug!("this is a test item"); debug!("this is a test item");
@ -158,7 +159,6 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
// But in those cases, we emit a lint to warn the user of these missing tests. // But in those cases, we emit a lint to warn the user of these missing tests.
walk_item(&mut InnerItemLinter { sess: self.cx.ext_cx.sess }, &item); walk_item(&mut InnerItemLinter { sess: self.cx.ext_cx.sess }, &item);
} }
smallvec![i]
} }
} }
@ -198,17 +198,16 @@ struct EntryPointCleaner<'a> {
} }
impl<'a> MutVisitor for EntryPointCleaner<'a> { impl<'a> MutVisitor for EntryPointCleaner<'a> {
fn flat_map_item(&mut self, i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> { fn visit_item(&mut self, item: &mut P<ast::Item>) {
self.depth += 1; self.depth += 1;
let item = walk_flat_map_item(self, i).expect_one("noop did something"); ast::mut_visit::walk_item(self, item);
self.depth -= 1; self.depth -= 1;
// Remove any #[rustc_main] or #[start] from the AST so it doesn't // Remove any #[rustc_main] or #[start] from the AST so it doesn't
// clash with the one we're going to add, but mark it as // clash with the one we're going to add, but mark it as
// #[allow(dead_code)] to avoid printing warnings. // #[allow(dead_code)] to avoid printing warnings.
let item = match entry_point_type(&item, self.depth == 0) { match entry_point_type(&item, self.depth == 0) {
EntryPointType::MainNamed | EntryPointType::RustcMainAttr | EntryPointType::Start => { EntryPointType::MainNamed | EntryPointType::RustcMainAttr | EntryPointType::Start => {
item.map(|ast::Item { id, ident, attrs, kind, vis, span, tokens }| {
let allow_dead_code = attr::mk_attr_nested_word( let allow_dead_code = attr::mk_attr_nested_word(
&self.sess.psess.attr_id_generator, &self.sess.psess.attr_id_generator,
ast::AttrStyle::Outer, ast::AttrStyle::Outer,
@ -217,21 +216,12 @@ impl<'a> MutVisitor for EntryPointCleaner<'a> {
sym::dead_code, sym::dead_code,
self.def_site, self.def_site,
); );
let attrs = attrs item.attrs
.into_iter() .retain(|attr| !attr.has_name(sym::rustc_main) && !attr.has_name(sym::start));
.filter(|attr| { item.attrs.push(allow_dead_code);
!attr.has_name(sym::rustc_main) && !attr.has_name(sym::start)
})
.chain(iter::once(allow_dead_code))
.collect();
ast::Item { id, ident, attrs, kind, vis, span, tokens }
})
} }
EntryPointType::None | EntryPointType::OtherMain => item, EntryPointType::None | EntryPointType::OtherMain => {}
}; };
smallvec![item]
} }
} }
@ -292,7 +282,7 @@ fn generate_test_harness(
/// Most of the Ident have the usual def-site hygiene for the AST pass. The /// Most of the Ident have the usual def-site hygiene for the AST pass. The
/// exception is the `test_const`s. These have a syntax context that has two /// exception is the `test_const`s. These have a syntax context that has two
/// opaque marks: one from the expansion of `test` or `test_case`, and one /// opaque marks: one from the expansion of `test` or `test_case`, and one
/// generated in `TestHarnessGenerator::flat_map_item`. When resolving this /// generated in `TestHarnessGenerator::visit_item`. When resolving this
/// identifier after failing to find a matching identifier in the root module /// identifier after failing to find a matching identifier in the root module
/// we remove the outer mark, and try resolving at its def-site, which will /// we remove the outer mark, and try resolving at its def-site, which will
/// then resolve to `test_const`. /// then resolve to `test_const`.

View File

@ -1382,7 +1382,7 @@ impl InvocationCollectorNode for P<ast::ForeignItem> {
fragment.make_foreign_items() fragment.make_foreign_items()
} }
fn walk_flat_map<V: MutVisitor>(self, visitor: &mut V) -> Self::OutputTy { fn walk_flat_map<V: MutVisitor>(self, visitor: &mut V) -> Self::OutputTy {
walk_flat_map_item(visitor, self) walk_flat_map_foreign_item(visitor, self)
} }
fn is_mac_call(&self) -> bool { fn is_mac_call(&self) -> bool {
matches!(self.kind, ForeignItemKind::MacCall(..)) matches!(self.kind, ForeignItemKind::MacCall(..))

View File

@ -296,7 +296,7 @@ impl MutVisitor for PlaceholderExpander {
) -> SmallVec<[P<ast::ForeignItem>; 1]> { ) -> SmallVec<[P<ast::ForeignItem>; 1]> {
match item.kind { match item.kind {
ast::ForeignItemKind::MacCall(_) => self.remove(item.id).make_foreign_items(), ast::ForeignItemKind::MacCall(_) => self.remove(item.id).make_foreign_items(),
_ => walk_flat_map_item(self, item), _ => walk_flat_map_foreign_item(self, item),
} }
} }

View File

@ -230,15 +230,16 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
} }
fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: ast_visit::AssocCtxt) { fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: ast_visit::AssocCtxt) {
self.with_lint_attrs(item.id, &item.attrs, |cx| match ctxt { self.with_lint_attrs(item.id, &item.attrs, |cx| {
match ctxt {
ast_visit::AssocCtxt::Trait => { ast_visit::AssocCtxt::Trait => {
lint_callback!(cx, check_trait_item, item); lint_callback!(cx, check_trait_item, item);
ast_visit::walk_assoc_item(cx, item, ctxt);
} }
ast_visit::AssocCtxt::Impl => { ast_visit::AssocCtxt::Impl => {
lint_callback!(cx, check_impl_item, item); lint_callback!(cx, check_impl_item, item);
ast_visit::walk_assoc_item(cx, item, ctxt);
} }
}
ast_visit::walk_assoc_item(cx, item, ctxt);
}); });
} }