aboutsummaryrefslogtreecommitdiff
path: root/crates/project_model
diff options
context:
space:
mode:
Diffstat (limited to 'crates/project_model')
-rw-r--r--crates/project_model/src/cargo_workspace.rs23
-rw-r--r--crates/project_model/src/workspace.rs6
2 files changed, 26 insertions, 3 deletions
diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs
index f7241b711..beda2f61f 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};
9use la_arena::{Arena, Idx}; 9use la_arena::{Arena, Idx};
10use paths::{AbsPath, AbsPathBuf}; 10use paths::{AbsPath, AbsPathBuf};
11use rustc_hash::FxHashMap; 11use rustc_hash::FxHashMap;
12use serde::Deserialize;
13use serde_json::from_value;
12 14
13use crate::build_data::BuildDataConfig; 15use crate::build_data::BuildDataConfig;
14use crate::utf8_stdout; 16use 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)]
114pub struct RustAnalyzerPackageMetaData {
115 pub rustc_private: Option<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
175struct PackageMetadata {
176 #[serde(rename = "rust-analyzer")]
177 rust_analyzer: Option<RustAnalyzerPackageMetaData>,
178}
179
164impl CargoWorkspace { 180impl 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);
diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs
index 0220efdb4..10e608547 100644
--- a/crates/project_model/src/workspace.rs
+++ b/crates/project_model/src/workspace.rs
@@ -499,7 +499,11 @@ fn cargo_to_crate_graph(
499 499
500 if let Some(&to) = pkg_to_lib_crate.get(&dep) { 500 if let Some(&to) = pkg_to_lib_crate.get(&dep) {
501 for pkg in cargo.packages() { 501 for pkg in cargo.packages() {
502 if !cargo[pkg].is_member { 502 let package = &cargo[pkg];
503 if matches!(
504 (package.is_member, package.metadata.rustc_private),
505 (true, Some(false)) | (false, Some(false)) | (false, None)
506 ) {
503 continue; 507 continue;
504 } 508 }
505 for &from in pkg_crates.get(&pkg).into_iter().flatten() { 509 for &from in pkg_crates.get(&pkg).into_iter().flatten() {