MCP for this feature: #303

The unused-extern-crates lint reports when a crate was specified on the rustc command-line with --extern name=path but no symbols were referenced in it. This is useful to know, but it's hard to map that back to a specific place a user or tool could fix (ie, to remove the unused dependency).

The --extern-location flag allows the build system to associate a location with the --extern option, which is then emitted as part of the diagnostics. This location is abstract and just round-tripped through rustc; the compiler never attempts to interpret it in any way.

There are two supported forms of location: a bare string, or a blob of json:

  • --extern-location foo=raw:Makefile:123 would associate the raw string Makefile:123
  • --extern-location 'bar=json:{"target":"//my_project:library","dep":"//common:serde"} would associate the json structure with --extern bar=<path>, indicating which dependency of which rule introduced the unused extern crate.

This primarily intended to be used with tooling - for example a linter which can automatically remove unused dependencies - rather than being directly presented to users.

raw locations are presented as part of the normal rendered diagnostics and included in the json form. json locations are only included in the json form of diagnostics, as a tool_metadata field. For raw locations tool_metadata is simply a json string, whereas json allows the rustc invoker to fully control its form and content.