Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/project-model/src/build_dependencies.rs3
-rw-r--r--crates/project-model/src/cargo_config_file.rs4
-rw-r--r--crates/project-model/src/cargo_workspace.rs8
-rw-r--r--crates/project-model/src/workspace.rs15
-rw-r--r--crates/rust-analyzer/src/config.rs7
-rw-r--r--docs/book/src/configuration_generated.md9
-rw-r--r--editors/code/package.json13
7 files changed, 57 insertions, 2 deletions
diff --git a/crates/project-model/src/build_dependencies.rs b/crates/project-model/src/build_dependencies.rs
index 352f41a826..336350653b 100644
--- a/crates/project-model/src/build_dependencies.rs
+++ b/crates/project-model/src/build_dependencies.rs
@@ -450,6 +450,9 @@ impl WorkspaceBuildScripts {
cmd.args(["check", "--quiet", "--workspace", "--message-format=json"]);
cmd.args(&config.extra_args);
+ if let Some(config_path) = &config.config_path {
+ cmd.arg("--config").arg(config_path);
+ }
cmd.arg("--manifest-path");
cmd.arg(manifest_path);
diff --git a/crates/project-model/src/cargo_config_file.rs b/crates/project-model/src/cargo_config_file.rs
index ae36deb71f..39d1a82518 100644
--- a/crates/project-model/src/cargo_config_file.rs
+++ b/crates/project-model/src/cargo_config_file.rs
@@ -17,11 +17,15 @@ impl CargoConfigFile {
manifest: &ManifestPath,
extra_env: &FxHashMap<String, Option<String>>,
sysroot: &Sysroot,
+ config_path: Option<&AbsPath>,
) -> Option<Self> {
let mut cargo_config = sysroot.tool(Tool::Cargo, manifest.parent(), extra_env);
cargo_config
.args(["-Z", "unstable-options", "config", "get", "--format", "toml", "--show-origin"])
.env("RUSTC_BOOTSTRAP", "1");
+ if let Some(config_path) = config_path {
+ cargo_config.arg("--config").arg(config_path);
+ }
if manifest.is_rust_manifest() {
cargo_config.arg("-Zscript");
}
diff --git a/crates/project-model/src/cargo_workspace.rs b/crates/project-model/src/cargo_workspace.rs
index 5d8273832b..004d62967a 100644
--- a/crates/project-model/src/cargo_workspace.rs
+++ b/crates/project-model/src/cargo_workspace.rs
@@ -133,6 +133,8 @@ pub struct CargoConfig {
pub extra_args: Vec<String>,
/// Extra args passed only to `cargo metadata`, not other cargo commands.
pub metadata_extra_args: Vec<String>,
+ /// Path to an extra config file passed to every cargo invocation via `--config`.
+ pub config_path: Option<AbsPathBuf>,
/// Extra env vars to set when invoking the cargo command
pub extra_env: FxHashMap<String, Option<String>>,
pub invocation_strategy: InvocationStrategy,
@@ -324,6 +326,8 @@ pub struct CargoMetadataConfig {
pub extra_args: Vec<String>,
/// Extra args passed directly to `cargo metadata` without filtering.
pub metadata_extra_args: Vec<String>,
+ /// Path to an extra config file passed to `cargo metadata` via `--config`.
+ pub config_path: Option<AbsPathBuf>,
/// 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.
@@ -684,6 +688,10 @@ impl FetchMetadata {
}
}
other_options.extend(config.metadata_extra_args.iter().cloned());
+ if let Some(config_path) = &config.config_path {
+ other_options.push("--config".to_owned());
+ other_options.push(config_path.to_string());
+ }
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 784255ff05..e27029d8c0 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -217,6 +217,7 @@ impl ProjectWorkspace {
rustc_source,
extra_args,
metadata_extra_args,
+ config_path,
extra_env,
set_test,
cfg_overrides,
@@ -269,7 +270,8 @@ impl ProjectWorkspace {
tracing::info!(workspace = %cargo_toml, src_root = ?sysroot.rust_lib_src_root(), root = ?sysroot.root(), "Using sysroot");
progress("querying project metadata".to_owned());
- let config_file = CargoConfigFile::load(cargo_toml, extra_env, &sysroot);
+ let config_file =
+ CargoConfigFile::load(cargo_toml, extra_env, &sysroot, config_path.as_deref());
let config_file_ = config_file.clone();
let toolchain_config = QueryConfig::Cargo(&sysroot, cargo_toml, &config_file_);
let targets =
@@ -291,6 +293,7 @@ impl ProjectWorkspace {
targets: targets.clone(),
extra_args: extra_args.clone(),
metadata_extra_args: metadata_extra_args.clone(),
+ config_path: config_path.clone(),
extra_env: extra_env.clone(),
toolchain_version: toolchain.clone(),
kind: "workspace",
@@ -346,6 +349,7 @@ impl ProjectWorkspace {
targets: targets.clone(),
extra_args: extra_args.clone(),
metadata_extra_args: metadata_extra_args.clone(),
+ config_path: config_path.clone(),
extra_env: extra_env.clone(),
toolchain_version: toolchain.clone(),
kind: "rustc-dev"
@@ -549,7 +553,12 @@ impl ProjectWorkspace {
None => Sysroot::empty(),
};
- let config_file = CargoConfigFile::load(detached_file, &config.extra_env, &sysroot);
+ let config_file = CargoConfigFile::load(
+ detached_file,
+ &config.extra_env,
+ &sysroot,
+ config.config_path.as_deref(),
+ );
let query_config = QueryConfig::Cargo(&sysroot, detached_file, &config_file);
let toolchain = version::get(query_config, &config.extra_env).ok().flatten();
let targets = target_tuple::get(query_config, config.target.as_deref(), &config.extra_env)
@@ -579,6 +588,7 @@ impl ProjectWorkspace {
targets,
extra_args: config.extra_args.clone(),
metadata_extra_args: config.metadata_extra_args.clone(),
+ config_path: config.config_path.clone(),
extra_env: config.extra_env.clone(),
toolchain_version: toolchain.clone(),
kind: "detached-file",
@@ -1954,6 +1964,7 @@ fn sysroot_metadata_config(
targets,
extra_args: Default::default(),
metadata_extra_args: Default::default(),
+ config_path: Default::default(),
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 6bdeb8ba07..68f58c25ca 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -833,6 +833,10 @@ config_data! {
cargo_cfgs: Vec<String> = {
vec!["debug_assertions".into(), "miri".into()]
},
+ /// Path to a `.cargo/config.toml` style file to pass to cargo via `--config`
+ /// for every cargo invocation (metadata, build scripts, config discovery).
+ /// Useful to give rust-analyzer a consistent view of the project configuration.
+ cargo_configPath: Option<Utf8PathBuf> = None,
/// Extra arguments that are passed to every cargo invocation.
cargo_extraArgs: Vec<String> = vec![],
/// Extra environment variables that will be set when running cargo, rustc
@@ -2418,6 +2422,8 @@ impl Config {
});
let sysroot_src =
self.cargo_sysrootSrc(source_root).as_ref().map(|sysroot| self.root_path.join(sysroot));
+ let config_path =
+ self.cargo_configPath(source_root).as_ref().map(|path| self.root_path.join(path));
let extra_includes = self
.vfs_extraIncludes(source_root)
.iter()
@@ -2484,6 +2490,7 @@ impl Config {
set_test: *self.cfg_setTest(source_root),
no_deps: *self.cargo_noDeps(source_root),
metadata_extra_args: self.cargo_metadataExtraArgs(source_root).clone(),
+ config_path,
}
}
diff --git a/docs/book/src/configuration_generated.md b/docs/book/src/configuration_generated.md
index 76b626b09f..1f94639074 100644
--- a/docs/book/src/configuration_generated.md
+++ b/docs/book/src/configuration_generated.md
@@ -142,6 +142,15 @@ To enable a name with a value, use `"key=value"`.
To disable, prefix the entry with a `!`.
+## rust-analyzer.cargo.configPath {#cargo.configPath}
+
+Default: `null`
+
+Path to a `.cargo/config.toml` style file to pass to cargo via `--config`
+for every cargo invocation (metadata, build scripts, config discovery).
+Useful to give rust-analyzer a consistent view of the project configuration.
+
+
## rust-analyzer.cargo.extraArgs {#cargo.extraArgs}
Default: `[]`
diff --git a/editors/code/package.json b/editors/code/package.json
index 7380ebad2b..c9ab57be99 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -974,6 +974,19 @@
{
"title": "Cargo",
"properties": {
+ "rust-analyzer.cargo.configPath": {
+ "markdownDescription": "Path to a `.cargo/config.toml` style file to pass to cargo via `--config`\nfor every cargo invocation (metadata, build scripts, config discovery).\nUseful to give rust-analyzer a consistent view of the project configuration.",
+ "default": null,
+ "type": [
+ "null",
+ "string"
+ ]
+ }
+ }
+ },
+ {
+ "title": "Cargo",
+ "properties": {
"rust-analyzer.cargo.extraArgs": {
"markdownDescription": "Extra arguments that are passed to every cargo invocation.",
"default": [],