Simplify ItemVisitorKind.

Instead of putting the item inside it, just pass the ident and
visibility (the only things needed) alongside it where necessary.

This helps with the next commit, which will move the ident's location.
Specifically, it gets rid of the `match visitor_kind` in
`rewrite_type_alias`.
This commit is contained in:
Nicholas Nethercote 2025-03-21 09:47:32 +11:00
parent 59307fd9fd
commit 4c551bcacd
2 changed files with 41 additions and 30 deletions

View file

@ -6,7 +6,7 @@ use std::cmp::{Ordering, max, min};
use regex::Regex;
use rustc_ast::visit;
use rustc_ast::{ast, ptr};
use rustc_span::{BytePos, DUMMY_SP, Span, symbol};
use rustc_span::{BytePos, DUMMY_SP, Ident, Span, symbol};
use tracing::debug;
use crate::attr::filter_inline_attrs;
@ -1679,11 +1679,12 @@ fn format_tuple_struct(
Some(result)
}
pub(crate) enum ItemVisitorKind<'a> {
Item(&'a ast::Item),
AssocTraitItem(&'a ast::AssocItem),
AssocImplItem(&'a ast::AssocItem),
ForeignItem(&'a ast::ForeignItem),
#[derive(Clone, Copy)]
pub(crate) enum ItemVisitorKind {
Item,
AssocTraitItem,
AssocImplItem,
ForeignItem,
}
struct TyAliasRewriteInfo<'c, 'g>(
@ -1695,11 +1696,13 @@ struct TyAliasRewriteInfo<'c, 'g>(
Span,
);
pub(crate) fn rewrite_type_alias<'a, 'b>(
pub(crate) fn rewrite_type_alias<'a>(
ty_alias_kind: &ast::TyAlias,
vis: &ast::Visibility,
ident: Ident,
context: &RewriteContext<'a>,
indent: Indent,
visitor_kind: &ItemVisitorKind<'b>,
visitor_kind: ItemVisitorKind,
span: Span,
) -> RewriteResult {
use ItemVisitorKind::*;
@ -1715,11 +1718,6 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
let rhs_hi = ty
.as_ref()
.map_or(where_clauses.before.span.hi(), |ty| ty.span.hi());
let (ident, vis) = match visitor_kind {
Item(i) => (i.ident, &i.vis),
AssocTraitItem(i) | AssocImplItem(i) => (i.ident, &i.vis),
ForeignItem(i) => (i.ident, &i.vis),
};
let rw_info = &TyAliasRewriteInfo(context, indent, generics, where_clauses, ident, span);
let op_ty = opaque_ty(ty);
// Type Aliases are formatted slightly differently depending on the context
@ -1727,14 +1725,14 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
// https://rustc-dev-guide.rust-lang.org/opaque-types-type-alias-impl-trait.html
// https://github.com/rust-dev-tools/fmt-rfcs/blob/master/guide/items.md#type-aliases
match (visitor_kind, &op_ty) {
(Item(_) | AssocTraitItem(_) | ForeignItem(_), Some(op_bounds)) => {
(Item | AssocTraitItem | ForeignItem, Some(op_bounds)) => {
let op = OpaqueType { bounds: op_bounds };
rewrite_ty(rw_info, Some(bounds), Some(&op), rhs_hi, vis)
}
(Item(_) | AssocTraitItem(_) | ForeignItem(_), None) => {
(Item | AssocTraitItem | ForeignItem, None) => {
rewrite_ty(rw_info, Some(bounds), ty_opt, rhs_hi, vis)
}
(AssocImplItem(_), _) => {
(AssocImplItem, _) => {
let result = if let Some(op_bounds) = op_ty {
let op = OpaqueType { bounds: op_bounds };
rewrite_ty(
@ -3498,8 +3496,16 @@ impl Rewrite for ast::ForeignItem {
.map(|s| s + ";")
}
ast::ForeignItemKind::TyAlias(ref ty_alias) => {
let (kind, span) = (&ItemVisitorKind::ForeignItem(self), self.span);
rewrite_type_alias(ty_alias, context, shape.indent, kind, span)
let kind = ItemVisitorKind::ForeignItem;
rewrite_type_alias(
ty_alias,
&self.vis,
self.ident,
context,
shape.indent,
kind,
self.span,
)
}
ast::ForeignItemKind::MacCall(ref mac) => {
rewrite_macro(mac, None, context, shape, MacroPosition::Item)

View file

@ -3,7 +3,7 @@ use std::rc::Rc;
use std::sync::Arc;
use rustc_ast::{ast, token::Delimiter, visit};
use rustc_span::{BytePos, Pos, Span, symbol};
use rustc_span::{BytePos, Ident, Pos, Span, symbol};
use tracing::debug;
use crate::attr::*;
@ -573,7 +573,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
}
ast::ItemKind::TyAlias(ref ty_alias) => {
use ItemVisitorKind::Item;
self.visit_ty_alias_kind(ty_alias, &Item(item), item.span);
self.visit_ty_alias_kind(ty_alias, &item.vis, item.ident, Item, item.span);
}
ast::ItemKind::GlobalAsm(..) => {
let snippet = Some(self.snippet(item.span).to_owned());
@ -605,11 +605,15 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
fn visit_ty_alias_kind(
&mut self,
ty_kind: &ast::TyAlias,
visitor_kind: &ItemVisitorKind<'_>,
vis: &ast::Visibility,
ident: Ident,
visitor_kind: ItemVisitorKind,
span: Span,
) {
let rewrite = rewrite_type_alias(
ty_kind,
vis,
ident,
&self.get_context(),
self.block_indent,
visitor_kind,
@ -619,15 +623,16 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
self.push_rewrite(span, rewrite);
}
fn visit_assoc_item(&mut self, visitor_kind: &ItemVisitorKind<'_>) {
fn visit_assoc_item(&mut self, ai: &ast::AssocItem, visitor_kind: ItemVisitorKind) {
use ItemVisitorKind::*;
// TODO(calebcartwright): Not sure the skip spans are correct
let (ai, skip_span, assoc_ctxt) = match visitor_kind {
AssocTraitItem(ai) => (*ai, ai.span(), visit::AssocCtxt::Trait),
let assoc_ctxt = match visitor_kind {
AssocTraitItem => visit::AssocCtxt::Trait,
// There is no difference between trait and inherent assoc item formatting
AssocImplItem(ai) => (*ai, ai.span, visit::AssocCtxt::Impl { of_trait: false }),
AssocImplItem => visit::AssocCtxt::Impl { of_trait: false },
_ => unreachable!(),
};
let skip_span = ai.span;
skip_out_of_file_lines_range_visitor!(self, ai.span);
if self.visit_attrs(&ai.attrs, ast::AttrStyle::Outer) {
@ -637,10 +642,10 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
// TODO(calebcartwright): consider enabling box_patterns feature gate
match (&ai.kind, visitor_kind) {
(ast::AssocItemKind::Const(..), AssocTraitItem(_)) => {
(ast::AssocItemKind::Const(..), AssocTraitItem) => {
self.visit_static(&StaticParts::from_trait_item(ai))
}
(ast::AssocItemKind::Const(..), AssocImplItem(_)) => {
(ast::AssocItemKind::Const(..), AssocImplItem) => {
self.visit_static(&StaticParts::from_impl_item(ai))
}
(ast::AssocItemKind::Fn(ref fn_kind), _) => {
@ -670,7 +675,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
}
}
(ast::AssocItemKind::Type(ref ty_alias), _) => {
self.visit_ty_alias_kind(ty_alias, visitor_kind, ai.span);
self.visit_ty_alias_kind(ty_alias, &ai.vis, ai.ident, visitor_kind, ai.span);
}
(ast::AssocItemKind::MacCall(ref mac), _) => {
self.visit_mac(mac, Some(ai.ident), MacroPosition::Item);
@ -680,11 +685,11 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
}
pub(crate) fn visit_trait_item(&mut self, ti: &ast::AssocItem) {
self.visit_assoc_item(&ItemVisitorKind::AssocTraitItem(ti));
self.visit_assoc_item(ti, ItemVisitorKind::AssocTraitItem);
}
pub(crate) fn visit_impl_item(&mut self, ii: &ast::AssocItem) {
self.visit_assoc_item(&ItemVisitorKind::AssocImplItem(ii));
self.visit_assoc_item(ii, ItemVisitorKind::AssocImplItem);
}
fn visit_mac(&mut self, mac: &ast::MacCall, ident: Option<symbol::Ident>, pos: MacroPosition) {