aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_project_model/src/json_project.rs79
-rw-r--r--crates/ra_project_model/src/lib.rs10
-rw-r--r--crates/rust-analyzer/tests/heavy_tests/main.rs5
3 files changed, 92 insertions, 2 deletions
diff --git a/crates/ra_project_model/src/json_project.rs b/crates/ra_project_model/src/json_project.rs
index b030c8a6a..bd2bae15e 100644
--- a/crates/ra_project_model/src/json_project.rs
+++ b/crates/ra_project_model/src/json_project.rs
@@ -20,8 +20,17 @@ pub struct Crate {
20 pub(crate) root_module: PathBuf, 20 pub(crate) root_module: PathBuf,
21 pub(crate) edition: Edition, 21 pub(crate) edition: Edition,
22 pub(crate) deps: Vec<Dep>, 22 pub(crate) deps: Vec<Dep>,
23
24 // This is the preferred method of providing cfg options.
25 #[serde(default)]
26 pub(crate) cfg: FxHashSet<String>,
27
28 // These two are here for transition only.
29 #[serde(default)]
23 pub(crate) atom_cfgs: FxHashSet<String>, 30 pub(crate) atom_cfgs: FxHashSet<String>,
31 #[serde(default)]
24 pub(crate) key_value_cfgs: FxHashMap<String, String>, 32 pub(crate) key_value_cfgs: FxHashMap<String, String>,
33
25 pub(crate) out_dir: Option<PathBuf>, 34 pub(crate) out_dir: Option<PathBuf>,
26 pub(crate) proc_macro_dylib_path: Option<PathBuf>, 35 pub(crate) proc_macro_dylib_path: Option<PathBuf>,
27} 36}
@@ -54,3 +63,73 @@ pub struct JsonProject {
54 pub(crate) roots: Vec<Root>, 63 pub(crate) roots: Vec<Root>,
55 pub(crate) crates: Vec<Crate>, 64 pub(crate) crates: Vec<Crate>,
56} 65}
66
67#[cfg(test)]
68mod tests {
69 use super::*;
70 use serde_json::json;
71
72 #[test]
73 fn test_crate_deserialization() {
74 let raw_json = json!( {
75 "crate_id": 2,
76 "root_module": "this/is/a/file/path.rs",
77 "deps": [
78 {
79 "crate": 1,
80 "name": "some_dep_crate"
81 },
82 ],
83 "edition": "2015",
84 "cfg": [
85 "atom_1",
86 "atom_2",
87 "feature=feature_1",
88 "feature=feature_2",
89 "other=value",
90 ],
91
92 });
93
94 let krate: Crate = serde_json::from_value(raw_json).unwrap();
95
96 assert!(krate.cfg.contains(&"atom_1".to_string()));
97 assert!(krate.cfg.contains(&"atom_2".to_string()));
98 assert!(krate.cfg.contains(&"feature=feature_1".to_string()));
99 assert!(krate.cfg.contains(&"feature=feature_2".to_string()));
100 assert!(krate.cfg.contains(&"other=value".to_string()));
101 }
102
103 #[test]
104 fn test_crate_deserialization_old_json() {
105 let raw_json = json!( {
106 "crate_id": 2,
107 "root_module": "this/is/a/file/path.rs",
108 "deps": [
109 {
110 "crate": 1,
111 "name": "some_dep_crate"
112 },
113 ],
114 "edition": "2015",
115 "atom_cfgs": [
116 "atom_1",
117 "atom_2",
118 ],
119 "key_value_cfgs": {
120 "feature": "feature_1",
121 "feature": "feature_2",
122 "other": "value",
123 },
124 });
125
126 let krate: Crate = serde_json::from_value(raw_json).unwrap();
127
128 assert!(krate.atom_cfgs.contains(&"atom_1".to_string()));
129 assert!(krate.atom_cfgs.contains(&"atom_2".to_string()));
130 assert!(krate.key_value_cfgs.contains_key(&"feature".to_string()));
131 assert_eq!(krate.key_value_cfgs.get("feature"), Some(&"feature_2".to_string()));
132 assert!(krate.key_value_cfgs.contains_key(&"other".to_string()));
133 assert_eq!(krate.key_value_cfgs.get("other"), Some(&"value".to_string()));
134 }
135}
diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs
index a2e9f65ef..9b30bef8d 100644
--- a/crates/ra_project_model/src/lib.rs
+++ b/crates/ra_project_model/src/lib.rs
@@ -252,6 +252,16 @@ impl ProjectWorkspace {
252 }; 252 };
253 let cfg_options = { 253 let cfg_options = {
254 let mut opts = default_cfg_options.clone(); 254 let mut opts = default_cfg_options.clone();
255 for cfg in &krate.cfg {
256 match cfg.find('=') {
257 None => opts.insert_atom(cfg.into()),
258 Some(pos) => {
259 let key = &cfg[..pos];
260 let value = cfg[pos + 1..].trim_matches('"');
261 opts.insert_key_value(key.into(), value.into());
262 }
263 }
264 }
255 for name in &krate.atom_cfgs { 265 for name in &krate.atom_cfgs {
256 opts.insert_atom(name.into()); 266 opts.insert_atom(name.into());
257 } 267 }
diff --git a/crates/rust-analyzer/tests/heavy_tests/main.rs b/crates/rust-analyzer/tests/heavy_tests/main.rs
index e18f973b8..c80745945 100644
--- a/crates/rust-analyzer/tests/heavy_tests/main.rs
+++ b/crates/rust-analyzer/tests/heavy_tests/main.rs
@@ -379,8 +379,9 @@ fn test_missing_module_code_action_in_json_project() {
379 "root_module": path.join("src/lib.rs"), 379 "root_module": path.join("src/lib.rs"),
380 "deps": [], 380 "deps": [],
381 "edition": "2015", 381 "edition": "2015",
382 "atom_cfgs": [], 382 "cfg": [ "cfg_atom_1", "feature=cfg_1"],
383 "key_value_cfgs": {} 383 "atom_cfgs": ["atom_2"],
384 "key_value_cfgs": { "feature": "key_value_feature", "other": "value"}
384 } ] 385 } ]
385 }); 386 });
386 387