aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Wood <[email protected]>2020-05-09 00:59:52 +0100
committerAaron Wood <[email protected]>2020-05-09 00:59:52 +0100
commitbeb79ed104c686d8704eb7042318eefea78770df (patch)
tree7395959cc669503894600407f38b381616045943
parenta5f2b16366f027ad60c58266a66eb7fbdcbda9f9 (diff)
Begin transition to new fields for JsonProject crate cfgs
This starts the transition to a new method of documenting the cfgs that are enabled for a given crate in the json file. This is changing from a list of atoms and a dict of key:value pairs, to a list of strings that is equivalent to that returned by `rustc --print cfg ..`, and parsed in the same manner by rust-analyzer. This is the first of two changes, which adds the new field that contains the list of strings. Next change will complete the transition and remove the previous fields.
-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 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