@@ -138,38 +138,42 @@ impl<'a> AstValidator<'a> {
138138 & mut self ,
139139 ty_alias : & TyAlias ,
140140 ) -> Result < ( ) , errors:: WhereClauseBeforeTypeAlias > {
141- let before_predicates =
142- ty_alias. generics . where_clause . predicates . split_at ( ty_alias. where_predicates_split ) . 0 ;
143-
144- if ty_alias. ty . is_none ( ) || before_predicates. is_empty ( ) {
141+ if ty_alias. ty . is_none ( ) || !ty_alias. where_clauses . before . has_where_token {
145142 return Ok ( ( ) ) ;
146143 }
147144
148- let mut state = State :: new ( ) ;
149- if ! ty_alias. where_clauses . 1 . 0 {
150- state . space ( ) ;
151- state . word_space ( "where" ) ;
152- } else {
153- state . word_space ( "," ) ;
154- }
155- let mut first = true ;
156- for p in before_predicates {
157- if !first {
158- state. word_space ( ", " ) ;
145+ let ( before_predicates , after_predicates ) =
146+ ty_alias. generics . where_clause . predicates . split_at ( ty_alias . where_clauses . split ) ;
147+ let span = ty_alias . where_clauses . before . span ;
148+
149+ let sugg = if !before_predicates . is_empty ( ) || !ty_alias . where_clauses . after . has_where_token
150+ {
151+ let mut state = State :: new ( ) ;
152+
153+ if !ty_alias . where_clauses . after . has_where_token {
154+ state . space ( ) ;
155+ state. word_space ( "where " ) ;
159156 }
160- first = false ;
161- state. print_where_predicate ( p) ;
162- }
163157
164- let span = ty_alias. where_clauses . 0 . 1 ;
165- Err ( errors:: WhereClauseBeforeTypeAlias {
166- span,
167- sugg : errors:: WhereClauseBeforeTypeAliasSugg {
158+ let mut first = after_predicates. is_empty ( ) ;
159+ for p in before_predicates {
160+ if !first {
161+ state. word_space ( "," ) ;
162+ }
163+ first = false ;
164+ state. print_where_predicate ( p) ;
165+ }
166+
167+ errors:: WhereClauseBeforeTypeAliasSugg :: Move {
168168 left : span,
169169 snippet : state. s . eof ( ) ,
170- right : ty_alias. where_clauses . 1 . 1 . shrink_to_hi ( ) ,
171- } ,
172- } )
170+ right : ty_alias. where_clauses . after . span . shrink_to_hi ( ) ,
171+ }
172+ } else {
173+ errors:: WhereClauseBeforeTypeAliasSugg :: Remove { span }
174+ } ;
175+
176+ Err ( errors:: WhereClauseBeforeTypeAlias { span, sugg } )
173177 }
174178
175179 fn with_impl_trait ( & mut self , outer : Option < Span > , f : impl FnOnce ( & mut Self ) ) {
@@ -457,8 +461,7 @@ impl<'a> AstValidator<'a> {
457461 fn check_foreign_ty_genericless (
458462 & self ,
459463 generics : & Generics ,
460- before_where_clause : & TyAliasWhereClause ,
461- after_where_clause : & TyAliasWhereClause ,
464+ where_clauses : & TyAliasWhereClauses ,
462465 ) {
463466 let cannot_have = |span, descr, remove_descr| {
464467 self . dcx ( ) . emit_err ( errors:: ExternTypesCannotHave {
@@ -473,14 +476,14 @@ impl<'a> AstValidator<'a> {
473476 cannot_have ( generics. span , "generic parameters" , "generic parameters" ) ;
474477 }
475478
476- let check_where_clause = |where_clause : & TyAliasWhereClause | {
477- if let TyAliasWhereClause ( true , where_clause_span ) = where_clause {
478- cannot_have ( * where_clause_span , "`where` clauses" , "`where` clause" ) ;
479+ let check_where_clause = |where_clause : TyAliasWhereClause | {
480+ if where_clause. has_where_token {
481+ cannot_have ( where_clause . span , "`where` clauses" , "`where` clause" ) ;
479482 }
480483 } ;
481484
482- check_where_clause ( before_where_clause ) ;
483- check_where_clause ( after_where_clause ) ;
485+ check_where_clause ( where_clauses . before ) ;
486+ check_where_clause ( where_clauses . after ) ;
484487 }
485488
486489 fn check_foreign_kind_bodyless ( & self , ident : Ident , kind : & str , body : Option < Span > ) {
@@ -1122,9 +1125,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
11221125 if let Err ( err) = self . check_type_alias_where_clause_location ( ty_alias) {
11231126 self . dcx ( ) . emit_err ( err) ;
11241127 }
1125- } else if where_clauses. 1 . 0 {
1128+ } else if where_clauses. after . has_where_token {
11261129 self . dcx ( ) . emit_err ( errors:: WhereClauseAfterTypeAlias {
1127- span : where_clauses. 1 . 1 ,
1130+ span : where_clauses. after . span ,
11281131 help : self . session . is_nightly_build ( ) . then_some ( ( ) ) ,
11291132 } ) ;
11301133 }
@@ -1154,7 +1157,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
11541157 self . check_defaultness ( fi. span , * defaultness) ;
11551158 self . check_foreign_kind_bodyless ( fi. ident , "type" , ty. as_ref ( ) . map ( |b| b. span ) ) ;
11561159 self . check_type_no_bounds ( bounds, "`extern` blocks" ) ;
1157- self . check_foreign_ty_genericless ( generics, & where_clauses. 0 , & where_clauses . 1 ) ;
1160+ self . check_foreign_ty_genericless ( generics, where_clauses) ;
11581161 self . check_foreign_item_ascii_only ( fi. ident ) ;
11591162 }
11601163 ForeignItemKind :: Static ( _, _, body) => {
@@ -1477,15 +1480,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
14771480 if let AssocItemKind :: Type ( ty_alias) = & item. kind
14781481 && let Err ( err) = self . check_type_alias_where_clause_location ( ty_alias)
14791482 {
1483+ let sugg = match err. sugg {
1484+ errors:: WhereClauseBeforeTypeAliasSugg :: Remove { .. } => None ,
1485+ errors:: WhereClauseBeforeTypeAliasSugg :: Move { snippet, right, .. } => {
1486+ Some ( ( right, snippet) )
1487+ }
1488+ } ;
14801489 self . lint_buffer . buffer_lint_with_diagnostic (
14811490 DEPRECATED_WHERE_CLAUSE_LOCATION ,
14821491 item. id ,
14831492 err. span ,
14841493 fluent:: ast_passes_deprecated_where_clause_location,
1485- BuiltinLintDiagnostics :: DeprecatedWhereclauseLocation (
1486- err. sugg . right ,
1487- err. sugg . snippet ,
1488- ) ,
1494+ BuiltinLintDiagnostics :: DeprecatedWhereclauseLocation ( sugg) ,
14891495 ) ;
14901496 }
14911497
0 commit comments