mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
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:
commit
9d70af54e4
@ -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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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]> {
|
||||||
|
@ -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`.
|
||||||
|
@ -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(..))
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user