diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_project_model/src/project_json.rs | 60 | ||||
-rw-r--r-- | crates/vfs/src/loader.rs | 14 |
2 files changed, 41 insertions, 33 deletions
diff --git a/crates/ra_project_model/src/project_json.rs b/crates/ra_project_model/src/project_json.rs index b96227949..778cc84ef 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 { | |||
34 | pub(crate) target: Option<String>, | 34 | pub(crate) target: Option<String>, |
35 | pub(crate) out_dir: Option<AbsPathBuf>, | 35 | pub(crate) out_dir: Option<AbsPathBuf>, |
36 | pub(crate) proc_macro_dylib_path: Option<AbsPathBuf>, | 36 | pub(crate) proc_macro_dylib_path: Option<AbsPathBuf>, |
37 | pub(crate) is_workspace_member: bool, | ||
37 | } | 38 | } |
38 | 39 | ||
39 | impl ProjectJson { | 40 | impl ProjectJson { |
@@ -43,32 +44,42 @@ impl ProjectJson { | |||
43 | crates: data | 44 | crates: data |
44 | .crates | 45 | .crates |
45 | .into_iter() | 46 | .into_iter() |
46 | .map(|crate_data| Crate { | 47 | .map(|crate_data| { |
47 | root_module: base.join(crate_data.root_module), | 48 | let is_workspace_member = crate_data.is_workspace_member.unwrap_or_else(|| { |
48 | edition: crate_data.edition.into(), | 49 | crate_data.root_module.is_relative() |
49 | deps: crate_data | 50 | && !crate_data.root_module.starts_with("..") |
50 | .deps | 51 | || crate_data.root_module.starts_with(base) |
51 | .into_iter() | 52 | }); |
52 | .map(|dep_data| Dependency { | 53 | Crate { |
53 | crate_id: CrateId(dep_data.krate as u32), | 54 | root_module: base.join(crate_data.root_module), |
54 | name: dep_data.name, | 55 | edition: crate_data.edition.into(), |
55 | }) | 56 | deps: crate_data |
56 | .collect::<Vec<_>>(), | 57 | .deps |
57 | cfg: { | 58 | .into_iter() |
58 | let mut cfg = CfgOptions::default(); | 59 | .map(|dep_data| Dependency { |
59 | for entry in &crate_data.cfg { | 60 | crate_id: CrateId(dep_data.krate as u32), |
60 | match split_delim(entry, '=') { | 61 | name: dep_data.name, |
61 | Some((key, value)) => { | 62 | }) |
62 | cfg.insert_key_value(key.into(), value.into()); | 63 | .collect::<Vec<_>>(), |
64 | cfg: { | ||
65 | let mut cfg = CfgOptions::default(); | ||
66 | for entry in &crate_data.cfg { | ||
67 | match split_delim(entry, '=') { | ||
68 | Some((key, value)) => { | ||
69 | cfg.insert_key_value(key.into(), value.into()); | ||
70 | } | ||
71 | None => cfg.insert_atom(entry.into()), | ||
63 | } | 72 | } |
64 | None => cfg.insert_atom(entry.into()), | ||
65 | } | 73 | } |
66 | } | 74 | cfg |
67 | cfg | 75 | }, |
68 | }, | 76 | target: crate_data.target, |
69 | target: crate_data.target, | 77 | out_dir: crate_data.out_dir.map(|it| base.join(it)), |
70 | out_dir: crate_data.out_dir.map(|it| base.join(it)), | 78 | proc_macro_dylib_path: crate_data |
71 | proc_macro_dylib_path: crate_data.proc_macro_dylib_path.map(|it| base.join(it)), | 79 | .proc_macro_dylib_path |
80 | .map(|it| base.join(it)), | ||
81 | is_workspace_member, | ||
82 | } | ||
72 | }) | 83 | }) |
73 | .collect::<Vec<_>>(), | 84 | .collect::<Vec<_>>(), |
74 | } | 85 | } |
@@ -91,6 +102,7 @@ struct CrateData { | |||
91 | target: Option<String>, | 102 | target: Option<String>, |
92 | out_dir: Option<PathBuf>, | 103 | out_dir: Option<PathBuf>, |
93 | proc_macro_dylib_path: Option<PathBuf>, | 104 | proc_macro_dylib_path: Option<PathBuf>, |
105 | is_workspace_member: Option<bool>, | ||
94 | } | 106 | } |
95 | 107 | ||
96 | #[derive(Deserialize)] | 108 | #[derive(Deserialize)] |
diff --git a/crates/vfs/src/loader.rs b/crates/vfs/src/loader.rs index 9c6e4b6a7..04e257f53 100644 --- a/crates/vfs/src/loader.rs +++ b/crates/vfs/src/loader.rs | |||
@@ -83,11 +83,11 @@ impl Directories { | |||
83 | self.includes_path(path) | 83 | self.includes_path(path) |
84 | } | 84 | } |
85 | fn includes_path(&self, path: &AbsPath) -> bool { | 85 | fn includes_path(&self, path: &AbsPath) -> bool { |
86 | let mut include = None; | 86 | let mut include: Option<&AbsPathBuf> = None; |
87 | for incl in &self.include { | 87 | for incl in &self.include { |
88 | if is_prefix(incl, path) { | 88 | if path.starts_with(incl) { |
89 | include = Some(match include { | 89 | include = Some(match include { |
90 | Some(prev) if is_prefix(incl, prev) => prev, | 90 | Some(prev) if prev.starts_with(incl) => prev, |
91 | _ => incl, | 91 | _ => incl, |
92 | }) | 92 | }) |
93 | } | 93 | } |
@@ -97,15 +97,11 @@ impl Directories { | |||
97 | None => return false, | 97 | None => return false, |
98 | }; | 98 | }; |
99 | for excl in &self.exclude { | 99 | for excl in &self.exclude { |
100 | if is_prefix(excl, path) && is_prefix(include, excl) { | 100 | if path.starts_with(excl) && excl.starts_with(include) { |
101 | return false; | 101 | return false; |
102 | } | 102 | } |
103 | } | 103 | } |
104 | return true; | 104 | true |
105 | |||
106 | fn is_prefix(short: &AbsPath, long: &AbsPath) -> bool { | ||
107 | long.strip_prefix(short).is_some() | ||
108 | } | ||
109 | } | 105 | } |
110 | } | 106 | } |
111 | 107 | ||