From bc4d047267232db485e24f74c05ad03f76b1786b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 20 Jul 2020 17:57:10 +0200 Subject: [PATCH] Add is_workspace_member for rust-project.json It is currently unused, but, in the future, it will be used to: * drive certain UX (symbols search by default will look only in the members) * improve performance (rust-analyzer will assume that non-members change rarely) If not specified, is_workspace member is inferred from the path --- crates/ra_project_model/src/project_json.rs | 60 ++++++++++++--------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/crates/ra_project_model/src/project_json.rs b/crates/ra_project_model/src/project_json.rs index b962279496a..778cc84ef92 100644 --- a/crates/ra_project_model/src/project_json.rs +++ b/crates/ra_project_model/src/project_json.rs @@ -34,6 +34,7 @@ pub struct Crate { pub(crate) target: Option, pub(crate) out_dir: Option, pub(crate) proc_macro_dylib_path: Option, + pub(crate) is_workspace_member: bool, } impl ProjectJson { @@ -43,32 +44,42 @@ pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { crates: data .crates .into_iter() - .map(|crate_data| Crate { - root_module: base.join(crate_data.root_module), - edition: crate_data.edition.into(), - deps: crate_data - .deps - .into_iter() - .map(|dep_data| Dependency { - crate_id: CrateId(dep_data.krate as u32), - name: dep_data.name, - }) - .collect::>(), - cfg: { - let mut cfg = CfgOptions::default(); - for entry in &crate_data.cfg { - match split_delim(entry, '=') { - Some((key, value)) => { - cfg.insert_key_value(key.into(), value.into()); + .map(|crate_data| { + let is_workspace_member = crate_data.is_workspace_member.unwrap_or_else(|| { + crate_data.root_module.is_relative() + && !crate_data.root_module.starts_with("..") + || crate_data.root_module.starts_with(base) + }); + Crate { + root_module: base.join(crate_data.root_module), + edition: crate_data.edition.into(), + deps: crate_data + .deps + .into_iter() + .map(|dep_data| Dependency { + crate_id: CrateId(dep_data.krate as u32), + name: dep_data.name, + }) + .collect::>(), + cfg: { + let mut cfg = CfgOptions::default(); + for entry in &crate_data.cfg { + match split_delim(entry, '=') { + Some((key, value)) => { + cfg.insert_key_value(key.into(), value.into()); + } + None => cfg.insert_atom(entry.into()), } - None => cfg.insert_atom(entry.into()), } - } - cfg - }, - target: crate_data.target, - out_dir: crate_data.out_dir.map(|it| base.join(it)), - proc_macro_dylib_path: crate_data.proc_macro_dylib_path.map(|it| base.join(it)), + cfg + }, + target: crate_data.target, + out_dir: crate_data.out_dir.map(|it| base.join(it)), + proc_macro_dylib_path: crate_data + .proc_macro_dylib_path + .map(|it| base.join(it)), + is_workspace_member, + } }) .collect::>(), } @@ -91,6 +102,7 @@ struct CrateData { target: Option, out_dir: Option, proc_macro_dylib_path: Option, + is_workspace_member: Option, } #[derive(Deserialize)]