@@ -482,8 +482,8 @@ impl_from!(
482
482
/// Id of the anonymous const block expression and patterns. This is very similar to `ClosureId` and
483
483
/// shouldn't be a `DefWithBodyId` since its type inference is dependent on its parent.
484
484
#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash ) ]
485
- pub struct AnonymousConstId ( InternId ) ;
486
- impl_intern_key ! ( AnonymousConstId ) ;
485
+ pub struct ConstBlockId ( InternId ) ;
486
+ impl_intern_key ! ( ConstBlockId ) ;
487
487
488
488
#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash ) ]
489
489
pub enum TypeOwnerId {
@@ -563,7 +563,10 @@ impl From<GenericDefId> for TypeOwnerId {
563
563
}
564
564
}
565
565
566
- /// A thing that we want to store in interned ids, but we don't know its type in `hir-def`
566
+ /// A thing that we want to store in interned ids, but we don't know its type in `hir-def`. This is
567
+ /// currently only used in `InTypeConstId` for storing the type (which has type `Ty` defined in
568
+ /// the `hir-ty` crate) of the constant in its id, which is a temporary hack so we may want
569
+ /// to remove this after removing that.
567
570
pub trait OpaqueInternableThing :
568
571
std:: any:: Any + std:: fmt:: Debug + Sync + Send + UnwindSafe + RefUnwindSafe
569
572
{
@@ -594,6 +597,28 @@ impl Clone for Box<dyn OpaqueInternableThing> {
594
597
}
595
598
}
596
599
600
+ // FIXME(const-generic-body): Use an stable id for in type consts.
601
+ //
602
+ // The current id uses `AstId<ast::ConstArg>` which will be changed by every change in the code. Ideally
603
+ // we should use an id which is relative to the type owner, so that every change will only invalidate the
604
+ // id if it happens inside of the type owner.
605
+ //
606
+ // The solution probably is to have some query on `TypeOwnerId` to traverse its constant children and store
607
+ // their `AstId` in a list (vector or arena), and use the index of that list in the id here. That query probably
608
+ // needs name resolution, and might go far and handles the whole path lowering or type lowering for a `TypeOwnerId`.
609
+ //
610
+ // Whatever path the solution takes, it should answer 3 questions at the same time:
611
+ // * Is the id stable enough?
612
+ // * How to find a constant id using an ast node / position in the source code? This is needed when we want to
613
+ // provide ide functionalities inside an in type const (which we currently don't support) e.g. go to definition
614
+ // for a local defined there. A complex id might have some trouble in this reverse mapping.
615
+ // * How to find the return type of a constant using its id? We have this data when we are doing type lowering
616
+ // and the name of the struct that contains this constant is resolved, so a query that only traverses the
617
+ // type owner by its syntax tree might have a hard time here.
618
+
619
+ /// A constant in a type as a substitution for const generics (like `Foo<{ 2 + 2 }>`) or as an array
620
+ /// length (like `[u8; 2 + 2]`). These constants are body owner and are a variant of `DefWithBodyId`. These
621
+ /// are not called `AnonymousConstId` to prevent confusion with [`ConstBlockId`].
597
622
#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash ) ]
598
623
pub struct InTypeConstId ( InternId ) ;
599
624
type InTypeConstLoc = ( AstId < ast:: ConstArg > , TypeOwnerId , Box < dyn OpaqueInternableThing > ) ;
@@ -613,17 +638,17 @@ impl InTypeConstId {
613
638
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
614
639
pub enum GeneralConstId {
615
640
ConstId ( ConstId ) ,
616
- AnonymousConstId ( AnonymousConstId ) ,
641
+ ConstBlockId ( ConstBlockId ) ,
617
642
InTypeConstId ( InTypeConstId ) ,
618
643
}
619
644
620
- impl_from ! ( ConstId , AnonymousConstId , InTypeConstId for GeneralConstId ) ;
645
+ impl_from ! ( ConstId , ConstBlockId , InTypeConstId for GeneralConstId ) ;
621
646
622
647
impl GeneralConstId {
623
648
pub fn generic_def ( self , db : & dyn db:: DefDatabase ) -> Option < GenericDefId > {
624
649
match self {
625
650
GeneralConstId :: ConstId ( x) => Some ( x. into ( ) ) ,
626
- GeneralConstId :: AnonymousConstId ( x) => {
651
+ GeneralConstId :: ConstBlockId ( x) => {
627
652
let ( parent, _) = db. lookup_intern_anonymous_const ( x) ;
628
653
parent. as_generic_def_id ( )
629
654
}
@@ -643,7 +668,7 @@ impl GeneralConstId {
643
668
. and_then ( |x| x. as_str ( ) )
644
669
. unwrap_or ( "_" )
645
670
. to_owned ( ) ,
646
- GeneralConstId :: AnonymousConstId ( id) => format ! ( "{{anonymous const {id:?}}}" ) ,
671
+ GeneralConstId :: ConstBlockId ( id) => format ! ( "{{anonymous const {id:?}}}" ) ,
647
672
GeneralConstId :: InTypeConstId ( id) => format ! ( "{{in type const {id:?}}}" ) ,
648
673
}
649
674
}
0 commit comments