diff options
| author | bors <bors@rust-lang.org> | 2022-09-13 14:52:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-09-13 14:52:58 +0000 |
| commit | ba15f75c39acf488d1fc4cc11cfc1cbb3dda0f7a (patch) | |
| tree | 291121349b3bb6fe7c9090304326d0d779bd9a4c | |
| parent | 125d43cb2c1107e081d1c8816faf4437bd911da1 (diff) | |
| parent | d223c28c7d89de5a6f040e254c8a602ae7d48814 (diff) | |
| download | rust-ba15f75c39acf488d1fc4cc11cfc1cbb3dda0f7a.tar.gz rust-ba15f75c39acf488d1fc4cc11cfc1cbb3dda0f7a.zip | |
Auto merge of #13225 - lowr:fix/hir-proj-normalization, r=Veykril
fixup: remove unnecessary `Option` Fixup for #13223, two things: - `normalize_projection_query()` (and consequently `HirDatabase::normalize_projection()`) never returns `None` (well, it used to when I first wrote it...), so just return `Ty` instead of `Option<Ty>` - When chalk cannot normalize projection uniquely, `normalize_trait_assoc_type()` used to return `None` before #13223, but not anymore because of the first point. I restored the behavior so its callers work as before.
| -rw-r--r-- | crates/hir-ty/src/db.rs | 2 | ||||
| -rw-r--r-- | crates/hir-ty/src/traits.rs | 6 | ||||
| -rw-r--r-- | crates/hir/src/lib.rs | 7 |
3 files changed, 10 insertions, 5 deletions
diff --git a/crates/hir-ty/src/db.rs b/crates/hir-ty/src/db.rs index dd5639f00d2..69283e55a4c 100644 --- a/crates/hir-ty/src/db.rs +++ b/crates/hir-ty/src/db.rs @@ -156,7 +156,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { &self, projection: crate::ProjectionTy, env: Arc<crate::TraitEnvironment>, - ) -> Option<crate::Ty>; + ) -> Ty; #[salsa::invoke(trait_solve_wait)] #[salsa::transparent] diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs index aaff894b34f..372c3a3cca6 100644 --- a/crates/hir-ty/src/traits.rs +++ b/crates/hir-ty/src/traits.rs @@ -69,10 +69,10 @@ pub(crate) fn normalize_projection_query( db: &dyn HirDatabase, projection: ProjectionTy, env: Arc<TraitEnvironment>, -) -> Option<Ty> { - let mut table = InferenceTable::new(db, env.clone()); +) -> Ty { + let mut table = InferenceTable::new(db, env); let ty = table.normalize_projection_ty(projection); - Some(table.resolve_completely(ty)) + table.resolve_completely(ty) } /// Solve a trait goal using Chalk. diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index b5974a0cfc9..d2717c56654 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -2892,7 +2892,12 @@ impl Type { }) .build(); - db.normalize_projection(projection, self.env.clone()).map(|ty| self.derived(ty)) + let ty = db.normalize_projection(projection, self.env.clone()); + if ty.is_unknown() { + None + } else { + Some(self.derived(ty)) + } } pub fn is_copy(&self, db: &dyn HirDatabase) -> bool { |
