@@ -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