diff options
| author | Florian Diebold <flodiebold@gmail.com> | 2022-12-10 17:05:33 +0100 |
|---|---|---|
| committer | Florian Diebold <flodiebold@gmail.com> | 2022-12-10 17:05:33 +0100 |
| commit | d3cb032f7e81359da943890629e605f6cf294bd3 (patch) | |
| tree | 21eb7923d9cb7b72f67342c6f6ddcef145b9d7a4 | |
| parent | a3ea20a14249fe3019d4e3f1063d596e036cd3b7 (diff) | |
| download | rust-d3cb032f7e81359da943890629e605f6cf294bd3.tar.gz rust-d3cb032f7e81359da943890629e605f6cf294bd3.zip | |
Make assoc_resolutions always have a Substitution
| -rw-r--r-- | crates/hir-ty/src/consteval.rs | 3 | ||||
| -rw-r--r-- | crates/hir-ty/src/infer.rs | 19 | ||||
| -rw-r--r-- | crates/hir-ty/src/infer/path.rs | 14 | ||||
| -rw-r--r-- | crates/hir/src/source_analyzer.rs | 6 |
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, }; |
