@@ -29,20 +29,28 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
29
29
let parent_node = tcx. hir ( ) . get ( parent_node_id) ;
30
30
31
31
match parent_node {
32
- // This matches on types who's paths couldn't be resolved without typeck'ing e.g.
32
+ // This match arm is for when the def_id appears in a GAT whose
33
+ // path can't be resolved without typechecking e.g.
33
34
//
34
35
// trait Foo {
35
- // type Assoc<const N1 : usize>;
36
+ // type Assoc<const N : usize>;
36
37
// fn foo() -> Self::Assoc<3>;
37
- // // note: if the def_id argument is the 3 then in this example
38
- // // parent_node would be the node for Self::Assoc<_>
39
38
// }
40
- // We didnt write <Self as Foo>::Assoc so the Self::Assoc<_> is lowered to QPath::TypeRelative.
39
+ //
40
+ // In the above code we would call this query with the def_id of 3 and
41
+ // the parent_node we match on would be the hir node for Self::Assoc<3>
42
+ //
43
+ // `Self::Assoc<3>` cant be resolved without typchecking here as we
44
+ // didnt write <Self as Foo>::Assoc<3>. If we did then another match
45
+ // arm would handle this.
46
+ //
41
47
// I believe this match arm is only needed for GAT but I am not 100% sure - BoxyUwU
42
48
Node :: Ty ( hir_ty @ Ty { kind : TyKind :: Path ( QPath :: TypeRelative ( _, segment) ) , .. } ) => {
43
- // Walk up from the parent_node to find an item so that
44
- // we can resolve the relative path to an actual associated type.
45
- // For the code example above, this item would be the Foo trait.
49
+ // Find the Item containing the associated type so we can create an ItemCtxt.
50
+ // Using the ItemCtxt convert the HIR for the unresolved assoc type into a
51
+ // ty which is a fully resolved projection.
52
+ // For the code example above, this would mean converting Self::Assoc<3>
53
+ // into a ty::Projection(<Self as Foo>::Assoc<3>)
46
54
let item_hir_id = tcx
47
55
. hir ( )
48
56
. parent_iter ( hir_id)
@@ -52,11 +60,12 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
52
60
. unwrap ( ) ;
53
61
let item_did = tcx. hir ( ) . local_def_id ( item_hir_id) . to_def_id ( ) ;
54
62
let item_ctxt = & ItemCtxt :: new ( tcx, item_did) as & dyn crate :: astconv:: AstConv < ' _ > ;
55
-
56
- // This ty will be the actual associated type so that we can
57
- // go through its generics to find which param our def_id corresponds to.
58
- // For the code example above, this ty would be the Assoc<const N1: usize>.
59
63
let ty = item_ctxt. ast_ty_to_ty ( hir_ty) ;
64
+
65
+ // Iterate through the generics of the projection to find the one that corresponds to
66
+ // the def_id that this query was called with. We filter to only const args here as a
67
+ // precaution for if it's ever allowed to elide lifetimes in GAT's. It currently isn't
68
+ // but it can't hurt to be safe ^^
60
69
if let ty:: Projection ( projection) = ty. kind ( ) {
61
70
let generics = tcx. generics_of ( projection. item_def_id ) ;
62
71
0 commit comments