Skip to content

Commit d3cb032

Browse files
committed
Make assoc_resolutions always have a Substitution
1 parent a3ea20a commit d3cb032

File tree

4 files changed

+16
-26
lines changed

4 files changed

+16
-26
lines changed

crates/hir-ty/src/consteval.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -356,11 +356,12 @@ pub fn eval_const(
356356
hir_def::AssocItemId::FunctionId(_) => {
357357
Err(ConstEvalError::NotSupported("assoc function"))
358358
}
359+
// FIXME use actual impl for trait assoc const
359360
hir_def::AssocItemId::ConstId(c) => ctx.db.const_eval(c),
360361
hir_def::AssocItemId::TypeAliasId(_) => {
361362
Err(ConstEvalError::NotSupported("assoc type alias"))
362363
}
363-
}
364+
};
364365
}
365366
};
366367
match pr {

crates/hir-ty/src/infer.rs

+4-15
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ pub struct InferenceResult {
349349
/// For each struct literal or pattern, records the variant it resolves to.
350350
variant_resolutions: FxHashMap<ExprOrPatId, VariantId>,
351351
/// For each associated item record what it resolves to
352-
assoc_resolutions: FxHashMap<ExprOrPatId, (AssocItemId, Option<Substitution>)>,
352+
assoc_resolutions: FxHashMap<ExprOrPatId, (AssocItemId, Substitution)>,
353353
pub diagnostics: Vec<InferenceDiagnostic>,
354354
pub type_of_expr: ArenaMap<ExprId, Ty>,
355355
/// For each pattern record the type it resolves to.
@@ -379,16 +379,10 @@ impl InferenceResult {
379379
pub fn variant_resolution_for_pat(&self, id: PatId) -> Option<VariantId> {
380380
self.variant_resolutions.get(&id.into()).copied()
381381
}
382-
pub fn assoc_resolutions_for_expr(
383-
&self,
384-
id: ExprId,
385-
) -> Option<(AssocItemId, Option<Substitution>)> {
382+
pub fn assoc_resolutions_for_expr(&self, id: ExprId) -> Option<(AssocItemId, Substitution)> {
386383
self.assoc_resolutions.get(&id.into()).cloned()
387384
}
388-
pub fn assoc_resolutions_for_pat(
389-
&self,
390-
id: PatId,
391-
) -> Option<(AssocItemId, Option<Substitution>)> {
385+
pub fn assoc_resolutions_for_pat(&self, id: PatId) -> Option<(AssocItemId, Substitution)> {
392386
self.assoc_resolutions.get(&id.into()).cloned()
393387
}
394388
pub fn type_mismatch_for_expr(&self, expr: ExprId) -> Option<&TypeMismatch> {
@@ -653,12 +647,7 @@ impl<'a> InferenceContext<'a> {
653647
self.result.variant_resolutions.insert(id, variant);
654648
}
655649

656-
fn write_assoc_resolution(
657-
&mut self,
658-
id: ExprOrPatId,
659-
item: AssocItemId,
660-
subs: Option<Substitution>,
661-
) {
650+
fn write_assoc_resolution(&mut self, id: ExprOrPatId, item: AssocItemId, subs: Substitution) {
662651
self.result.assoc_resolutions.insert(id, (item, subs));
663652
}
664653

crates/hir-ty/src/infer/path.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use hir_def::{
77
AdtId, AssocItemId, EnumVariantId, ItemContainerId, Lookup,
88
};
99
use hir_expand::name::Name;
10+
use stdx::never;
1011

1112
use crate::{
1213
builder::ParamKind,
@@ -212,7 +213,7 @@ impl<'a> InferenceContext<'a> {
212213
AssocItemId::TypeAliasId(_) => unreachable!(),
213214
};
214215

215-
self.write_assoc_resolution(id, item, Some(trait_ref.substitution.clone()));
216+
self.write_assoc_resolution(id, item, trait_ref.substitution.clone());
216217
Some((def, Some(trait_ref.substitution)))
217218
}
218219

@@ -259,7 +260,7 @@ impl<'a> InferenceContext<'a> {
259260
let impl_self_ty =
260261
self.db.impl_self_ty(impl_id).substitute(Interner, &impl_substs);
261262
self.unify(&impl_self_ty, &ty);
262-
Some(impl_substs)
263+
impl_substs
263264
}
264265
ItemContainerId::TraitId(trait_) => {
265266
// we're picking this method
@@ -268,13 +269,16 @@ impl<'a> InferenceContext<'a> {
268269
.fill_with_inference_vars(&mut self.table)
269270
.build();
270271
self.push_obligation(trait_ref.clone().cast(Interner));
271-
Some(trait_ref.substitution)
272+
trait_ref.substitution
273+
}
274+
ItemContainerId::ModuleId(_) | ItemContainerId::ExternBlockId(_) => {
275+
never!("assoc item contained in module/extern block");
276+
return None;
272277
}
273-
ItemContainerId::ModuleId(_) | ItemContainerId::ExternBlockId(_) => None,
274278
};
275279

276280
self.write_assoc_resolution(id, item, substs.clone());
277-
Some((def, substs))
281+
Some((def, Some(substs)))
278282
},
279283
)
280284
}

crates/hir/src/source_analyzer.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -502,11 +502,7 @@ impl SourceAnalyzer {
502502
}
503503
}
504504
AssocItemId::ConstId(const_id) => {
505-
if let Some(subs) = subs {
506-
self.resolve_impl_const_or_trait_def(db, const_id, subs).into()
507-
} else {
508-
assoc
509-
}
505+
self.resolve_impl_const_or_trait_def(db, const_id, subs).into()
510506
}
511507
_ => assoc,
512508
};

0 commit comments

Comments
 (0)