rust/compiler
Dylan DPC a1c34493d4
Rollup merge of #73945 - est31:unused_externs, r=Mark-Simulacrum
Add an unstable --json=unused-externs flag to print unused externs

This adds an unstable flag to print a list of the extern names not used by cargo.

This PR will enable cargo to collect unused dependencies from all units and provide warnings.
The companion PR to cargo is: https://github.com/rust-lang/cargo/pull/8437

The goal is eventual stabilization of this flag in rustc as well as in cargo.

Discussion of this feature is mostly contained inside these threads: #57274 #72342 #72603

The feature builds upon the internal datastructures added by #72342

Externs are uniquely identified by name and the information is sufficient for cargo.
If the mode is enabled, rustc will print json messages like:

```
{"unused_extern_names":["byteorder","openssl","webpki"]}
```

For a crate that got passed byteorder, openssl and webpki dependencies but needed none of them.

### Q: Why not pass -Wunused-crate-dependencies?
A: See [ehuss's comment here](https://github.com/rust-lang/rust/issues/57274#issuecomment-624839355)
   TLDR: it's cleaner. Rust's warning system wasn't built to be filtered or edited by cargo.
   Even a basic implementation of the feature would have to change the "n warnings emitted" line that rustc prints at the end.
   Cargo ideally wants to synthesize its own warnings anyways. For example, it would be hard for rustc to emit warnings like
   "dependency foo is only used by dev targets", suggesting to make it a dev-dependency instead.

### Q: Make rustc emit used or unused externs?
A: Emitting used externs has the advantage that it simplifies cargo's collection job.
   However, emitting unused externs creates less data to be communicated between rustc and cargo.
   Often you want to paste a cargo command obtained from `cargo build -vv` for doing something
   completely unrelated. The message is emitted always, even if no warning or error is emitted.
   At that point, even this tiny difference in "noise" matters. That's why I went with emitting unused externs.

### Q: One json msg per extern or a collective json msg?
A: Same as above, the data format should be concise. Having 30 lines for the 30 crates a crate uses would be disturbing to readers.
   Also it helps the cargo implementation to know that there aren't more unused deps coming.

### Q: Why use names of externs instead of e.g. paths?
A: Names are both sufficient as well as neccessary to uniquely identify a passed `--extern` arg.
   Names are sufficient because you *must* pass a name when passing an `--extern` arg.
   Passing a path is optional on the other hand so rustc might also figure out a crate's location from the file system.
   You can also put multiple paths for the same extern name, via e.g. `--extern hello=/usr/lib/hello.rmeta --extern hello=/usr/local/lib/hello.rmeta`,
   but rustc will only ever use one of those paths.
   Also, paths don't identify a dependency uniquely as it is possible to have multiple different extern names point to the same path.
   So paths are ill-suited for identification.

### Q: What about 2015 edition crates?
A: They are fully supported.
   Even on the 2015 edition, an explicit `--extern` flag is is required to enable `extern crate foo;` to work (outside of sysroot crates, which this flag doesn't warn about anyways).
   So the lint would still fire on 2015 edition crates if you haven't included a dependency specified in Cargo.toml using `extern crate foo;` or similar.
   The lint won't fire if your sole use in the crate is through a `extern crate foo;`   statement, but that's not its job.
   For detecting unused `extern crate foo` statements, there is the `unused_extern_crates` lint
   which can be enabled by `#![warn(unused_extern_crates)]` or similar.

cc ```@jsgf``` ```@ehuss``` ```@petrochenkov``` ```@estebank```
2021-04-04 19:19:58 +02:00
..
rustc Rollup merge of #82642 - sfackler:jemalloc-zone, r=pnkfelix 2021-03-08 13:13:22 +01:00
rustc_apfloat Use iter::zip in compiler/ 2021-03-26 09:32:31 -07:00
rustc_arena Remove (lots of) dead code 2021-03-27 22:16:33 -04:00
rustc_ast Remove (lots of) dead code 2021-03-27 22:16:33 -04:00
rustc_ast_lowering Remove hir::CrateItem. 2021-03-30 20:31:06 +02:00
rustc_ast_passes Auto merge of #80965 - camelid:rename-doc-spotlight, r=jyn514 2021-04-02 07:04:58 +00:00
rustc_ast_pretty Remove (lots of) dead code 2021-03-27 22:16:33 -04:00
rustc_attr stabilize or_patterns 2021-03-19 19:45:32 -05:00
rustc_builtin_macros Use iter::zip in compiler/ 2021-03-26 09:32:31 -07:00
rustc_codegen_cranelift Add an Mmap wrapper to rustc_data_structures 2021-03-30 18:57:03 +02:00
rustc_codegen_llvm Auto merge of #83774 - richkadel:zero-based-counters, r=tmandry 2021-04-03 06:27:03 +00:00
rustc_codegen_ssa Auto merge of #83811 - JohnTitor:rollup-hnw1xwz, r=JohnTitor 2021-04-03 23:17:58 +00:00
rustc_data_structures Auto merge of #83682 - bjorn3:mmap_wrapper, r=cjgillot 2021-04-03 13:23:42 +00:00
rustc_driver Address review comments 2021-03-27 22:16:34 -04:00
rustc_error_codes progress, stuff compiles now 2021-03-23 17:16:20 +00:00
rustc_errors Rollup merge of #73945 - est31:unused_externs, r=Mark-Simulacrum 2021-04-04 19:19:58 +02:00
rustc_expand address comments 2021-04-02 08:08:02 +08:00
rustc_feature Auto merge of #80965 - camelid:rename-doc-spotlight, r=jyn514 2021-04-02 07:04:58 +00:00
rustc_fs_util Optimize away a fs::metadata call. 2021-01-06 08:33:15 -08:00
rustc_graphviz Remove (lots of) dead code 2021-03-27 22:16:33 -04:00
rustc_hir Auto merge of #83599 - jyn514:unorderable, r=Aaron1011 2021-04-03 04:11:35 +00:00
rustc_hir_pretty Remove hir::CrateItem. 2021-03-30 20:31:06 +02:00
rustc_incremental Also profile finishing the encoding. 2021-03-30 18:10:08 +02:00
rustc_index Add fixme comment to revert change once const_panic is stable 2021-04-03 13:07:03 +02:00
rustc_infer Auto merge of #83207 - oli-obk:valtree2, r=lcnr 2021-04-02 10:28:12 +00:00
rustc_interface Rollup merge of #73945 - est31:unused_externs, r=Mark-Simulacrum 2021-04-04 19:19:58 +02:00
rustc_lexer Return EOF_CHAR constant instead of magic char. 2021-01-07 13:20:04 +01:00
rustc_lint add OR_PATTERNS_BACK_COMPAT lint 2021-04-01 23:14:14 +08:00
rustc_lint_defs Fix rustc_lint_defs documentation typo 2021-04-03 12:00:28 -03:00
rustc_llvm Auto merge of #83387 - cuviper:min-llvm-10, r=nagisa 2021-03-25 13:11:18 +00:00
rustc_macros Use iter::zip in compiler/ 2021-03-26 09:32:31 -07:00
rustc_metadata Rollup merge of #73945 - est31:unused_externs, r=Mark-Simulacrum 2021-04-04 19:19:58 +02:00
rustc_middle Auto merge of #83774 - richkadel:zero-based-counters, r=tmandry 2021-04-03 06:27:03 +00:00
rustc_mir Rollup merge of #83787 - digama0:patch-1, r=bjorn3 2021-04-04 00:19:38 +09:00
rustc_mir_build Auto merge of #83207 - oli-obk:valtree2, r=lcnr 2021-04-02 10:28:12 +00:00
rustc_parse Always preserve None-delimited groups in a captured TokenStream 2021-03-26 23:32:18 -04:00
rustc_parse_format Rollup merge of #83348 - osa1:issue83344, r=jackh726 2021-03-28 01:33:13 +09:00
rustc_passes Auto merge of #80965 - camelid:rename-doc-spotlight, r=jyn514 2021-04-02 07:04:58 +00:00
rustc_plugin_impl Remove hir::Item::attrs. 2021-03-09 19:27:50 +01:00
rustc_privacy Update with comments 2021-03-23 17:16:20 +00:00
rustc_query_impl Auto merge of #83207 - oli-obk:valtree2, r=lcnr 2021-04-02 10:28:12 +00:00
rustc_query_system Enable debugging the dep-graph without debug-assertions. 2021-03-31 17:12:06 +02:00
rustc_resolve Cleanups and comments 2021-03-31 10:16:37 -04:00
rustc_save_analysis Remove hir::CrateItem. 2021-03-30 20:31:06 +02:00
rustc_serialize Auto merge of #83465 - michaelwoerister:safe-read_raw_bytes, r=cjgillot 2021-03-26 01:28:59 +00:00
rustc_session Rollup merge of #73945 - est31:unused_externs, r=Mark-Simulacrum 2021-04-04 19:19:58 +02:00
rustc_span Auto merge of #80965 - camelid:rename-doc-spotlight, r=jyn514 2021-04-02 07:04:58 +00:00
rustc_symbol_mangling Add var to BoundRegion. Add query to get bound vars for applicable items. 2021-03-31 10:16:37 -04:00
rustc_target (De-)serialize the supported_sanitizers 2021-04-03 00:37:49 +03:00
rustc_trait_selection Rollup merge of #83673 - hi-rustin:rustin-patch-suggestion, r=estebank 2021-04-02 19:57:32 +02:00
rustc_traits Auto merge of #83207 - oli-obk:valtree2, r=lcnr 2021-04-02 10:28:12 +00:00
rustc_ty_utils Track bound vars 2021-03-31 10:15:27 -04:00
rustc_type_ir Remove nightly features in rustc_type_ir 2021-04-03 10:00:09 +02:00
rustc_typeck Auto merge of #83839 - ldm0:deref, r=petrochenkov 2021-04-04 11:15:17 +00:00