@@ -14,6 +14,8 @@ use rustc_span::hygiene::Transparency;
1414use rustc_span:: { symbol:: sym, symbol:: Symbol , Span } ;
1515use std:: num:: NonZeroU32 ;
1616
17+ use crate :: session_diagnostics;
18+
1719pub fn is_builtin_attr ( attr : & Attribute ) -> bool {
1820 attr. is_doc_comment ( ) || attr. ident ( ) . filter ( |ident| is_builtin_attr_name ( ident. name ) ) . is_some ( )
1921}
@@ -25,46 +27,38 @@ enum AttrError {
2527 NonIdentFeature ,
2628 MissingFeature ,
2729 MultipleStabilityLevels ,
28- UnsupportedLiteral ( & ' static str , /* is_bytestr */ bool ) ,
30+ UnsupportedLiteral ( UnsupportedLiteralReason , /* is_bytestr */ bool ) ,
31+ }
32+
33+ pub ( crate ) enum UnsupportedLiteralReason {
34+ Generic ,
35+ CfgString ,
36+ DeprecatedString ,
37+ DeprecatedKvPair ,
2938}
3039
3140fn handle_errors ( sess : & ParseSess , span : Span , error : AttrError ) {
32- let diag = & sess. span_diagnostic ;
3341 match error {
3442 AttrError :: MultipleItem ( item) => {
35- struct_span_err ! ( diag , span , E0538 , "multiple '{}' items" , item) . emit ( ) ;
43+ sess . emit_err ( session_diagnostics :: MultipleItem { span , item } ) ;
3644 }
3745 AttrError :: UnknownMetaItem ( item, expected) => {
38- let expected = expected. iter ( ) . map ( |name| format ! ( "`{}`" , name) ) . collect :: < Vec < _ > > ( ) ;
39- struct_span_err ! ( diag, span, E0541 , "unknown meta item '{}'" , item)
40- . span_label ( span, format ! ( "expected one of {}" , expected. join( ", " ) ) )
41- . emit ( ) ;
46+ sess. emit_err ( session_diagnostics:: UnknownMetaItem { span, item, expected } ) ;
4247 }
4348 AttrError :: MissingSince => {
44- struct_span_err ! ( diag , span, E0542 , "missing 'since'" ) . emit ( ) ;
49+ sess . emit_err ( session_diagnostics :: MissingSince { span } ) ;
4550 }
4651 AttrError :: NonIdentFeature => {
47- struct_span_err ! ( diag , span, E0546 , "'feature' is not an identifier" ) . emit ( ) ;
52+ sess . emit_err ( session_diagnostics :: NonIdentFeature { span } ) ;
4853 }
4954 AttrError :: MissingFeature => {
50- struct_span_err ! ( diag , span, E0546 , "missing 'feature'" ) . emit ( ) ;
55+ sess . emit_err ( session_diagnostics :: MissingFeature { span } ) ;
5156 }
5257 AttrError :: MultipleStabilityLevels => {
53- struct_span_err ! ( diag , span, E0544 , "multiple stability levels" ) . emit ( ) ;
58+ sess . emit_err ( session_diagnostics :: MultipleStabilityLevels { span } ) ;
5459 }
55- AttrError :: UnsupportedLiteral ( msg, is_bytestr) => {
56- let mut err = struct_span_err ! ( diag, span, E0565 , "{}" , msg) ;
57- if is_bytestr {
58- if let Ok ( lint_str) = sess. source_map ( ) . span_to_snippet ( span) {
59- err. span_suggestion (
60- span,
61- "consider removing the prefix" ,
62- & lint_str[ 1 ..] ,
63- Applicability :: MaybeIncorrect ,
64- ) ;
65- }
66- }
67- err. emit ( ) ;
60+ AttrError :: UnsupportedLiteral ( reason, is_bytestr) => {
61+ sess. emit_err ( session_diagnostics:: UnsupportedLiteral { span, reason, is_bytestr } ) ;
6862 }
6963 }
7064}
@@ -326,7 +320,7 @@ where
326320 handle_errors (
327321 & sess. parse_sess ,
328322 meta. span ( ) ,
329- AttrError :: UnsupportedLiteral ( "unsupported literal" , false ) ,
323+ AttrError :: UnsupportedLiteral ( UnsupportedLiteralReason :: Generic , false ) ,
330324 ) ;
331325 continue ' outer;
332326 } ;
@@ -494,7 +488,10 @@ where
494488 handle_errors (
495489 & sess. parse_sess ,
496490 lit. span ,
497- AttrError :: UnsupportedLiteral ( "unsupported literal" , false ) ,
491+ AttrError :: UnsupportedLiteral (
492+ UnsupportedLiteralReason :: Generic ,
493+ false ,
494+ ) ,
498495 ) ;
499496 continue ' outer;
500497 }
@@ -711,7 +708,7 @@ pub fn eval_condition(
711708 handle_errors (
712709 sess,
713710 mi. span ( ) ,
714- AttrError :: UnsupportedLiteral ( "unsupported literal" , false ) ,
711+ AttrError :: UnsupportedLiteral ( UnsupportedLiteralReason :: Generic , false ) ,
715712 ) ;
716713 return false ;
717714 }
@@ -790,7 +787,7 @@ pub fn eval_condition(
790787 sess,
791788 lit. span ,
792789 AttrError :: UnsupportedLiteral (
793- "literal in `cfg` predicate value must be a string" ,
790+ UnsupportedLiteralReason :: CfgString ,
794791 lit. kind . is_bytestr ( ) ,
795792 ) ,
796793 ) ;
@@ -870,8 +867,7 @@ where
870867 & sess. parse_sess ,
871868 lit. span ,
872869 AttrError :: UnsupportedLiteral (
873- "literal in `deprecated` \
874- value must be a string",
870+ UnsupportedLiteralReason :: DeprecatedString ,
875871 lit. kind . is_bytestr ( ) ,
876872 ) ,
877873 ) ;
@@ -934,7 +930,7 @@ where
934930 & sess. parse_sess ,
935931 lit. span ,
936932 AttrError :: UnsupportedLiteral (
937- "item in `deprecated` must be a key/value pair" ,
933+ UnsupportedLiteralReason :: DeprecatedKvPair ,
938934 false ,
939935 ) ,
940936 ) ;
0 commit comments