66
77use rustc_ast:: { Attribute , MetaItemKind } ;
88use rustc_attr:: { rust_version_symbol, VERSION_PLACEHOLDER } ;
9- use rustc_errors:: struct_span_err;
109use rustc_hir:: intravisit:: Visitor ;
1110use rustc_middle:: hir:: nested_filter;
1211use rustc_middle:: middle:: lib_features:: LibFeatures ;
@@ -15,6 +14,8 @@ use rustc_middle::ty::TyCtxt;
1514use rustc_span:: symbol:: Symbol ;
1615use rustc_span:: { sym, Span } ;
1716
17+ use crate :: errors:: { FeaturePreviouslyDeclared , FeatureStableTwice } ;
18+
1819fn new_lib_features ( ) -> LibFeatures {
1920 LibFeatures { stable : Default :: default ( ) , unstable : Default :: default ( ) }
2021}
@@ -92,14 +93,12 @@ impl<'tcx> LibFeatureCollector<'tcx> {
9293 ( Some ( since) , _, false ) => {
9394 if let Some ( ( prev_since, _) ) = self . lib_features . stable . get ( & feature) {
9495 if * prev_since != since {
95- self . span_feature_error (
96+ self . tcx . sess . emit_err ( FeatureStableTwice {
9697 span,
97- & format ! (
98- "feature `{}` is declared stable since {}, \
99- but was previously declared stable since {}",
100- feature, since, prev_since,
101- ) ,
102- ) ;
98+ feature,
99+ since,
100+ prev_since : * prev_since,
101+ } ) ;
103102 return ;
104103 }
105104 }
@@ -110,22 +109,17 @@ impl<'tcx> LibFeatureCollector<'tcx> {
110109 self . lib_features . unstable . insert ( feature, span) ;
111110 }
112111 ( Some ( _) , _, true ) | ( None , true , _) => {
113- self . span_feature_error (
112+ let declared = if since. is_some ( ) { "stable" } else { "unstable" } ;
113+ let prev_declared = if since. is_none ( ) { "stable" } else { "unstable" } ;
114+ self . tcx . sess . emit_err ( FeaturePreviouslyDeclared {
114115 span,
115- & format ! (
116- "feature `{}` is declared {}, but was previously declared {}" ,
117- feature,
118- if since. is_some( ) { "stable" } else { "unstable" } ,
119- if since. is_none( ) { "stable" } else { "unstable" } ,
120- ) ,
121- ) ;
116+ feature,
117+ declared,
118+ prev_declared,
119+ } ) ;
122120 }
123121 }
124122 }
125-
126- fn span_feature_error ( & self , span : Span , msg : & str ) {
127- struct_span_err ! ( self . tcx. sess, span, E0711 , "{}" , & msg) . emit ( ) ;
128- }
129123}
130124
131125impl < ' tcx > Visitor < ' tcx > for LibFeatureCollector < ' tcx > {
0 commit comments