@@ -31,54 +31,13 @@ pub fn is_builtin_attr(attr: &Attribute) -> bool {
3131    attr. is_doc_comment ( )  || attr. ident ( ) . is_some_and ( |ident| is_builtin_attr_name ( ident. name ) ) 
3232} 
3333
34- enum  AttrError  { 
35-     MultipleItem ( String ) , 
36-     UnknownMetaItem ( String ,  & ' static  [ & ' static  str ] ) , 
37-     MissingSince , 
38-     NonIdentFeature , 
39-     MissingFeature , 
40-     MultipleStabilityLevels , 
41-     UnsupportedLiteral ( UnsupportedLiteralReason ,  /* is_bytestr */  bool ) , 
42- } 
43- 
4434pub ( crate )  enum  UnsupportedLiteralReason  { 
4535    Generic , 
4636    CfgString , 
4737    DeprecatedString , 
4838    DeprecatedKvPair , 
4939} 
5040
51- fn  handle_errors ( sess :  & ParseSess ,  span :  Span ,  error :  AttrError )  { 
52-     match  error { 
53-         AttrError :: MultipleItem ( item)  => { 
54-             sess. emit_err ( session_diagnostics:: MultipleItem  {  span,  item } ) ; 
55-         } 
56-         AttrError :: UnknownMetaItem ( item,  expected)  => { 
57-             sess. emit_err ( session_diagnostics:: UnknownMetaItem  {  span,  item,  expected } ) ; 
58-         } 
59-         AttrError :: MissingSince  => { 
60-             sess. emit_err ( session_diagnostics:: MissingSince  {  span } ) ; 
61-         } 
62-         AttrError :: NonIdentFeature  => { 
63-             sess. emit_err ( session_diagnostics:: NonIdentFeature  {  span } ) ; 
64-         } 
65-         AttrError :: MissingFeature  => { 
66-             sess. emit_err ( session_diagnostics:: MissingFeature  {  span } ) ; 
67-         } 
68-         AttrError :: MultipleStabilityLevels  => { 
69-             sess. emit_err ( session_diagnostics:: MultipleStabilityLevels  {  span } ) ; 
70-         } 
71-         AttrError :: UnsupportedLiteral ( reason,  is_bytestr)  => { 
72-             sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
73-                 span, 
74-                 reason, 
75-                 is_bytestr, 
76-                 start_point_span :  sess. source_map ( ) . start_point ( span) , 
77-             } ) ; 
78-         } 
79-     } 
80- } 
81- 
8241#[ derive( Copy ,  Clone ,  PartialEq ,  Encodable ,  Decodable ,  Debug ,  HashStable_Generic ) ]  
8342pub  enum  InlineAttr  { 
8443    None , 
@@ -241,7 +200,7 @@ pub fn find_stability(
241200            sym:: rustc_allowed_through_unstable_modules => allowed_through_unstable_modules = true , 
242201            sym:: unstable => { 
243202                if  stab. is_some ( )  { 
244-                     handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MultipleStabilityLevels ) ; 
203+                     sess. emit_err ( session_diagnostics :: MultipleStabilityLevels   {   span :   attr. span   } ) ; 
245204                    break ; 
246205                } 
247206
@@ -251,7 +210,7 @@ pub fn find_stability(
251210            } 
252211            sym:: stable => { 
253212                if  stab. is_some ( )  { 
254-                     handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MultipleStabilityLevels ) ; 
213+                     sess. emit_err ( session_diagnostics :: MultipleStabilityLevels   {   span :   attr. span   } ) ; 
255214                    break ; 
256215                } 
257216                if  let  Some ( ( feature,  level) )  = parse_stability ( sess,  attr)  { 
@@ -295,7 +254,7 @@ pub fn find_const_stability(
295254            sym:: rustc_promotable => promotable = true , 
296255            sym:: rustc_const_unstable => { 
297256                if  const_stab. is_some ( )  { 
298-                     handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MultipleStabilityLevels ) ; 
257+                     sess. emit_err ( session_diagnostics :: MultipleStabilityLevels   {   span :   attr. span   } ) ; 
299258                    break ; 
300259                } 
301260
@@ -306,7 +265,7 @@ pub fn find_const_stability(
306265            } 
307266            sym:: rustc_const_stable => { 
308267                if  const_stab. is_some ( )  { 
309-                     handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MultipleStabilityLevels ) ; 
268+                     sess. emit_err ( session_diagnostics :: MultipleStabilityLevels   {   span :   attr. span   } ) ; 
310269                    break ; 
311270                } 
312271                if  let  Some ( ( feature,  level) )  = parse_stability ( sess,  attr)  { 
@@ -340,7 +299,7 @@ pub fn find_body_stability(
340299    for  attr in  attrs { 
341300        if  attr. has_name ( sym:: rustc_default_body_unstable)  { 
342301            if  body_stab. is_some ( )  { 
343-                 handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MultipleStabilityLevels ) ; 
302+                 sess. emit_err ( session_diagnostics :: MultipleStabilityLevels   {   span :   attr. span   } ) ; 
344303                break ; 
345304            } 
346305
@@ -355,11 +314,10 @@ pub fn find_body_stability(
355314
356315fn  insert_or_error ( sess :  & Session ,  meta :  & MetaItem ,  item :  & mut  Option < Symbol > )  -> Option < ( ) >  { 
357316    if  item. is_some ( )  { 
358-         handle_errors ( 
359-             & sess. parse_sess , 
360-             meta. span , 
361-             AttrError :: MultipleItem ( pprust:: path_to_string ( & meta. path ) ) , 
362-         ) ; 
317+         sess. emit_err ( session_diagnostics:: MultipleItem  { 
318+             span :  meta. span , 
319+             item :  pprust:: path_to_string ( & meta. path ) , 
320+         } ) ; 
363321        None 
364322    }  else  if  let  Some ( v)  = meta. value_str ( )  { 
365323        * item = Some ( v) ; 
@@ -380,26 +338,24 @@ fn parse_stability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabilit
380338    let  mut  since = None ; 
381339    for  meta in  metas { 
382340        let  Some ( mi)  = meta. meta_item ( )  else  { 
383-             handle_errors ( 
384-                 & sess. parse_sess , 
385-                 meta. span ( ) , 
386-                 AttrError :: UnsupportedLiteral ( UnsupportedLiteralReason :: Generic ,  false ) , 
387-             ) ; 
341+             sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
342+                 span :  meta. span ( ) , 
343+                 reason :  UnsupportedLiteralReason :: Generic , 
344+                 is_bytestr :  false , 
345+                 start_point_span :  sess. source_map ( ) . start_point ( meta. span ( ) ) , 
346+             } ) ; 
388347            return  None ; 
389348        } ; 
390349
391350        match  mi. name_or_empty ( )  { 
392351            sym:: feature => insert_or_error ( sess,  mi,  & mut  feature) ?, 
393352            sym:: since => insert_or_error ( sess,  mi,  & mut  since) ?, 
394353            _ => { 
395-                 handle_errors ( 
396-                     & sess. parse_sess , 
397-                     meta. span ( ) , 
398-                     AttrError :: UnknownMetaItem ( 
399-                         pprust:: path_to_string ( & mi. path ) , 
400-                         & [ "feature" ,  "since" ] , 
401-                     ) , 
402-                 ) ; 
354+                 sess. emit_err ( session_diagnostics:: UnknownMetaItem  { 
355+                     span :  meta. span ( ) , 
356+                     item :  pprust:: path_to_string ( & mi. path ) , 
357+                     expected :  & [ "feature" ,  "since" ] , 
358+                 } ) ; 
403359                return  None ; 
404360            } 
405361        } 
@@ -417,11 +373,11 @@ fn parse_stability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabilit
417373            Some ( ( feature,  level) ) 
418374        } 
419375        ( None ,  _)  => { 
420-             handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MissingFeature ) ; 
376+             sess. emit_err ( session_diagnostics :: MissingFeature   {   span :   attr. span   } ) ; 
421377            None 
422378        } 
423379        _ => { 
424-             handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MissingSince ) ; 
380+             sess. emit_err ( session_diagnostics :: MissingSince   {   span :   attr. span   } ) ; 
425381            None 
426382        } 
427383    } 
@@ -441,11 +397,12 @@ fn parse_unstability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabil
441397    let  mut  implied_by = None ; 
442398    for  meta in  metas { 
443399        let  Some ( mi)  = meta. meta_item ( )  else  { 
444-             handle_errors ( 
445-                 & sess. parse_sess , 
446-                 meta. span ( ) , 
447-                 AttrError :: UnsupportedLiteral ( UnsupportedLiteralReason :: Generic ,  false ) , 
448-             ) ; 
400+             sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
401+                 span :  meta. span ( ) , 
402+                 reason :  UnsupportedLiteralReason :: Generic , 
403+                 is_bytestr :  false , 
404+                 start_point_span :  sess. source_map ( ) . start_point ( meta. span ( ) ) , 
405+             } ) ; 
449406            return  None ; 
450407        } ; 
451408
@@ -484,14 +441,11 @@ fn parse_unstability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabil
484441            } 
485442            sym:: implied_by => insert_or_error ( sess,  mi,  & mut  implied_by) ?, 
486443            _ => { 
487-                 handle_errors ( 
488-                     & sess. parse_sess , 
489-                     meta. span ( ) , 
490-                     AttrError :: UnknownMetaItem ( 
491-                         pprust:: path_to_string ( & mi. path ) , 
492-                         & [ "feature" ,  "reason" ,  "issue" ,  "soft" ,  "implied_by" ] , 
493-                     ) , 
494-                 ) ; 
444+                 sess. emit_err ( session_diagnostics:: UnknownMetaItem  { 
445+                     span :  meta. span ( ) , 
446+                     item :  pprust:: path_to_string ( & mi. path ) , 
447+                     expected :  & [ "feature" ,  "reason" ,  "issue" ,  "soft" ,  "implied_by" ] , 
448+                 } ) ; 
495449                return  None ; 
496450            } 
497451        } 
@@ -500,7 +454,7 @@ fn parse_unstability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabil
500454    match  ( feature,  reason,  issue)  { 
501455        ( Some ( feature) ,  reason,  Some ( _) )  => { 
502456            if  !rustc_lexer:: is_ident ( feature. as_str ( ) )  { 
503-                 handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: NonIdentFeature ) ; 
457+                 sess. emit_err ( session_diagnostics :: NonIdentFeature   {   span :   attr. span   } ) ; 
504458                return  None ; 
505459            } 
506460            let  level = StabilityLevel :: Unstable  { 
@@ -512,7 +466,7 @@ fn parse_unstability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabil
512466            Some ( ( feature,  level) ) 
513467        } 
514468        ( None ,  _,  _)  => { 
515-             handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MissingFeature ) ; 
469+             sess. emit_err ( session_diagnostics :: MissingFeature   {   span :   attr. span   } ) ; 
516470            return  None ; 
517471        } 
518472        _ => { 
@@ -659,11 +613,12 @@ pub fn eval_condition(
659613        ast:: MetaItemKind :: List ( mis)  => { 
660614            for  mi in  mis. iter ( )  { 
661615                if  !mi. is_meta_item ( )  { 
662-                     handle_errors ( 
663-                         sess, 
664-                         mi. span ( ) , 
665-                         AttrError :: UnsupportedLiteral ( UnsupportedLiteralReason :: Generic ,  false ) , 
666-                     ) ; 
616+                     sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
617+                         span :  mi. span ( ) , 
618+                         reason :  UnsupportedLiteralReason :: Generic , 
619+                         is_bytestr :  false , 
620+                         start_point_span :  sess. source_map ( ) . start_point ( mi. span ( ) ) , 
621+                     } ) ; 
667622                    return  false ; 
668623                } 
669624            } 
@@ -731,14 +686,12 @@ pub fn eval_condition(
731686            true 
732687        } 
733688        MetaItemKind :: NameValue ( lit)  if  !lit. kind . is_str ( )  => { 
734-             handle_errors ( 
735-                 sess, 
736-                 lit. span , 
737-                 AttrError :: UnsupportedLiteral ( 
738-                     UnsupportedLiteralReason :: CfgString , 
739-                     lit. kind . is_bytestr ( ) , 
740-                 ) , 
741-             ) ; 
689+             sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
690+                 span :  lit. span , 
691+                 reason :  UnsupportedLiteralReason :: CfgString , 
692+                 is_bytestr :  lit. kind . is_bytestr ( ) , 
693+                 start_point_span :  sess. source_map ( ) . start_point ( lit. span ) , 
694+             } ) ; 
742695            true 
743696        } 
744697        ast:: MetaItemKind :: Word  | ast:: MetaItemKind :: NameValue ( ..)  => { 
@@ -795,26 +748,23 @@ pub fn find_deprecation(
795748            MetaItemKind :: List ( list)  => { 
796749                let  get = |meta :  & MetaItem ,  item :  & mut  Option < Symbol > | { 
797750                    if  item. is_some ( )  { 
798-                         handle_errors ( 
799-                             & sess. parse_sess , 
800-                             meta. span , 
801-                             AttrError :: MultipleItem ( pprust:: path_to_string ( & meta. path ) ) , 
802-                         ) ; 
751+                         sess. emit_err ( session_diagnostics:: MultipleItem  { 
752+                             span :  meta. span , 
753+                             item :  pprust:: path_to_string ( & meta. path ) , 
754+                         } ) ; 
803755                        return  false ; 
804756                    } 
805757                    if  let  Some ( v)  = meta. value_str ( )  { 
806758                        * item = Some ( v) ; 
807759                        true 
808760                    }  else  { 
809761                        if  let  Some ( lit)  = meta. name_value_literal ( )  { 
810-                             handle_errors ( 
811-                                 & sess. parse_sess , 
812-                                 lit. span , 
813-                                 AttrError :: UnsupportedLiteral ( 
814-                                     UnsupportedLiteralReason :: DeprecatedString , 
815-                                     lit. kind . is_bytestr ( ) , 
816-                                 ) , 
817-                             ) ; 
762+                             sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
763+                                 span :  lit. span , 
764+                                 reason :  UnsupportedLiteralReason :: DeprecatedString , 
765+                                 is_bytestr :  lit. kind . is_bytestr ( ) , 
766+                                 start_point_span :  sess. source_map ( ) . start_point ( lit. span ) , 
767+                             } ) ; 
818768                        }  else  { 
819769                            sess. emit_err ( session_diagnostics:: IncorrectMetaItem  { 
820770                                span :  meta. span , 
@@ -852,30 +802,25 @@ pub fn find_deprecation(
852802                                } 
853803                            } 
854804                            _ => { 
855-                                 handle_errors ( 
856-                                     & sess. parse_sess , 
857-                                     meta. span ( ) , 
858-                                     AttrError :: UnknownMetaItem ( 
859-                                         pprust:: path_to_string ( & mi. path ) , 
860-                                         if  features. deprecated_suggestion  { 
861-                                             & [ "since" ,  "note" ,  "suggestion" ] 
862-                                         }  else  { 
863-                                             & [ "since" ,  "note" ] 
864-                                         } , 
865-                                     ) , 
866-                                 ) ; 
805+                                 sess. emit_err ( session_diagnostics:: UnknownMetaItem  { 
806+                                     span :  meta. span ( ) , 
807+                                     item :  pprust:: path_to_string ( & mi. path ) , 
808+                                     expected :  if  features. deprecated_suggestion  { 
809+                                         & [ "since" ,  "note" ,  "suggestion" ] 
810+                                     }  else  { 
811+                                         & [ "since" ,  "note" ] 
812+                                     } , 
813+                                 } ) ; 
867814                                continue  ' outer; 
868815                            } 
869816                        } , 
870817                        NestedMetaItem :: Lit ( lit)  => { 
871-                             handle_errors ( 
872-                                 & sess. parse_sess , 
873-                                 lit. span , 
874-                                 AttrError :: UnsupportedLiteral ( 
875-                                     UnsupportedLiteralReason :: DeprecatedKvPair , 
876-                                     false , 
877-                                 ) , 
878-                             ) ; 
818+                             sess. emit_err ( session_diagnostics:: UnsupportedLiteral  { 
819+                                 span :  lit. span , 
820+                                 reason :  UnsupportedLiteralReason :: DeprecatedKvPair , 
821+                                 is_bytestr :  false , 
822+                                 start_point_span :  sess. source_map ( ) . start_point ( lit. span ) , 
823+                             } ) ; 
879824                            continue  ' outer; 
880825                        } 
881826                    } 
@@ -885,7 +830,7 @@ pub fn find_deprecation(
885830
886831        if  is_rustc { 
887832            if  since. is_none ( )  { 
888-                 handle_errors ( & sess. parse_sess ,   attr. span ,   AttrError :: MissingSince ) ; 
833+                 sess. emit_err ( session_diagnostics :: MissingSince   {   span :   attr. span   } ) ; 
889834                continue ; 
890835            } 
891836
0 commit comments