Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/project-model/src/project_json.rs')
| -rw-r--r-- | crates/project-model/src/project_json.rs | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/crates/project-model/src/project_json.rs b/crates/project-model/src/project_json.rs index cf0a6ad402..1fb9cec8e2 100644 --- a/crates/project-model/src/project_json.rs +++ b/crates/project-model/src/project_json.rs @@ -50,12 +50,13 @@ //! rust-project.json over time via configuration request!) use base_db::{CrateDisplayName, CrateName}; +use cfg::CfgAtom; use paths::{AbsPath, AbsPathBuf, Utf8PathBuf}; use rustc_hash::FxHashMap; use serde::{de, Deserialize, Serialize}; use span::Edition; -use crate::{cfg::CfgFlag, ManifestPath, TargetKind}; +use crate::{ManifestPath, TargetKind}; /// Roots and crates that compose this Rust project. #[derive(Clone, Debug, Eq, PartialEq)] @@ -82,7 +83,7 @@ pub struct Crate { pub(crate) edition: Edition, pub(crate) version: Option<String>, pub(crate) deps: Vec<Dep>, - pub(crate) cfg: Vec<CfgFlag>, + pub(crate) cfg: Vec<CfgAtom>, pub(crate) target: Option<String>, pub(crate) env: FxHashMap<String, String>, pub(crate) proc_macro_dylib_path: Option<AbsPathBuf>, @@ -319,7 +320,8 @@ struct CrateData { version: Option<semver::Version>, deps: Vec<Dep>, #[serde(default)] - cfg: Vec<CfgFlag>, + #[serde(with = "cfg_")] + cfg: Vec<CfgAtom>, target: Option<String>, #[serde(default)] env: FxHashMap<String, String>, @@ -334,6 +336,33 @@ struct CrateData { build: Option<BuildData>, } +mod cfg_ { + use cfg::CfgAtom; + use serde::{Deserialize, Serialize}; + + pub(super) fn deserialize<'de, D>(deserializer: D) -> Result<Vec<CfgAtom>, D::Error> + where + D: serde::Deserializer<'de>, + { + let cfg: Vec<String> = Vec::deserialize(deserializer)?; + cfg.into_iter().map(|it| crate::parse_cfg(&it).map_err(serde::de::Error::custom)).collect() + } + pub(super) fn serialize<S>(cfg: &[CfgAtom], serializer: S) -> Result<S::Ok, S::Error> + where + S: serde::Serializer, + { + cfg.iter() + .map(|cfg| match cfg { + CfgAtom::Flag(flag) => flag.as_str().to_owned(), + CfgAtom::KeyValue { key, value } => { + format!("{}=\"{}\"", key.as_str(), value.as_str()) + } + }) + .collect::<Vec<String>>() + .serialize(serializer) + } +} + #[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] #[serde(rename = "edition")] enum EditionData { |