fixes #121331
This commit is contained in:
parent
5a6c1aa2bc
commit
1a81a941ad
17 changed files with 269 additions and 42 deletions
|
@ -23,18 +23,19 @@
|
|||
// - `check_unused` finally emits the diagnostics based on the data generated
|
||||
// in the last step
|
||||
|
||||
use crate::imports::ImportKind;
|
||||
use crate::imports::{Import, ImportKind};
|
||||
use crate::module_to_string;
|
||||
use crate::Resolver;
|
||||
|
||||
use crate::NameBindingKind;
|
||||
use crate::{LexicalScopeBinding, NameBindingKind};
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::visit::{self, Visitor};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap, FxIndexSet};
|
||||
use rustc_data_structures::unord::UnordSet;
|
||||
use rustc_errors::{pluralize, MultiSpan};
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_session::lint::builtin::{MACRO_USE_EXTERN_CRATE, UNUSED_EXTERN_CRATES, UNUSED_IMPORTS};
|
||||
use rustc_session::lint::builtin::{MACRO_USE_EXTERN_CRATE, UNUSED_EXTERN_CRATES};
|
||||
use rustc_session::lint::builtin::{UNUSED_IMPORTS, UNUSED_QUALIFICATIONS};
|
||||
use rustc_session::lint::BuiltinLintDiag;
|
||||
use rustc_span::symbol::{kw, Ident};
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
|
@ -514,8 +515,59 @@ impl Resolver<'_, '_> {
|
|||
}
|
||||
}
|
||||
|
||||
let mut redundant_imports = UnordSet::default();
|
||||
for import in check_redundant_imports {
|
||||
self.check_for_redundant_imports(import);
|
||||
if self.check_for_redundant_imports(import)
|
||||
&& let Some(id) = import.id()
|
||||
{
|
||||
redundant_imports.insert(id);
|
||||
}
|
||||
}
|
||||
|
||||
// The lint fixes for unused_import and unnecessary_qualification may conflict.
|
||||
// Deleting both unused imports and unnecessary segments of an item may result
|
||||
// in the item not being found.
|
||||
for unn_qua in &self.potentially_unnecessary_qualifications {
|
||||
if let LexicalScopeBinding::Item(name_binding) = unn_qua.binding
|
||||
&& let NameBindingKind::Import { import, .. } = name_binding.kind
|
||||
&& (is_unused_import(import, &unused_imports)
|
||||
|| is_redundant_import(import, &redundant_imports))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
self.lint_buffer.buffer_lint_with_diagnostic(
|
||||
UNUSED_QUALIFICATIONS,
|
||||
unn_qua.node_id,
|
||||
unn_qua.path_span,
|
||||
"unnecessary qualification",
|
||||
BuiltinLintDiag::UnusedQualifications { removal_span: unn_qua.removal_span },
|
||||
);
|
||||
}
|
||||
|
||||
fn is_redundant_import(
|
||||
import: Import<'_>,
|
||||
redundant_imports: &UnordSet<ast::NodeId>,
|
||||
) -> bool {
|
||||
if let Some(id) = import.id()
|
||||
&& redundant_imports.contains(&id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn is_unused_import(
|
||||
import: Import<'_>,
|
||||
unused_imports: &FxIndexMap<ast::NodeId, UnusedImport>,
|
||||
) -> bool {
|
||||
if let Some(unused_import) = unused_imports.get(&import.root_id)
|
||||
&& let Some(id) = import.id()
|
||||
&& unused_import.unused.contains(&id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue