]> git.lizzy.rs Git - rust.git/commitdiff
Implement opt-in (and opt-out) rustc_private
authorDaniel McNab <36049421+DJMcNab@users.noreply.github.com>
Sat, 6 Mar 2021 12:17:22 +0000 (12:17 +0000)
committerDaniel McNab <36049421+DJMcNab@users.noreply.github.com>
Sat, 6 Mar 2021 12:17:22 +0000 (12:17 +0000)
crates/project_model/src/cargo_workspace.rs
crates/project_model/src/workspace.rs

index f7241b711366971aa4036365f292a0e57cc2b802..beda2f61fa4b305baf912e413ec806b084d1e99a 100644 (file)
@@ -9,6 +9,8 @@
 use la_arena::{Arena, Idx};
 use paths::{AbsPath, AbsPathBuf};
 use rustc_hash::FxHashMap;
+use serde::Deserialize;
+use serde_json::from_value;
 
 use crate::build_data::BuildDataConfig;
 use crate::utf8_stdout;
@@ -104,6 +106,13 @@ pub struct PackageData {
     pub active_features: Vec<String>,
     // String representation of package id
     pub id: String,
+    // The contents of [package.metadata.rust-analyzer]
+    pub metadata: RustAnalyzerPackageMetaData,
+}
+
+#[derive(Deserialize, Default, Debug, Clone, Eq, PartialEq)]
+pub struct RustAnalyzerPackageMetaData {
+    pub rustc_private: Option<bool>,
 }
 
 #[derive(Debug, Clone, Eq, PartialEq)]
@@ -161,6 +170,13 @@ pub fn root(&self) -> &AbsPath {
     }
 }
 
+#[derive(Deserialize, Default)]
+// Deserialise helper for the cargo metadata
+struct PackageMetadata {
+    #[serde(rename = "rust-analyzer")]
+    rust_analyzer: Option<RustAnalyzerPackageMetaData>,
+}
+
 impl CargoWorkspace {
     pub fn from_cargo_metadata(
         cargo_toml: &AbsPath,
@@ -244,8 +260,10 @@ pub fn from_cargo_metadata(
 
         meta.packages.sort_by(|a, b| a.id.cmp(&b.id));
         for meta_pkg in &meta.packages {
-            let cargo_metadata::Package { id, edition, name, manifest_path, version, .. } =
-                meta_pkg;
+            let cargo_metadata::Package {
+                id, edition, name, manifest_path, version, metadata, ..
+            } = meta_pkg;
+            let meta = from_value::<PackageMetadata>(metadata.clone()).unwrap_or_default();
             let is_member = ws_members.contains(&id);
             let edition = edition
                 .parse::<Edition>()
@@ -262,6 +280,7 @@ pub fn from_cargo_metadata(
                 dependencies: Vec::new(),
                 features: meta_pkg.features.clone().into_iter().collect(),
                 active_features: Vec::new(),
+                metadata: meta.rust_analyzer.unwrap_or_default(),
             });
             let pkg_data = &mut packages[pkg];
             pkg_by_id.insert(id, pkg);
index 0220efdb4e5bc97a73420ea32b7ea0c44104acc7..10e6085479573acebf9854572044f2faa55ad8cb 100644 (file)
@@ -499,7 +499,11 @@ fn cargo_to_crate_graph(
 
             if let Some(&to) = pkg_to_lib_crate.get(&dep) {
                 for pkg in cargo.packages() {
-                    if !cargo[pkg].is_member {
+                    let package = &cargo[pkg];
+                    if matches!(
+                        (package.is_member, package.metadata.rustc_private),
+                        (true, Some(false)) | (false, Some(false)) | (false, None)
+                    ) {
                         continue;
                     }
                     for &from in pkg_crates.get(&pkg).into_iter().flatten() {