diff options
Diffstat (limited to 'crates/project_model')
-rw-r--r-- | crates/project_model/src/build_data.rs | 6 | ||||
-rw-r--r-- | crates/project_model/src/cargo_workspace.rs | 43 |
2 files changed, 26 insertions, 23 deletions
diff --git a/crates/project_model/src/build_data.rs b/crates/project_model/src/build_data.rs index 3aa546980..33a4f8168 100644 --- a/crates/project_model/src/build_data.rs +++ b/crates/project_model/src/build_data.rs | |||
@@ -214,7 +214,7 @@ impl WorkspaceBuildData { | |||
214 | acc | 214 | acc |
215 | }; | 215 | }; |
216 | let package_build_data = | 216 | let package_build_data = |
217 | res.per_package.entry(package_id.repr.clone()).or_default(); | 217 | res.per_package.entry(package_id.repr).or_default(); |
218 | // cargo_metadata crate returns default (empty) path for | 218 | // cargo_metadata crate returns default (empty) path for |
219 | // older cargos, which is not absolute, so work around that. | 219 | // older cargos, which is not absolute, so work around that. |
220 | if !out_dir.as_str().is_empty() { | 220 | if !out_dir.as_str().is_empty() { |
@@ -237,13 +237,13 @@ impl WorkspaceBuildData { | |||
237 | { | 237 | { |
238 | let filename = AbsPathBuf::assert(PathBuf::from(&filename)); | 238 | let filename = AbsPathBuf::assert(PathBuf::from(&filename)); |
239 | let package_build_data = | 239 | let package_build_data = |
240 | res.per_package.entry(package_id.repr.clone()).or_default(); | 240 | res.per_package.entry(package_id.repr).or_default(); |
241 | package_build_data.proc_macro_dylib_path = Some(filename); | 241 | package_build_data.proc_macro_dylib_path = Some(filename); |
242 | } | 242 | } |
243 | } | 243 | } |
244 | } | 244 | } |
245 | Message::CompilerMessage(message) => { | 245 | Message::CompilerMessage(message) => { |
246 | progress(message.target.name.clone()); | 246 | progress(message.target.name); |
247 | } | 247 | } |
248 | Message::BuildFinished(_) => {} | 248 | Message::BuildFinished(_) => {} |
249 | Message::TextLine(_) => {} | 249 | Message::TextLine(_) => {} |
diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs index ad705c752..b8ad08364 100644 --- a/crates/project_model/src/cargo_workspace.rs +++ b/crates/project_model/src/cargo_workspace.rs | |||
@@ -121,7 +121,7 @@ pub struct PackageDependency { | |||
121 | pub kind: DepKind, | 121 | pub kind: DepKind, |
122 | } | 122 | } |
123 | 123 | ||
124 | #[derive(Debug, Clone, Eq, PartialEq)] | 124 | #[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Ord)] |
125 | pub enum DepKind { | 125 | pub enum DepKind { |
126 | /// Available to the library, binary, and dev targets in the package (but not the build script). | 126 | /// Available to the library, binary, and dev targets in the package (but not the build script). |
127 | Normal, | 127 | Normal, |
@@ -132,17 +132,23 @@ pub enum DepKind { | |||
132 | } | 132 | } |
133 | 133 | ||
134 | impl DepKind { | 134 | impl DepKind { |
135 | fn new(list: &[cargo_metadata::DepKindInfo]) -> Self { | 135 | fn iter(list: &[cargo_metadata::DepKindInfo]) -> impl Iterator<Item = Self> + '_ { |
136 | let mut dep_kinds = Vec::new(); | ||
137 | if list.is_empty() { | ||
138 | dep_kinds.push(Self::Normal); | ||
139 | } | ||
136 | for info in list { | 140 | for info in list { |
137 | match info.kind { | 141 | let kind = match info.kind { |
138 | cargo_metadata::DependencyKind::Normal => return Self::Normal, | 142 | cargo_metadata::DependencyKind::Normal => Self::Normal, |
139 | cargo_metadata::DependencyKind::Development => return Self::Dev, | 143 | cargo_metadata::DependencyKind::Development => Self::Dev, |
140 | cargo_metadata::DependencyKind::Build => return Self::Build, | 144 | cargo_metadata::DependencyKind::Build => Self::Build, |
141 | cargo_metadata::DependencyKind::Unknown => continue, | 145 | cargo_metadata::DependencyKind::Unknown => continue, |
142 | } | 146 | }; |
147 | dep_kinds.push(kind); | ||
143 | } | 148 | } |
144 | 149 | dep_kinds.sort_unstable(); | |
145 | Self::Normal | 150 | dep_kinds.dedup(); |
151 | dep_kinds.into_iter() | ||
146 | } | 152 | } |
147 | } | 153 | } |
148 | 154 | ||
@@ -317,7 +323,11 @@ impl CargoWorkspace { | |||
317 | } | 323 | } |
318 | }; | 324 | }; |
319 | node.deps.sort_by(|a, b| a.pkg.cmp(&b.pkg)); | 325 | node.deps.sort_by(|a, b| a.pkg.cmp(&b.pkg)); |
320 | for dep_node in node.deps { | 326 | for (dep_node, kind) in node |
327 | .deps | ||
328 | .iter() | ||
329 | .flat_map(|dep| DepKind::iter(&dep.dep_kinds).map(move |kind| (dep, kind))) | ||
330 | { | ||
321 | let pkg = match pkg_by_id.get(&dep_node.pkg) { | 331 | let pkg = match pkg_by_id.get(&dep_node.pkg) { |
322 | Some(&pkg) => pkg, | 332 | Some(&pkg) => pkg, |
323 | None => { | 333 | None => { |
@@ -328,11 +338,7 @@ impl CargoWorkspace { | |||
328 | continue; | 338 | continue; |
329 | } | 339 | } |
330 | }; | 340 | }; |
331 | let dep = PackageDependency { | 341 | let dep = PackageDependency { name: dep_node.name.clone(), pkg, kind }; |
332 | name: dep_node.name, | ||
333 | pkg, | ||
334 | kind: DepKind::new(&dep_node.dep_kinds), | ||
335 | }; | ||
336 | packages[source].dependencies.push(dep); | 342 | packages[source].dependencies.push(dep); |
337 | } | 343 | } |
338 | packages[source].active_features.extend(node.features); | 344 | packages[source].active_features.extend(node.features); |
@@ -340,11 +346,8 @@ impl CargoWorkspace { | |||
340 | 346 | ||
341 | let workspace_root = | 347 | let workspace_root = |
342 | AbsPathBuf::assert(PathBuf::from(meta.workspace_root.into_os_string())); | 348 | AbsPathBuf::assert(PathBuf::from(meta.workspace_root.into_os_string())); |
343 | let build_data_config = BuildDataConfig::new( | 349 | let build_data_config = |
344 | cargo_toml.to_path_buf(), | 350 | BuildDataConfig::new(cargo_toml.to_path_buf(), config.clone(), Arc::new(meta.packages)); |
345 | config.clone(), | ||
346 | Arc::new(meta.packages.clone()), | ||
347 | ); | ||
348 | 351 | ||
349 | Ok(CargoWorkspace { packages, targets, workspace_root, build_data_config }) | 352 | Ok(CargoWorkspace { packages, targets, workspace_root, build_data_config }) |
350 | } | 353 | } |