Skip to content

Commit e4472d3

Browse files
refactor: dedupe associated item visitation
1 parent 19c5c74 commit e4472d3

File tree

1 file changed

+35
-55
lines changed

1 file changed

+35
-55
lines changed

Diff for: src/visitor.rs

+35-55
Original file line numberDiff line numberDiff line change
@@ -615,85 +615,65 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
615615
self.push_rewrite(span, rewrite);
616616
}
617617

618-
pub(crate) fn visit_trait_item(&mut self, ti: &ast::AssocItem) {
619-
skip_out_of_file_lines_range_visitor!(self, ti.span);
618+
fn visit_assoc_item(&mut self, visitor_kind: &ItemVisitorKind<'_>) {
619+
use ItemVisitorKind::*;
620+
// TODO(calebcartwright): Not sure the skip spans are correct
621+
let (ai, skip_span, assoc_ctxt) = match visitor_kind {
622+
AssocTraitItem(ai) => (*ai, ai.span(), visit::AssocCtxt::Trait),
623+
AssocImplItem(ai) => (*ai, ai.span, visit::AssocCtxt::Impl),
624+
_ => unreachable!(),
625+
};
626+
skip_out_of_file_lines_range_visitor!(self, ai.span);
620627

621-
if self.visit_attrs(&ti.attrs, ast::AttrStyle::Outer) {
622-
self.push_skipped_with_span(ti.attrs.as_slice(), ti.span(), ti.span());
628+
if self.visit_attrs(&ai.attrs, ast::AttrStyle::Outer) {
629+
self.push_skipped_with_span(&ai.attrs.as_slice(), skip_span, skip_span);
623630
return;
624631
}
625632

626633
// TODO(calebcartwright): consider enabling box_patterns feature gate
627-
match ti.kind {
628-
ast::AssocItemKind::Const(..) => self.visit_static(&StaticParts::from_trait_item(ti)),
629-
ast::AssocItemKind::Fn(ref fn_kind) => {
634+
match (&ai.kind, visitor_kind) {
635+
(ast::AssocItemKind::Const(..), AssocTraitItem(_)) => {
636+
self.visit_static(&StaticParts::from_trait_item(&ai))
637+
}
638+
(ast::AssocItemKind::Const(..), AssocImplItem(_)) => {
639+
self.visit_static(&StaticParts::from_impl_item(&ai))
640+
}
641+
(ast::AssocItemKind::Fn(ref fn_kind), _) => {
630642
let ast::FnKind(defaultness, ref sig, ref generics, ref block) = **fn_kind;
631643
if let Some(ref body) = block {
632-
let inner_attrs = inner_attributes(&ti.attrs);
633-
let fn_ctxt = visit::FnCtxt::Assoc(visit::AssocCtxt::Trait);
644+
let inner_attrs = inner_attributes(&ai.attrs);
645+
let fn_ctxt = visit::FnCtxt::Assoc(assoc_ctxt);
634646
self.visit_fn(
635-
visit::FnKind::Fn(fn_ctxt, ti.ident, sig, &ti.vis, Some(body)),
647+
visit::FnKind::Fn(fn_ctxt, ai.ident, sig, &ai.vis, Some(body)),
636648
generics,
637649
&sig.decl,
638-
ti.span,
650+
ai.span,
639651
defaultness,
640652
Some(&inner_attrs),
641653
);
642654
} else {
643655
let indent = self.block_indent;
644656
let rewrite =
645-
self.rewrite_required_fn(indent, ti.ident, sig, &ti.vis, generics, ti.span);
646-
self.push_rewrite(ti.span, rewrite);
657+
self.rewrite_required_fn(indent, ai.ident, sig, &ai.vis, generics, ai.span);
658+
self.push_rewrite(ai.span, rewrite);
647659
}
648660
}
649-
ast::AssocItemKind::TyAlias(ref ty_alias_kind) => {
650-
use ItemVisitorKind::AssocTraitItem;
651-
self.visit_ty_alias_kind(ty_alias_kind, &AssocTraitItem(&ti), ti.span);
661+
(ast::AssocItemKind::TyAlias(ref ty_alias_kind), _) => {
662+
self.visit_ty_alias_kind(ty_alias_kind, visitor_kind, ai.span);
652663
}
653-
ast::AssocItemKind::MacCall(ref mac) => {
654-
self.visit_mac(mac, Some(ti.ident), MacroPosition::Item);
664+
(ast::AssocItemKind::MacCall(ref mac), _) => {
665+
self.visit_mac(mac, Some(ai.ident), MacroPosition::Item);
655666
}
667+
_ => unreachable!(),
656668
}
657669
}
658670

659-
pub(crate) fn visit_impl_item(&mut self, ii: &ast::AssocItem) {
660-
skip_out_of_file_lines_range_visitor!(self, ii.span);
661-
662-
if self.visit_attrs(&ii.attrs, ast::AttrStyle::Outer) {
663-
self.push_skipped_with_span(ii.attrs.as_slice(), ii.span, ii.span);
664-
return;
665-
}
671+
pub(crate) fn visit_trait_item(&mut self, ti: &ast::AssocItem) {
672+
self.visit_assoc_item(&ItemVisitorKind::AssocTraitItem(ti));
673+
}
666674

667-
match ii.kind {
668-
ast::AssocItemKind::Fn(ref fn_kind) => {
669-
let ast::FnKind(defaultness, ref sig, ref generics, ref block) = **fn_kind;
670-
if let Some(ref body) = block {
671-
let inner_attrs = inner_attributes(&ii.attrs);
672-
let fn_ctxt = visit::FnCtxt::Assoc(visit::AssocCtxt::Impl);
673-
self.visit_fn(
674-
visit::FnKind::Fn(fn_ctxt, ii.ident, sig, &ii.vis, Some(body)),
675-
generics,
676-
&sig.decl,
677-
ii.span,
678-
defaultness,
679-
Some(&inner_attrs),
680-
);
681-
} else {
682-
let indent = self.block_indent;
683-
let rewrite =
684-
self.rewrite_required_fn(indent, ii.ident, sig, &ii.vis, generics, ii.span);
685-
self.push_rewrite(ii.span, rewrite);
686-
}
687-
}
688-
ast::AssocItemKind::Const(..) => self.visit_static(&StaticParts::from_impl_item(ii)),
689-
ast::AssocItemKind::TyAlias(ref ty_alias_kind) => {
690-
use ItemVisitorKind::AssocImplItem;
691-
self.visit_ty_alias_kind(ty_alias_kind, &AssocImplItem(&ii), ii.span);
692-
}
693-
ast::AssocItemKind::MacCall(ref mac) => {
694-
self.visit_mac(mac, Some(ii.ident), MacroPosition::Item);
695-
}
696-
}
675+
pub(crate) fn visit_impl_item(&mut self, ii: &ast::AssocItem) {
676+
self.visit_assoc_item(&ItemVisitorKind::AssocImplItem(ii));
697677
}
698678

699679
fn visit_mac(&mut self, mac: &ast::MacCall, ident: Option<symbol::Ident>, pos: MacroPosition) {

0 commit comments

Comments
 (0)