The resolver gathers a list of possibly unused trait imports in maybe_unused_trait_imports. This list is passed to resolver outputs, into the maybe_unused_trait_import query. This query takes a LocalDefId and returns whether the import is possibly unused.
This is used by the post-typeck unused import check in rustc_typeck::check_unused. This query iterates over all the use statements in the crate, checks whether they may be unused trait imports, and warns if they are indeed unused.
As there are typically very few unused trait imports compared to the number of items in a crate, it would make sense to directly iterate on maybe_unused_trait_imports.
Steps:
- make
maybe_unused_trait_imports an FxIndexSet both in Resolver and ResolverOutputs, this will ensure a deterministic iteration order;
- rename
maybe_unused_trait_import query and give it the signature maybe_unused_trait_imports: () -> FxIndexSet<LocalDefId>, and adapt the call site; we do not want to access tcx.resolutions(()) directly, as this would prevent the query system from detecting that the set has not changed;
- in
rustc_typeck::check_unused::check_crate, inline check_import and replace the loop over tcx.hir().items by a loop over tcx.maybe_unused_trait_imports(());
- the filter over
tcx.def_kind there can be removed too (or replaced by a debug-assertion): the set may only point to use statements.
Extra:
- investigate why we check for
item.span.is_empty(), and the consequences of removing that check;
- investigate the impact on perf of converting the
FxIndexSet to a simple Vec when producing ResolverOutputs from Resolver.
I am available on Zulip for any question.
The resolver gathers a list of possibly unused trait imports in
maybe_unused_trait_imports. This list is passed to resolver outputs, into themaybe_unused_trait_importquery. This query takes aLocalDefIdand returns whether the import is possibly unused.This is used by the post-typeck unused import check in
rustc_typeck::check_unused. This query iterates over all theusestatements in the crate, checks whether they may be unused trait imports, and warns if they are indeed unused.As there are typically very few unused trait imports compared to the number of items in a crate, it would make sense to directly iterate on
maybe_unused_trait_imports.Steps:
maybe_unused_trait_importsanFxIndexSetboth inResolverandResolverOutputs, this will ensure a deterministic iteration order;maybe_unused_trait_importquery and give it the signaturemaybe_unused_trait_imports: () -> FxIndexSet<LocalDefId>, and adapt the call site; we do not want to accesstcx.resolutions(())directly, as this would prevent the query system from detecting that the set has not changed;rustc_typeck::check_unused::check_crate, inlinecheck_importand replace the loop overtcx.hir().itemsby a loop overtcx.maybe_unused_trait_imports(());tcx.def_kindthere can be removed too (or replaced by a debug-assertion): the set may only point to use statements.Extra:
item.span.is_empty(), and the consequences of removing that check;FxIndexSetto a simpleVecwhen producingResolverOutputsfromResolver.I am available on Zulip for any question.