diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-08 16:51:20 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-08 16:51:20 +0000 |
commit | d57c9f79801762aa23adc21adbb638678268e96b (patch) | |
tree | b4d67ea46bb187dde2200086eb9d3af731be3765 /crates/project_model/src/cargo_workspace.rs | |
parent | f2b8df17db254342eb17e8ac8df9e81e8b34775c (diff) | |
parent | 20007fd3a8aa16bec0c4f9ebc1489c157f846df4 (diff) |
Merge #7891
7891: Improve handling of rustc_private r=matklad a=DJMcNab
This PR changes how `rust-analyzer` handles `rustc_private`. In particular, packages now must opt-in to using `rustc_private` in `Cargo.toml`, by adding:
```toml
[package.metadata.rust-analyzer]
rustc_private=true
```
This means that depending on crates which also use `rustc_private` will be significantly improved, since their dependencies on the `rustc_private` crates will be resolved properly.
A similar approach could be used in #6714 to allow annotating that your package uses the `test` crate, although I have not yet handled that in this PR.
Additionally, we now only index the crates which are transitive dependencies of `rustc_driver` in the `rustcSource` directory. This should not cause any change in behaviour when using `rustcSource: "discover"`, as the source used then will only be a partial clone. However, if `rustcSource` pointing at a local checkout of rustc, this should significantly improve the memory usage and lower indexing time. This is because we avoids indexing all crates in `src/tools/`, which includes `rust-analyzer` itself.
Furthermore, we also prefer named dependencies over dependencies from `rustcSource`. This ensures that feature resolution for crates which are depended on by both `rustc` and your crate uses the correct set for analysing your crate.
See also [introductory zulip stream](https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Fwg-rls-2.2E0/topic/Fixed.20crate.20graphs.20and.20optional.20builtin.20crates/near/229086673)
I have tested this in [priroda](https://github.com/oli-obk/priroda/), and it provides a significant improvement to the development experience (once I give `miri` the required data in `Cargo.toml`)
Todo:
- [ ] Documentation
This is ready to review, and I will add documentation if this would be accepted (or if I get time to do so anyway)
Co-authored-by: Daniel McNab <[email protected]>
Diffstat (limited to 'crates/project_model/src/cargo_workspace.rs')
-rw-r--r-- | crates/project_model/src/cargo_workspace.rs | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs index f7241b711..bc6e20341 100644 --- a/crates/project_model/src/cargo_workspace.rs +++ b/crates/project_model/src/cargo_workspace.rs | |||
@@ -9,6 +9,8 @@ use cargo_metadata::{CargoOpt, MetadataCommand}; | |||
9 | use la_arena::{Arena, Idx}; | 9 | use la_arena::{Arena, Idx}; |
10 | use paths::{AbsPath, AbsPathBuf}; | 10 | use paths::{AbsPath, AbsPathBuf}; |
11 | use rustc_hash::FxHashMap; | 11 | use rustc_hash::FxHashMap; |
12 | use serde::Deserialize; | ||
13 | use serde_json::from_value; | ||
12 | 14 | ||
13 | use crate::build_data::BuildDataConfig; | 15 | use crate::build_data::BuildDataConfig; |
14 | use crate::utf8_stdout; | 16 | use crate::utf8_stdout; |
@@ -104,6 +106,13 @@ pub struct PackageData { | |||
104 | pub active_features: Vec<String>, | 106 | pub active_features: Vec<String>, |
105 | // String representation of package id | 107 | // String representation of package id |
106 | pub id: String, | 108 | pub id: String, |
109 | // The contents of [package.metadata.rust-analyzer] | ||
110 | pub metadata: RustAnalyzerPackageMetaData, | ||
111 | } | ||
112 | |||
113 | #[derive(Deserialize, Default, Debug, Clone, Eq, PartialEq)] | ||
114 | pub struct RustAnalyzerPackageMetaData { | ||
115 | pub rustc_private: bool, | ||
107 | } | 116 | } |
108 | 117 | ||
109 | #[derive(Debug, Clone, Eq, PartialEq)] | 118 | #[derive(Debug, Clone, Eq, PartialEq)] |
@@ -161,6 +170,13 @@ impl PackageData { | |||
161 | } | 170 | } |
162 | } | 171 | } |
163 | 172 | ||
173 | #[derive(Deserialize, Default)] | ||
174 | // Deserialise helper for the cargo metadata | ||
175 | struct PackageMetadata { | ||
176 | #[serde(rename = "rust-analyzer")] | ||
177 | rust_analyzer: Option<RustAnalyzerPackageMetaData>, | ||
178 | } | ||
179 | |||
164 | impl CargoWorkspace { | 180 | impl CargoWorkspace { |
165 | pub fn from_cargo_metadata( | 181 | pub fn from_cargo_metadata( |
166 | cargo_toml: &AbsPath, | 182 | cargo_toml: &AbsPath, |
@@ -244,8 +260,10 @@ impl CargoWorkspace { | |||
244 | 260 | ||
245 | meta.packages.sort_by(|a, b| a.id.cmp(&b.id)); | 261 | meta.packages.sort_by(|a, b| a.id.cmp(&b.id)); |
246 | for meta_pkg in &meta.packages { | 262 | for meta_pkg in &meta.packages { |
247 | let cargo_metadata::Package { id, edition, name, manifest_path, version, .. } = | 263 | let cargo_metadata::Package { |
248 | meta_pkg; | 264 | id, edition, name, manifest_path, version, metadata, .. |
265 | } = meta_pkg; | ||
266 | let meta = from_value::<PackageMetadata>(metadata.clone()).unwrap_or_default(); | ||
249 | let is_member = ws_members.contains(&id); | 267 | let is_member = ws_members.contains(&id); |
250 | let edition = edition | 268 | let edition = edition |
251 | .parse::<Edition>() | 269 | .parse::<Edition>() |
@@ -262,6 +280,7 @@ impl CargoWorkspace { | |||
262 | dependencies: Vec::new(), | 280 | dependencies: Vec::new(), |
263 | features: meta_pkg.features.clone().into_iter().collect(), | 281 | features: meta_pkg.features.clone().into_iter().collect(), |
264 | active_features: Vec::new(), | 282 | active_features: Vec::new(), |
283 | metadata: meta.rust_analyzer.unwrap_or_default(), | ||
265 | }); | 284 | }); |
266 | let pkg_data = &mut packages[pkg]; | 285 | let pkg_data = &mut packages[pkg]; |
267 | pkg_by_id.insert(id, pkg); | 286 | pkg_by_id.insert(id, pkg); |