Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #21964 from pratham-srivastava-07/pratham/cargo-meta
feat: cargo metadata takes extra args
Chayim Refael Friedman 6 weeks ago
parent 3e5f921 · parent 9513925 · commit 129f616
-rw-r--r--crates/project-model/src/cargo_workspace.rs5
-rw-r--r--crates/project-model/src/workspace.rs5
-rw-r--r--crates/rust-analyzer/src/config.rs4
-rw-r--r--docs/book/src/configuration_generated.md8
-rw-r--r--editors/code/package.json13
5 files changed, 35 insertions, 0 deletions
diff --git a/crates/project-model/src/cargo_workspace.rs b/crates/project-model/src/cargo_workspace.rs
index 792206b74f..5d8273832b 100644
--- a/crates/project-model/src/cargo_workspace.rs
+++ b/crates/project-model/src/cargo_workspace.rs
@@ -131,6 +131,8 @@ pub struct CargoConfig {
pub run_build_script_command: Option<Vec<String>>,
/// Extra args to pass to the cargo command.
pub extra_args: Vec<String>,
+ /// Extra args passed only to `cargo metadata`, not other cargo commands.
+ pub metadata_extra_args: Vec<String>,
/// Extra env vars to set when invoking the cargo command
pub extra_env: FxHashMap<String, Option<String>>,
pub invocation_strategy: InvocationStrategy,
@@ -320,6 +322,8 @@ pub struct CargoMetadataConfig {
pub targets: Vec<String>,
/// Extra args to pass to the cargo command.
pub extra_args: Vec<String>,
+ /// Extra args passed directly to `cargo metadata` without filtering.
+ pub metadata_extra_args: Vec<String>,
/// Extra env vars to set when invoking the cargo command
pub extra_env: FxHashMap<String, Option<String>>,
/// What kind of metadata are we fetching: workspace, rustc, or sysroot.
@@ -679,6 +683,7 @@ impl FetchMetadata {
other_options.push(arg.to_owned());
}
}
+ other_options.extend(config.metadata_extra_args.iter().cloned());
let mut lockfile_copy = None;
if cargo_toml.is_rust_manifest() {
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index 581b5fa514..29a19bc32e 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -216,6 +216,7 @@ impl ProjectWorkspace {
features,
rustc_source,
extra_args,
+ metadata_extra_args,
extra_env,
set_test,
cfg_overrides,
@@ -289,6 +290,7 @@ impl ProjectWorkspace {
features: features.clone(),
targets: targets.clone(),
extra_args: extra_args.clone(),
+ metadata_extra_args: metadata_extra_args.clone(),
extra_env: extra_env.clone(),
toolchain_version: toolchain.clone(),
kind: "workspace",
@@ -343,6 +345,7 @@ impl ProjectWorkspace {
features: crate::CargoFeatures::default(),
targets: targets.clone(),
extra_args: extra_args.clone(),
+ metadata_extra_args: metadata_extra_args.clone(),
extra_env: extra_env.clone(),
toolchain_version: toolchain.clone(),
kind: "rustc-dev"
@@ -575,6 +578,7 @@ impl ProjectWorkspace {
features: config.features.clone(),
targets,
extra_args: config.extra_args.clone(),
+ metadata_extra_args: config.metadata_extra_args.clone(),
extra_env: config.extra_env.clone(),
toolchain_version: toolchain.clone(),
kind: "detached-file",
@@ -1942,6 +1946,7 @@ fn sysroot_metadata_config(
features: Default::default(),
targets,
extra_args: Default::default(),
+ metadata_extra_args: config.metadata_extra_args.clone(),
extra_env: config.extra_env.clone(),
toolchain_version,
kind: "sysroot",
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 90857a3073..74d498368c 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -831,6 +831,9 @@ config_data! {
///
/// Set this to `"all"` to pass `--all-features` to cargo.
cargo_features: CargoFeaturesDef = CargoFeaturesDef::Selected(vec![]),
+ /// Extra arguments passed only to `cargo metadata`, not to other cargo invocations.
+ /// Useful for flags like `--config` that `cargo metadata` supports.
+ cargo_metadataExtraArgs: Vec<String> = vec![],
/// Whether to pass `--no-default-features` to cargo.
cargo_noDefaultFeatures: bool = false,
/// Whether to skip fetching dependencies. If set to "true", the analysis is performed
@@ -2444,6 +2447,7 @@ impl Config {
target_dir_config: self.target_dir_from_config(source_root),
set_test: *self.cfg_setTest(source_root),
no_deps: *self.cargo_noDeps(source_root),
+ metadata_extra_args: self.cargo_metadataExtraArgs(source_root).clone(),
}
}
diff --git a/docs/book/src/configuration_generated.md b/docs/book/src/configuration_generated.md
index aff2e32b63..548c5fb093 100644
--- a/docs/book/src/configuration_generated.md
+++ b/docs/book/src/configuration_generated.md
@@ -166,6 +166,14 @@ List of features to activate.
Set this to `"all"` to pass `--all-features` to cargo.
+## rust-analyzer.cargo.metadataExtraArgs {#cargo.metadataExtraArgs}
+
+Default: `[]`
+
+Extra arguments passed only to `cargo metadata`, not to other cargo invocations.
+Useful for flags like `--config` that `cargo metadata` supports.
+
+
## rust-analyzer.cargo.noDefaultFeatures {#cargo.noDefaultFeatures}
Default: `false`
diff --git a/editors/code/package.json b/editors/code/package.json
index 997ca0ae72..8c99b30ce9 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -996,6 +996,19 @@
{
"title": "Cargo",
"properties": {
+ "rust-analyzer.cargo.metadataExtraArgs": {
+ "markdownDescription": "Extra arguments passed only to `cargo metadata`, not to other cargo invocations.\nUseful for flags like `--config` that `cargo metadata` supports.",
+ "default": [],
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "title": "Cargo",
+ "properties": {
"rust-analyzer.cargo.noDefaultFeatures": {
"markdownDescription": "Whether to pass `--no-default-features` to cargo.",
"default": false,