Closed
Description
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
anFxIndexSet
both inResolver
andResolverOutputs
, this will ensure a deterministic iteration order; - rename
maybe_unused_trait_import
query 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; - in
rustc_typeck::check_unused::check_crate
, inlinecheck_import
and replace the loop overtcx.hir().items
by a loop overtcx.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 simpleVec
when producingResolverOutputs
fromResolver
.
I am available on Zulip for any question.