diff options
-rw-r--r-- | crates/ra_project_model/src/json_project.rs | 79 | ||||
-rw-r--r-- | crates/ra_project_model/src/lib.rs | 10 | ||||
-rw-r--r-- | crates/rust-analyzer/tests/heavy_tests/main.rs | 5 |
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)] | ||
68 | mod 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 731cbd291..e7da683d6 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs | |||
@@ -273,6 +273,16 @@ impl ProjectWorkspace { | |||
273 | }; | 273 | }; |
274 | let cfg_options = { | 274 | let cfg_options = { |
275 | let mut opts = default_cfg_options.clone(); | 275 | let mut opts = default_cfg_options.clone(); |
276 | for cfg in &krate.cfg { | ||
277 | match cfg.find('=') { | ||
278 | None => opts.insert_atom(cfg.into()), | ||
279 | Some(pos) => { | ||
280 | let key = &cfg[..pos]; | ||
281 | let value = cfg[pos + 1..].trim_matches('"'); | ||
282 | opts.insert_key_value(key.into(), value.into()); | ||
283 | } | ||
284 | } | ||
285 | } | ||
276 | for name in &krate.atom_cfgs { | 286 | for name in &krate.atom_cfgs { |
277 | opts.insert_atom(name.into()); | 287 | opts.insert_atom(name.into()); |
278 | } | 288 | } |
diff --git a/crates/rust-analyzer/tests/heavy_tests/main.rs b/crates/rust-analyzer/tests/heavy_tests/main.rs index 07b8114c6..3d5574c7f 100644 --- a/crates/rust-analyzer/tests/heavy_tests/main.rs +++ b/crates/rust-analyzer/tests/heavy_tests/main.rs | |||
@@ -384,8 +384,9 @@ fn test_missing_module_code_action_in_json_project() { | |||
384 | "root_module": path.join("src/lib.rs"), | 384 | "root_module": path.join("src/lib.rs"), |
385 | "deps": [], | 385 | "deps": [], |
386 | "edition": "2015", | 386 | "edition": "2015", |
387 | "atom_cfgs": [], | 387 | "cfg": [ "cfg_atom_1", "feature=cfg_1"], |
388 | "key_value_cfgs": {} | 388 | "atom_cfgs": ["atom_2"], |
389 | "key_value_cfgs": { "feature": "key_value_feature", "other": "value"} | ||
389 | } ] | 390 | } ] |
390 | }); | 391 | }); |
391 | 392 | ||