]>
Commit | Line | Data |
---|---|---|
2b03887a | 1 | use rustc_data_structures::unord::UnordSet; |
04454e1e | 2 | use rustc_hir::def::DefKind; |
9ffffee4 | 3 | use rustc_hir::def_id::LocalDefId; |
ba9703b0 XL |
4 | use rustc_middle::ty::TyCtxt; |
5 | use rustc_session::lint; | |
94b46f34 | 6 | |
416331ca | 7 | pub fn check_crate(tcx: TyCtxt<'_>) { |
2b03887a | 8 | let mut used_trait_imports: UnordSet<LocalDefId> = Default::default(); |
04454e1e | 9 | |
c295e0f8 | 10 | for item_def_id in tcx.hir().body_owners() { |
f9f354fc | 11 | let imports = tcx.used_trait_imports(item_def_id); |
94b46f34 | 12 | debug!("GatherVisitor: item_def_id={:?} with imports {:#?}", item_def_id, imports); |
353b0b11 | 13 | used_trait_imports.extend_unord(imports.items().copied()); |
94b46f34 XL |
14 | } |
15 | ||
923072b8 FG |
16 | for &id in tcx.maybe_unused_trait_imports(()) { |
17 | debug_assert_eq!(tcx.def_kind(id), DefKind::Use); | |
18 | if tcx.visibility(id).is_public() { | |
19 | continue; | |
20 | } | |
21 | if used_trait_imports.contains(&id) { | |
22 | continue; | |
23 | } | |
24 | let item = tcx.hir().expect_item(id); | |
25 | if item.span.is_dummy() { | |
26 | continue; | |
94b46f34 | 27 | } |
9ffffee4 | 28 | let (path, _) = item.expect_use(); |
2b03887a FG |
29 | let msg = if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(path.span) { |
30 | format!("unused import: `{}`", snippet) | |
31 | } else { | |
32 | "unused import".to_owned() | |
33 | }; | |
34 | tcx.struct_span_lint_hir( | |
35 | lint::builtin::UNUSED_IMPORTS, | |
36 | item.hir_id(), | |
37 | path.span, | |
38 | msg, | |
39 | |lint| lint, | |
40 | ); | |
94b46f34 | 41 | } |
94b46f34 | 42 | } |