aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-12-31 15:29:26 +0000
committerGitHub <[email protected]>2020-12-31 15:29:26 +0000
commita485c9b21dd927beee3dde5ac9ed56f61806cf55 (patch)
tree037222e02904cb28f793721da4f9ebc6320ffed5
parent0a3d08e2e3fa447de70e6a7d8c07bc11cf23f5c4 (diff)
parent7b3b0bad1fe992441ae1c954ac63528d600a5ce4 (diff)
Merge #7071
7071: Pass --all-targets to "cargo check" when discovering external resources r=matklad a=WasabiFan There is a repro case and background in the linked issue. In short, the goal of this MR is to allow rust-analyzer to discover proc-macros which come from your tests (including, most importantly, dev-dependencies). By default, `cargo check` implies the equivalent of `--lib --bins`, meaning it'll check your libraries and binaries -- but not tests! This means proc-macros (or, I guess, build scripts as well) weren't discovered by rust-analyzer if they came from tests. One solution would be to manually add `--lib --bins --tests` (i.e., just augment the effective options to include tests). However, in this MR, I threw in `--all-targets`, which [according to the docs](https://doc.rust-lang.org/cargo/commands/cargo-check.html#target-selection) implies `--benches --examples` too. I have absolutely no idea what repercussions that will have on rust-analyzer for other projects, nor do I know if it's a problem that build scripts will now be discovered for tests/examples/benches. But I am not aware of a reason you _wouldn't_ want to discover these things in your examples too. I think the main drawback of this change is that it will likely slow down the `cargo check`. At a minimum, it'll now be checking your tests _and_ their dependencies. The `cargo check` docs also say that including `--tests` as I have here may cause your lib crate to be built _twice_, once for the normal target and again for unit tests. My reading of that caveat suggests that "building twice" means it's built once for the tests _inside_ your lib, with a test profile, and again for any consumers of your lib, now using a normal release profile or similar. This doesn't seem surprising. Very minor caveat: `--tests` will not include tests within a binary if it has `test = false` set in `Cargo.toml`. (I discovered this manually by trial-and-error, but hey, it actually says that in the docs!) This is likely not an issue, but _does_ mean that if you are -- for whatever reason -- disabling tests like that and then manually specifying `cargo test --package <...> --bin <...>` to run them, rust-analyzer will remain unaware of proc-macros in your tests. I have confirmed this fixes the original issue in my sandbox example linked in #7034 and in my own project in which I originally discovered this. I've left it configured as my default RA language server and will report back if I notice any unexpected side-effects. Fixes #7034 Co-authored-by: Kaelin Laundry <[email protected]>
-rw-r--r--crates/project_model/src/cargo_workspace.rs5
1 files changed, 5 insertions, 0 deletions
diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs
index b991b59a6..1700cb8a7 100644
--- a/crates/project_model/src/cargo_workspace.rs
+++ b/crates/project_model/src/cargo_workspace.rs
@@ -350,6 +350,11 @@ pub(crate) fn load_extern_resources(
350 let mut cmd = Command::new(toolchain::cargo()); 350 let mut cmd = Command::new(toolchain::cargo());
351 cmd.args(&["check", "--message-format=json", "--manifest-path"]).arg(cargo_toml); 351 cmd.args(&["check", "--message-format=json", "--manifest-path"]).arg(cargo_toml);
352 352
353 // --all-targets includes tests, benches and examples in addition to the
354 // default lib and bins. This is an independent concept from the --targets
355 // flag below.
356 cmd.arg("--all-targets");
357
353 if let Some(target) = &cargo_features.target { 358 if let Some(target) = &cargo_features.target {
354 cmd.args(&["--target", target]); 359 cmd.args(&["--target", target]);
355 } 360 }