@@ -30,11 +30,18 @@ impl<'a> InferenceContext<'a> {
30
30
31
31
fn resolve_value_path ( & mut self , path : & Path , id : ExprOrPatId ) -> Option < Ty > {
32
32
let ( value, self_subst) = if let Some ( type_ref) = path. type_anchor ( ) {
33
- let Some ( last) = path. segments ( ) . last ( ) else { return None } ;
34
- let ty = self . make_ty ( type_ref ) ;
35
- let remaining_segments_for_ty = path . segments ( ) . take ( path . segments ( ) . len ( ) - 1 ) ;
33
+ let last = path. segments ( ) . last ( ) ? ;
34
+
35
+ // Don't use `self.make_ty()` here as we need `orig_ns`.
36
36
let ctx = crate :: lower:: TyLoweringContext :: new ( self . db , & self . resolver ) ;
37
- let ( ty, _) = ctx. lower_ty_relative_path ( ty, None , remaining_segments_for_ty) ;
37
+ let ( ty, orig_ns) = ctx. lower_ty_ext ( type_ref) ;
38
+ let ty = self . table . insert_type_vars ( ty) ;
39
+ let ty = self . table . normalize_associated_types_in ( ty) ;
40
+
41
+ let remaining_segments_for_ty = path. segments ( ) . take ( path. segments ( ) . len ( ) - 1 ) ;
42
+ let ( ty, _) = ctx. lower_ty_relative_path ( ty, orig_ns, remaining_segments_for_ty) ;
43
+ let ty = self . table . insert_type_vars ( ty) ;
44
+ let ty = self . table . normalize_associated_types_in ( ty) ;
38
45
self . resolve_ty_assoc_item ( ty, last. name , id) . map ( |( it, substs) | ( it, Some ( substs) ) ) ?
39
46
} else {
40
47
// FIXME: report error, unresolved first path segment
@@ -169,7 +176,7 @@ impl<'a> InferenceContext<'a> {
169
176
) -> Option < ( ValueNs , Substitution ) > {
170
177
let trait_ = trait_ref. hir_trait_id ( ) ;
171
178
let item =
172
- self . db . trait_data ( trait_) . items . iter ( ) . map ( |( _name, id) | ( * id) ) . find_map ( |item| {
179
+ self . db . trait_data ( trait_) . items . iter ( ) . map ( |( _name, id) | * id) . find_map ( |item| {
173
180
match item {
174
181
AssocItemId :: FunctionId ( func) => {
175
182
if segment. name == & self . db . function_data ( func) . name {
@@ -288,7 +295,7 @@ impl<'a> InferenceContext<'a> {
288
295
name : & Name ,
289
296
id : ExprOrPatId ,
290
297
) -> Option < ( ValueNs , Substitution ) > {
291
- let ty = self . resolve_ty_shallow ( ty) ;
298
+ let ty = self . resolve_ty_shallow ( & ty) ;
292
299
let ( enum_id, subst) = match ty. as_adt ( ) {
293
300
Some ( ( AdtId :: EnumId ( e) , subst) ) => ( e, subst) ,
294
301
_ => return None ,
0 commit comments