Skip to content

Commit 0a2e5ca

Browse files
committed
Unify {visit,walk}_assoc_item
1 parent cdd181a commit 0a2e5ca

File tree

1 file changed

+80
-153
lines changed

1 file changed

+80
-153
lines changed

compiler/rustc_ast/src/visitors.rs

+80-153
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,6 @@ macro_rules! make_ast_visitor {
301301
/// or `ControlFlow<T>`.
302302
type Result: VisitorResult = ();
303303

304-
make_visit!{AssocItem, ctxt: AssocCtxt; visit_assoc_item, walk_assoc_item}
305304
make_visit!{Stmt; visit_stmt, walk_stmt}
306305

307306
/// This method is a hack to workaround unstable of `stmt_expr_attributes`.
@@ -372,9 +371,10 @@ macro_rules! make_ast_visitor {
372371
make_visit!{P!(Pat); visit_pat, walk_pat}
373372
make_visit!{P!(Ty); visit_ty, walk_ty}
374373

375-
// Default implementations are generic over WalkItemKind
376-
make_visit!{ForeignItem; visit_foreign_item, walk_item}
374+
// Item variants
377375
make_visit!{Item; visit_item, walk_item}
376+
make_visit!{AssocItem, ctxt: AssocCtxt; visit_assoc_item, walk_assoc_item}
377+
make_visit!{ForeignItem; visit_foreign_item, walk_item}
378378

379379
fn visit_fn(&mut self, fn_kind: FnKind!(), _span: Span, _id: NodeId) -> result!() {
380380
walk_fn(self, fn_kind)
@@ -1496,6 +1496,81 @@ macro_rules! make_ast_visitor {
14961496
return_result!(V)
14971497
}
14981498

1499+
pub fn walk_assoc_item<$($lt,)? V: $trait$(<$lt>)?>(
1500+
visitor: &mut V,
1501+
item: ref_t!(Item<AssocItemKind>),
1502+
ctxt: AssocCtxt
1503+
) -> result!(V) {
1504+
let Item { attrs, id, span, vis, ident, kind, tokens } = item;
1505+
try_v!(visit_id!(visitor, id));
1506+
visit_list!(visitor, visit_attribute, attrs);
1507+
try_v!(visitor.visit_vis(vis));
1508+
try_v!(visitor.visit_ident(ident));
1509+
match kind {
1510+
AssocItemKind::Const(box ConstItem { defaultness, generics, ty, expr }) => {
1511+
try_v!(visitor.visit_defaultness(defaultness));
1512+
try_v!(visitor.visit_generics(generics));
1513+
try_v!(visitor.visit_ty(ty));
1514+
visit_o!(expr, |expr| visitor.visit_expr(expr));
1515+
}
1516+
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
1517+
try_v!(visitor.visit_defaultness(defaultness));
1518+
let kind =
1519+
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body);
1520+
try_v!(visitor.visit_fn(kind, *span, *id));
1521+
}
1522+
AssocItemKind::Type(box TyAlias {
1523+
defaultness,
1524+
generics,
1525+
where_clauses,
1526+
bounds,
1527+
ty,
1528+
}) => {
1529+
try_v!(visitor.visit_defaultness(defaultness));
1530+
try_v!(visitor.visit_generics(generics));
1531+
visit_list!(visitor, visit_param_bound, bounds; BoundKind::Bound);
1532+
visit_o!(ty, |ty| visitor.visit_ty(ty));
1533+
try_v!(visitor.visit_ty_alias_where_clauses(where_clauses));
1534+
}
1535+
AssocItemKind::MacCall(mac) => {
1536+
try_v!(visitor.visit_mac_call(mac));
1537+
}
1538+
AssocItemKind::Delegation(box Delegation {
1539+
id,
1540+
qself,
1541+
path,
1542+
rename,
1543+
body,
1544+
from_glob: _,
1545+
}) => {
1546+
try_v!(visit_id!(visitor, id));
1547+
try_v!(visitor.visit_qself(qself));
1548+
try_v!(visitor.visit_path(path, *id));
1549+
visit_o!(rename, |rename| visitor.visit_ident(rename));
1550+
visit_o!(body, |body| visitor.visit_block(body));
1551+
}
1552+
AssocItemKind::DelegationMac(box DelegationMac {
1553+
qself,
1554+
prefix,
1555+
suffixes,
1556+
body,
1557+
}) => {
1558+
try_v!(visitor.visit_qself(qself));
1559+
try_v!(visitor.visit_path(prefix, *id));
1560+
if let Some(suffixes) = suffixes {
1561+
for (ident, rename) in suffixes {
1562+
try_v!(visitor.visit_ident(ident));
1563+
visit_o!(rename, |rename| visitor.visit_ident(rename));
1564+
}
1565+
}
1566+
visit_o!(body, |body| visitor.visit_block(body));
1567+
}
1568+
}
1569+
visit_lazy_tts!(visitor, tokens);
1570+
try_v!(visit_span!(visitor, span));
1571+
return_result!(V)
1572+
}
1573+
14991574
pub fn walk_fn<$($lt,)? V: $trait$(<$lt>)?>(
15001575
visitor: &mut V,
15011576
kind: FnKind!()
@@ -1626,73 +1701,6 @@ pub mod visit {
16261701

16271702
make_ast_visitor!(Visitor<'ast>);
16281703

1629-
pub fn walk_assoc_item<'a, V: Visitor<'a>>(
1630-
visitor: &mut V,
1631-
item: &'a AssocItem,
1632-
ctxt: AssocCtxt,
1633-
) -> V::Result {
1634-
let Item { id, span, ident, vis, attrs, kind, tokens: _ } = item;
1635-
walk_list!(visitor, visit_attribute, attrs);
1636-
try_visit!(visitor.visit_vis(vis));
1637-
try_visit!(visitor.visit_ident(ident));
1638-
match kind {
1639-
AssocItemKind::Const(box ConstItem { defaultness, generics, ty, expr }) => {
1640-
try_visit!(visitor.visit_defaultness(defaultness));
1641-
try_visit!(visitor.visit_generics(generics));
1642-
try_visit!(visitor.visit_ty(ty));
1643-
visit_opt!(visitor, visit_expr, expr);
1644-
}
1645-
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
1646-
try_visit!(visitor.visit_defaultness(defaultness));
1647-
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body);
1648-
try_visit!(visitor.visit_fn(kind, *span, *id));
1649-
}
1650-
AssocItemKind::Type(box TyAlias {
1651-
generics,
1652-
bounds,
1653-
ty,
1654-
defaultness,
1655-
where_clauses,
1656-
}) => {
1657-
try_visit!(visitor.visit_defaultness(defaultness));
1658-
try_visit!(visitor.visit_generics(generics));
1659-
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
1660-
visit_opt!(visitor, visit_ty, ty);
1661-
try_visit!(visitor.visit_ty_alias_where_clauses(where_clauses));
1662-
}
1663-
AssocItemKind::MacCall(mac) => {
1664-
try_visit!(visitor.visit_mac_call(mac));
1665-
}
1666-
AssocItemKind::Delegation(box Delegation {
1667-
id,
1668-
qself,
1669-
path,
1670-
rename,
1671-
body,
1672-
from_glob: _,
1673-
}) => {
1674-
try_visit!(visitor.visit_qself(qself));
1675-
try_visit!(visitor.visit_path(path, *id));
1676-
visit_opt!(visitor, visit_ident, rename);
1677-
visit_opt!(visitor, visit_block, body);
1678-
}
1679-
AssocItemKind::DelegationMac(box DelegationMac { qself, prefix, suffixes, body }) => {
1680-
try_visit!(visitor.visit_qself(qself));
1681-
try_visit!(visitor.visit_path(prefix, *id));
1682-
if let Some(suffixes) = suffixes {
1683-
for (ident, rename) in suffixes {
1684-
visitor.visit_ident(ident);
1685-
if let Some(rename) = rename {
1686-
visitor.visit_ident(rename);
1687-
}
1688-
}
1689-
}
1690-
visit_opt!(visitor, visit_block, body);
1691-
}
1692-
}
1693-
V::Result::output()
1694-
}
1695-
16961704
pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) -> V::Result {
16971705
let Stmt { id: _, kind, span: _ } = statement;
16981706
match kind {
@@ -1960,11 +1968,6 @@ pub mod mut_visit {
19601968
exprs.flat_map_in_place(|expr| vis.filter_map_expr(expr))
19611969
}
19621970

1963-
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
1964-
fn visit_bounds<T: MutVisitor>(vis: &mut T, bounds: &mut GenericBounds, ctxt: BoundKind) {
1965-
visit_vec(bounds, |bound| vis.visit_param_bound(bound, ctxt));
1966-
}
1967-
19681971
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
19691972
fn visit_delim_args<T: MutVisitor>(vis: &mut T, args: &mut DelimArgs) {
19701973
let DelimArgs { dspan, delim: _, tokens } = args;
@@ -2197,16 +2200,6 @@ pub mod mut_visit {
21972200
item.kind.walk(item.id, item.span, &mut item.vis, &mut item.ident, vis)
21982201
}
21992202

2200-
fn visit_const_item<T: MutVisitor>(
2201-
ConstItem { defaultness, generics, ty, expr }: &mut ConstItem,
2202-
visitor: &mut T,
2203-
) {
2204-
visitor.visit_defaultness(defaultness);
2205-
visitor.visit_generics(generics);
2206-
visitor.visit_ty(ty);
2207-
visit_opt(expr, |expr| visitor.visit_expr(expr));
2208-
}
2209-
22102203
/// Mutates one item, returning the item again.
22112204
pub fn walk_flat_map_item(
22122205
vis: &mut impl MutVisitor,
@@ -2226,77 +2219,11 @@ pub mod mut_visit {
22262219

22272220
/// Mutates one item, returning the item again.
22282221
pub fn walk_flat_map_assoc_item(
2229-
visitor: &mut impl MutVisitor,
2222+
vis: &mut impl MutVisitor,
22302223
mut item: P<AssocItem>,
22312224
ctxt: AssocCtxt,
22322225
) -> SmallVec<[P<AssocItem>; 1]> {
2233-
let Item { ident, attrs, id, kind, vis, span, tokens } = item.deref_mut();
2234-
visitor.visit_id(id);
2235-
visit_attrs(visitor, attrs);
2236-
visitor.visit_vis(vis);
2237-
visitor.visit_ident(ident);
2238-
match kind {
2239-
AssocItemKind::Const(item) => {
2240-
visit_const_item(item, visitor);
2241-
}
2242-
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
2243-
visitor.visit_defaultness(defaultness);
2244-
visitor.visit_fn(
2245-
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body),
2246-
*span,
2247-
*id,
2248-
);
2249-
}
2250-
AssocItemKind::Type(box TyAlias {
2251-
defaultness,
2252-
generics,
2253-
where_clauses,
2254-
bounds,
2255-
ty,
2256-
}) => {
2257-
visitor.visit_defaultness(defaultness);
2258-
visitor.visit_generics(generics);
2259-
visit_bounds(visitor, bounds, BoundKind::Bound);
2260-
visit_opt(ty, |ty| visitor.visit_ty(ty));
2261-
visitor.visit_ty_alias_where_clauses(where_clauses);
2262-
}
2263-
AssocItemKind::MacCall(mac) => visitor.visit_mac_call(mac),
2264-
AssocItemKind::Delegation(box Delegation {
2265-
id,
2266-
qself,
2267-
path,
2268-
rename,
2269-
body,
2270-
from_glob: _,
2271-
}) => {
2272-
visitor.visit_id(id);
2273-
visitor.visit_qself(qself);
2274-
visitor.visit_path(path, *id);
2275-
if let Some(rename) = rename {
2276-
visitor.visit_ident(rename);
2277-
}
2278-
if let Some(body) = body {
2279-
visitor.visit_block(body);
2280-
}
2281-
}
2282-
AssocItemKind::DelegationMac(box DelegationMac { qself, prefix, suffixes, body }) => {
2283-
visitor.visit_qself(qself);
2284-
visitor.visit_path(prefix, *id);
2285-
if let Some(suffixes) = suffixes {
2286-
for (ident, rename) in suffixes {
2287-
visitor.visit_ident(ident);
2288-
if let Some(rename) = rename {
2289-
visitor.visit_ident(rename);
2290-
}
2291-
}
2292-
}
2293-
if let Some(body) = body {
2294-
visitor.visit_block(body);
2295-
}
2296-
}
2297-
}
2298-
visit_lazy_tts(visitor, tokens);
2299-
visitor.visit_span(span);
2226+
vis.visit_assoc_item(&mut item, ctxt);
23002227
smallvec![item]
23012228
}
23022229

0 commit comments

Comments
 (0)