Rollup merge of #121326 - fmease:detect-empty-leading-where-clauses-on-ty-aliases, r=compiler-errors

Detect empty leading where clauses on type aliases

1. commit: refactor the AST of type alias where clauses
   * I could no longer bear the look of `.0.1` and `.1.0`
   * Arguably moving `split` out of `TyAlias` into a substruct might not make that much sense from a semantic standpoint since it reprs an index into `TyAlias.predicates` but it's alright and it cleans up the usage sites of `TyAlias`
2. commit: fix an oversight: An empty leading where clause is still a leading where clause
   * semantically reject empty leading where clauses on lazy type aliases
     * e.g., on `#![feature(lazy_type_alias)] type X where = ();`
   * make empty leading where clauses on assoc types trigger lint `deprecated_where_clause_location`
     * e.g., `impl Trait for () { type X where = (); }`
This commit is contained in:
Matthias Krüger 2024-02-29 20:50:02 +01:00 committed by GitHub
commit 050610e772

View File

@ -1651,8 +1651,7 @@ struct TyAliasRewriteInfo<'c, 'g>(
&'c RewriteContext<'c>, &'c RewriteContext<'c>,
Indent, Indent,
&'g ast::Generics, &'g ast::Generics,
(ast::TyAliasWhereClause, ast::TyAliasWhereClause), ast::TyAliasWhereClauses,
usize,
symbol::Ident, symbol::Ident,
Span, Span,
); );
@ -1672,7 +1671,6 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
ref bounds, ref bounds,
ref ty, ref ty,
where_clauses, where_clauses,
where_predicates_split,
} = *ty_alias_kind; } = *ty_alias_kind;
let ty_opt = ty.as_ref(); let ty_opt = ty.as_ref();
let (ident, vis) = match visitor_kind { let (ident, vis) = match visitor_kind {
@ -1680,15 +1678,7 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
AssocTraitItem(i) | AssocImplItem(i) => (i.ident, &i.vis), AssocTraitItem(i) | AssocImplItem(i) => (i.ident, &i.vis),
ForeignItem(i) => (i.ident, &i.vis), ForeignItem(i) => (i.ident, &i.vis),
}; };
let rw_info = &TyAliasRewriteInfo( let rw_info = &TyAliasRewriteInfo(context, indent, generics, where_clauses, ident, span);
context,
indent,
generics,
where_clauses,
where_predicates_split,
ident,
span,
);
let op_ty = opaque_ty(ty); let op_ty = opaque_ty(ty);
// Type Aliases are formatted slightly differently depending on the context // Type Aliases are formatted slightly differently depending on the context
// in which they appear, whether they are opaque, and whether they are associated. // in which they appear, whether they are opaque, and whether they are associated.
@ -1724,19 +1714,11 @@ fn rewrite_ty<R: Rewrite>(
vis: &ast::Visibility, vis: &ast::Visibility,
) -> Option<String> { ) -> Option<String> {
let mut result = String::with_capacity(128); let mut result = String::with_capacity(128);
let TyAliasRewriteInfo( let TyAliasRewriteInfo(context, indent, generics, where_clauses, ident, span) = *rw_info;
context,
indent,
generics,
where_clauses,
where_predicates_split,
ident,
span,
) = *rw_info;
let (before_where_predicates, after_where_predicates) = generics let (before_where_predicates, after_where_predicates) = generics
.where_clause .where_clause
.predicates .predicates
.split_at(where_predicates_split); .split_at(where_clauses.split);
if !after_where_predicates.is_empty() { if !after_where_predicates.is_empty() {
return None; return None;
} }
@ -1771,7 +1753,7 @@ fn rewrite_ty<R: Rewrite>(
let where_clause_str = rewrite_where_clause( let where_clause_str = rewrite_where_clause(
context, context,
before_where_predicates, before_where_predicates,
where_clauses.0.1, where_clauses.before.span,
context.config.brace_style(), context.config.brace_style(),
Shape::legacy(where_budget, indent), Shape::legacy(where_budget, indent),
false, false,
@ -1795,7 +1777,7 @@ fn rewrite_ty<R: Rewrite>(
let comment_span = context let comment_span = context
.snippet_provider .snippet_provider
.opt_span_before(span, "=") .opt_span_before(span, "=")
.map(|op_lo| mk_sp(where_clauses.0.1.hi(), op_lo)); .map(|op_lo| mk_sp(where_clauses.before.span.hi(), op_lo));
let lhs = match comment_span { let lhs = match comment_span {
Some(comment_span) Some(comment_span)