This cargo subcommand tries to detect pub
methods that are unused in an entire workspace, by performing workspace-wide analysis.
The dead_code
Rust compiler lint ignores pub
methods, given that:
- The linter operates crate-by-crate.
- Unused
pub
methods could be used in another workspace crate, or be part of a public API.
See also the following discussions about this problem:
- rust-lang/rust-clippy#5828 (closed as Clippy does not perform workspace-level analyses).
- https://users.rust-lang.org/t/would-pub-workspace-be-possible/105503/2
$ cargo workspace-unused-pub --help
Detect unused pub methods in a workspace
Usage: cargo workspace-unused-pub [OPTIONS] [WORKSPACE]
Arguments:
[WORKSPACE] [default: current workspace]
Options:
--scip <SCIP>
--extensions <EXTENSIONS> [default: rs,html]
-h, --help Print help
-V, --version Print version
Detection is performed in multiple phases:
-
Open an SCIP code index, or generate one with rust-analyzer.
Opened SCIP file with 806 documents
Note that the index generation can take a significant amount of time on large workspaces.
-
Record methods and traits declarations.
Found 6722 declarations and 286 traits
-
Phase 1: Find all methods that are seem never used. The following phases aim at removing false positives.
Pass 1: 1419 candidates
-
Phase 2: Remove false positives stemming from
main
, tests and trait methods.Pass 2 (mains, tests, trait methods): 189 candidates
-
Phase 3: Perform a text search to remove false positives due to e.g. use in HTML templates:
Pass 3 (search): 43 candidates Found 43 possibly unused functions
The extensions that are searched are defined by the
--extensions
flag.
The output of each phase (in the format above) can be viewed by setting the RUST_LOG=debug
environment variable.
- https://github.com/est31/warnalyzer, which relied on the removed nightly
save-analysis
feature, and therefore requires an older nightly compiler. See est31/warnalyzer#9
- Automatically remove the unused functions (assuming a clean git repository is found).
- Build an approximate SCIP index with tree-sitter instead of rust-analyzer, for faster execution (e.g. in CI).
- Allow ignoring false positives with a special code comment or attribute.
- Support other objects than only methods (e.g. constants).
- Robustify the detection of test/main functions.