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