File tree Expand file tree Collapse file tree 4 files changed +34
-0
lines changed Expand file tree Collapse file tree 4 files changed +34
-0
lines changed Original file line number Diff line number Diff line change @@ -195,6 +195,9 @@ pub trait Emitter {
195
195
196
196
fn emit_future_breakage_report ( & mut self , _diags : Vec < ( FutureBreakage , Diagnostic ) > ) { }
197
197
198
+ /// Emit list of unused externs
199
+ fn emit_unused_externs ( & mut self , _unused_externs : & [ & str ] ) { }
200
+
198
201
/// Checks if should show explanations about "rustc --explain"
199
202
fn should_show_explain ( & self ) -> bool {
200
203
true
Original file line number Diff line number Diff line change @@ -159,6 +159,19 @@ impl Emitter for JsonEmitter {
159
159
}
160
160
}
161
161
162
+ fn emit_unused_externs ( & mut self , unused_externs : & [ & str ] ) {
163
+ let data = UnusedExterns { unused_extern_names : unused_externs } ;
164
+ let result = if self . pretty {
165
+ writeln ! ( & mut self . dst, "{}" , as_pretty_json( & data) )
166
+ } else {
167
+ writeln ! ( & mut self . dst, "{}" , as_json( & data) )
168
+ }
169
+ . and_then ( |_| self . dst . flush ( ) ) ;
170
+ if let Err ( e) = result {
171
+ panic ! ( "failed to print unused externs: {:?}" , e) ;
172
+ }
173
+ }
174
+
162
175
fn source_map ( & self ) -> Option < & Lrc < SourceMap > > {
163
176
Some ( & self . sm )
164
177
}
@@ -322,6 +335,12 @@ struct FutureIncompatReport {
322
335
future_incompat_report : Vec < FutureBreakageItem > ,
323
336
}
324
337
338
+ #[ derive( Encodable ) ]
339
+ struct UnusedExterns < ' a , ' b > {
340
+ /// List of unused externs by their names.
341
+ unused_extern_names : & ' a [ & ' b str ] ,
342
+ }
343
+
325
344
impl Diagnostic {
326
345
fn from_errors_diagnostic ( diag : & crate :: Diagnostic , je : & JsonEmitter ) -> Diagnostic {
327
346
let sugg = diag. suggestions . iter ( ) . map ( |sugg| Diagnostic {
Original file line number Diff line number Diff line change @@ -767,6 +767,10 @@ impl Handler {
767
767
self . inner . borrow_mut ( ) . emitter . emit_future_breakage_report ( diags)
768
768
}
769
769
770
+ pub fn emit_unused_externs ( & self , unused_externs : & [ & str ] ) {
771
+ self . inner . borrow_mut ( ) . emit_unused_externs ( unused_externs)
772
+ }
773
+
770
774
pub fn delay_as_bug ( & self , diagnostic : Diagnostic ) {
771
775
self . inner . borrow_mut ( ) . delay_as_bug ( diagnostic)
772
776
}
@@ -841,6 +845,10 @@ impl HandlerInner {
841
845
self . emitter . emit_artifact_notification ( path, artifact_type) ;
842
846
}
843
847
848
+ fn emit_unused_externs ( & mut self , unused_externs : & [ & str ] ) {
849
+ self . emitter . emit_unused_externs ( unused_externs) ;
850
+ }
851
+
844
852
fn treat_err_as_bug ( & self ) -> bool {
845
853
self . flags . treat_err_as_bug . map_or ( false , |c| self . err_count ( ) >= c. get ( ) )
846
854
}
Original file line number Diff line number Diff line change @@ -893,6 +893,7 @@ impl<'a> CrateLoader<'a> {
893
893
fn report_unused_deps ( & mut self , krate : & ast:: Crate ) {
894
894
// Make a point span rather than covering the whole file
895
895
let span = krate. span . shrink_to_lo ( ) ;
896
+ let mut unused_externs = Vec :: new ( ) ;
896
897
// Complain about anything left over
897
898
for ( name, entry) in self . sess . opts . externs . iter ( ) {
898
899
if let ExternLocation :: FoundInLibrarySearchDirectories = entry. location {
@@ -917,6 +918,7 @@ impl<'a> CrateLoader<'a> {
917
918
)
918
919
}
919
920
} ;
921
+ unused_externs. push ( name as & str ) ;
920
922
self . sess . parse_sess . buffer_lint_with_diagnostic (
921
923
lint:: builtin:: UNUSED_CRATE_DEPENDENCIES ,
922
924
span,
@@ -929,6 +931,8 @@ impl<'a> CrateLoader<'a> {
929
931
diag,
930
932
) ;
931
933
}
934
+ // FIXME: add gating
935
+ self . sess . parse_sess . span_diagnostic . emit_unused_externs ( & unused_externs) ;
932
936
}
933
937
934
938
pub fn postprocess ( & mut self , krate : & ast:: Crate ) {
You can’t perform that action at this time.
0 commit comments