@@ -482,8 +482,8 @@ impl_from!(
482482/// Id of the anonymous const block expression and patterns. This is very similar to `ClosureId` and
483483/// shouldn't be a `DefWithBodyId` since its type inference is dependent on its parent.
484484#[ 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 ) ;
487487
488488#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash ) ]
489489pub enum TypeOwnerId {
@@ -563,7 +563,10 @@ impl From<GenericDefId> for TypeOwnerId {
563563 }
564564}
565565
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.
567570pub trait OpaqueInternableThing :
568571 std:: any:: Any + std:: fmt:: Debug + Sync + Send + UnwindSafe + RefUnwindSafe
569572{
@@ -594,6 +597,28 @@ impl Clone for Box<dyn OpaqueInternableThing> {
594597 }
595598}
596599
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`].
597622#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash ) ]
598623pub struct InTypeConstId ( InternId ) ;
599624type InTypeConstLoc = ( AstId < ast:: ConstArg > , TypeOwnerId , Box < dyn OpaqueInternableThing > ) ;
@@ -613,17 +638,17 @@ impl InTypeConstId {
613638#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
614639pub enum GeneralConstId {
615640 ConstId ( ConstId ) ,
616- AnonymousConstId ( AnonymousConstId ) ,
641+ ConstBlockId ( ConstBlockId ) ,
617642 InTypeConstId ( InTypeConstId ) ,
618643}
619644
620- impl_from ! ( ConstId , AnonymousConstId , InTypeConstId for GeneralConstId ) ;
645+ impl_from ! ( ConstId , ConstBlockId , InTypeConstId for GeneralConstId ) ;
621646
622647impl GeneralConstId {
623648 pub fn generic_def ( self , db : & dyn db:: DefDatabase ) -> Option < GenericDefId > {
624649 match self {
625650 GeneralConstId :: ConstId ( x) => Some ( x. into ( ) ) ,
626- GeneralConstId :: AnonymousConstId ( x) => {
651+ GeneralConstId :: ConstBlockId ( x) => {
627652 let ( parent, _) = db. lookup_intern_anonymous_const ( x) ;
628653 parent. as_generic_def_id ( )
629654 }
@@ -643,7 +668,7 @@ impl GeneralConstId {
643668 . and_then ( |x| x. as_str ( ) )
644669 . unwrap_or ( "_" )
645670 . to_owned ( ) ,
646- GeneralConstId :: AnonymousConstId ( id) => format ! ( "{{anonymous const {id:?}}}" ) ,
671+ GeneralConstId :: ConstBlockId ( id) => format ! ( "{{anonymous const {id:?}}}" ) ,
647672 GeneralConstId :: InTypeConstId ( id) => format ! ( "{{in type const {id:?}}}" ) ,
648673 }
649674 }
0 commit comments