Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/base_db/src/input.rs')
-rw-r--r--crates/base_db/src/input.rs69
1 files changed, 49 insertions, 20 deletions
diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs
index 565d0c02cf..1dd7783b0e 100644
--- a/crates/base_db/src/input.rs
+++ b/crates/base_db/src/input.rs
@@ -217,6 +217,22 @@ pub struct Env {
pub struct Dependency {
pub crate_id: CrateId,
pub name: CrateName,
+ prelude: bool,
+}
+
+impl Dependency {
+ pub fn new(name: CrateName, crate_id: CrateId) -> Self {
+ Self { name, crate_id, prelude: true }
+ }
+
+ pub fn with_prelude(name: CrateName, crate_id: CrateId, prelude: bool) -> Self {
+ Self { name, crate_id, prelude }
+ }
+
+ /// Whether this dependency is to be added to the depending crate's extern prelude.
+ pub fn is_prelude(&self) -> bool {
+ self.prelude
+ }
}
impl CrateGraph {
@@ -249,22 +265,21 @@ impl CrateGraph {
pub fn add_dep(
&mut self,
from: CrateId,
- name: CrateName,
- to: CrateId,
+ dep: Dependency,
) -> Result<(), CyclicDependenciesError> {
let _p = profile::span("add_dep");
// Check if adding a dep from `from` to `to` creates a cycle. To figure
// that out, look for a path in the *opposite* direction, from `to` to
// `from`.
- if let Some(path) = self.find_path(&mut FxHashSet::default(), to, from) {
+ if let Some(path) = self.find_path(&mut FxHashSet::default(), dep.crate_id, from) {
let path = path.into_iter().map(|it| (it, self[it].display_name.clone())).collect();
let err = CyclicDependenciesError { path };
- assert!(err.from().0 == from && err.to().0 == to);
+ assert!(err.from().0 == from && err.to().0 == dep.crate_id);
return Err(err);
}
- self.arena.get_mut(&from).unwrap().add_dep(name, to);
+ self.arena.get_mut(&from).unwrap().add_dep(dep);
Ok(())
}
@@ -409,7 +424,7 @@ impl CrateGraph {
.get_mut(&std)
.unwrap()
.dependencies
- .push(Dependency { crate_id: cfg_if, name: CrateName::new("cfg_if").unwrap() });
+ .push(Dependency::new(CrateName::new("cfg_if").unwrap(), cfg_if));
true
}
_ => false,
@@ -435,8 +450,8 @@ impl CrateId {
}
impl CrateData {
- fn add_dep(&mut self, name: CrateName, crate_id: CrateId) {
- self.dependencies.push(Dependency { crate_id, name })
+ fn add_dep(&mut self, dep: Dependency) {
+ self.dependencies.push(dep)
}
}
@@ -562,9 +577,15 @@ mod tests {
Env::default(),
Default::default(),
);
- assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
- assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
- assert!(graph.add_dep(crate3, CrateName::new("crate1").unwrap(), crate1).is_err());
+ assert!(graph
+ .add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
+ .is_ok());
+ assert!(graph
+ .add_dep(crate2, Dependency::new(CrateName::new("crate3").unwrap(), crate3))
+ .is_ok());
+ assert!(graph
+ .add_dep(crate3, Dependency::new(CrateName::new("crate1").unwrap(), crate1))
+ .is_err());
}
#[test]
@@ -588,8 +609,12 @@ mod tests {
Env::default(),
Default::default(),
);
- assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
- assert!(graph.add_dep(crate2, CrateName::new("crate2").unwrap(), crate2).is_err());
+ assert!(graph
+ .add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
+ .is_ok());
+ assert!(graph
+ .add_dep(crate2, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
+ .is_err());
}
#[test]
@@ -622,8 +647,12 @@ mod tests {
Env::default(),
Default::default(),
);
- assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
- assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
+ assert!(graph
+ .add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
+ .is_ok());
+ assert!(graph
+ .add_dep(crate2, Dependency::new(CrateName::new("crate3").unwrap(), crate3))
+ .is_ok());
}
#[test]
@@ -648,14 +677,14 @@ mod tests {
Default::default(),
);
assert!(graph
- .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2)
+ .add_dep(
+ crate1,
+ Dependency::new(CrateName::normalize_dashes("crate-name-with-dashes"), crate2)
+ )
.is_ok());
assert_eq!(
graph[crate1].dependencies,
- vec![Dependency {
- crate_id: crate2,
- name: CrateName::new("crate_name_with_dashes").unwrap()
- }]
+ vec![Dependency::new(CrateName::new("crate_name_with_dashes").unwrap(), crate2)]
);
}
}