about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Diebold <flodiebold@gmail.com>2022-12-10 17:05:33 +0100
committerFlorian Diebold <flodiebold@gmail.com>2022-12-10 17:05:33 +0100
commitd3cb032f7e81359da943890629e605f6cf294bd3 (patch)
tree21eb7923d9cb7b72f67342c6f6ddcef145b9d7a4
parenta3ea20a14249fe3019d4e3f1063d596e036cd3b7 (diff)
downloadrust-d3cb032f7e81359da943890629e605f6cf294bd3.tar.gz
rust-d3cb032f7e81359da943890629e605f6cf294bd3.zip
Make assoc_resolutions always have a Substitution
-rw-r--r--crates/hir-ty/src/consteval.rs3
-rw-r--r--crates/hir-ty/src/infer.rs19
-rw-r--r--crates/hir-ty/src/infer/path.rs14
-rw-r--r--crates/hir/src/source_analyzer.rs6
4 files changed, 16 insertions, 26 deletions
diff --git a/crates/hir-ty/src/consteval.rs b/crates/hir-ty/src/consteval.rs
index e4714f5ab9e..34096852570 100644
--- a/crates/hir-ty/src/consteval.rs
+++ b/crates/hir-ty/src/consteval.rs
@@ -356,11 +356,12 @@ pub fn eval_const(
                         hir_def::AssocItemId::FunctionId(_) => {
                             Err(ConstEvalError::NotSupported("assoc function"))
                         }
+                        // FIXME use actual impl for trait assoc const
                         hir_def::AssocItemId::ConstId(c) => ctx.db.const_eval(c),
                         hir_def::AssocItemId::TypeAliasId(_) => {
                             Err(ConstEvalError::NotSupported("assoc type alias"))
                         }
-                    }
+                    };
                 }
             };
             match pr {
diff --git a/crates/hir-ty/src/infer.rs b/crates/hir-ty/src/infer.rs
index 6df64ceee6d..a42f8a0ac02 100644
--- a/crates/hir-ty/src/infer.rs
+++ b/crates/hir-ty/src/infer.rs
@@ -349,7 +349,7 @@ pub struct InferenceResult {
     /// For each struct literal or pattern, records the variant it resolves to.
     variant_resolutions: FxHashMap<ExprOrPatId, VariantId>,
     /// For each associated item record what it resolves to
-    assoc_resolutions: FxHashMap<ExprOrPatId, (AssocItemId, Option<Substitution>)>,
+    assoc_resolutions: FxHashMap<ExprOrPatId, (AssocItemId, Substitution)>,
     pub diagnostics: Vec<InferenceDiagnostic>,
     pub type_of_expr: ArenaMap<ExprId, Ty>,
     /// For each pattern record the type it resolves to.
@@ -379,16 +379,10 @@ impl InferenceResult {
     pub fn variant_resolution_for_pat(&self, id: PatId) -> Option<VariantId> {
         self.variant_resolutions.get(&id.into()).copied()
     }
-    pub fn assoc_resolutions_for_expr(
-        &self,
-        id: ExprId,
-    ) -> Option<(AssocItemId, Option<Substitution>)> {
+    pub fn assoc_resolutions_for_expr(&self, id: ExprId) -> Option<(AssocItemId, Substitution)> {
         self.assoc_resolutions.get(&id.into()).cloned()
     }
-    pub fn assoc_resolutions_for_pat(
-        &self,
-        id: PatId,
-    ) -> Option<(AssocItemId, Option<Substitution>)> {
+    pub fn assoc_resolutions_for_pat(&self, id: PatId) -> Option<(AssocItemId, Substitution)> {
         self.assoc_resolutions.get(&id.into()).cloned()
     }
     pub fn type_mismatch_for_expr(&self, expr: ExprId) -> Option<&TypeMismatch> {
@@ -653,12 +647,7 @@ impl<'a> InferenceContext<'a> {
         self.result.variant_resolutions.insert(id, variant);
     }
 
-    fn write_assoc_resolution(
-        &mut self,
-        id: ExprOrPatId,
-        item: AssocItemId,
-        subs: Option<Substitution>,
-    ) {
+    fn write_assoc_resolution(&mut self, id: ExprOrPatId, item: AssocItemId, subs: Substitution) {
         self.result.assoc_resolutions.insert(id, (item, subs));
     }
 
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs
index c1666c60e97..6cad84eb4f2 100644
--- a/crates/hir-ty/src/infer/path.rs
+++ b/crates/hir-ty/src/infer/path.rs
@@ -7,6 +7,7 @@ use hir_def::{
     AdtId, AssocItemId, EnumVariantId, ItemContainerId, Lookup,
 };
 use hir_expand::name::Name;
+use stdx::never;
 
 use crate::{
     builder::ParamKind,
@@ -212,7 +213,7 @@ impl<'a> InferenceContext<'a> {
             AssocItemId::TypeAliasId(_) => unreachable!(),
         };
 
-        self.write_assoc_resolution(id, item, Some(trait_ref.substitution.clone()));
+        self.write_assoc_resolution(id, item, trait_ref.substitution.clone());
         Some((def, Some(trait_ref.substitution)))
     }
 
@@ -259,7 +260,7 @@ impl<'a> InferenceContext<'a> {
                         let impl_self_ty =
                             self.db.impl_self_ty(impl_id).substitute(Interner, &impl_substs);
                         self.unify(&impl_self_ty, &ty);
-                        Some(impl_substs)
+                        impl_substs
                     }
                     ItemContainerId::TraitId(trait_) => {
                         // we're picking this method
@@ -268,13 +269,16 @@ impl<'a> InferenceContext<'a> {
                             .fill_with_inference_vars(&mut self.table)
                             .build();
                         self.push_obligation(trait_ref.clone().cast(Interner));
-                        Some(trait_ref.substitution)
+                        trait_ref.substitution
+                    }
+                    ItemContainerId::ModuleId(_) | ItemContainerId::ExternBlockId(_) => {
+                        never!("assoc item contained in module/extern block");
+                        return None;
                     }
-                    ItemContainerId::ModuleId(_) | ItemContainerId::ExternBlockId(_) => None,
                 };
 
                 self.write_assoc_resolution(id, item, substs.clone());
-                Some((def, substs))
+                Some((def, Some(substs)))
             },
         )
     }
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index a362570dd8b..5e444db4a14 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -502,11 +502,7 @@ impl SourceAnalyzer {
                             }
                         }
                         AssocItemId::ConstId(const_id) => {
-                            if let Some(subs) = subs {
-                                self.resolve_impl_const_or_trait_def(db, const_id, subs).into()
-                            } else {
-                                assoc
-                            }
+                            self.resolve_impl_const_or_trait_def(db, const_id, subs).into()
                         }
                         _ => assoc,
                     };