@@ -58,7 +58,8 @@ use crate::{
5858 ConcreteEnumId , ConcreteExternTypeId , ConcreteFunction , ConcreteFunctionWithBodyId ,
5959 ConcreteImplId , ConcreteImplLongId , ConcreteStructId , ConcreteTraitId , ConcreteTraitLongId ,
6060 ConcreteTypeId , ConcreteVariant , ExprVar , ExprVarMemberPath , FunctionId , FunctionLongId ,
61- GenericArgumentId , GenericParam , MatchArmSelector , TypeId , TypeLongId , ValueSelectorArm ,
61+ GenericArgumentId , GenericParam , MatchArmSelector , MemberAccessKind , TypeId , TypeLongId ,
62+ ValueSelectorArm ,
6263} ;
6364
6465type SemanticCache < ' db > = ( CrateSemanticCache , SemanticCacheLookups ) ;
@@ -476,13 +477,56 @@ impl FeatureKindCached {
476477 }
477478}
478479
480+ #[ derive( Serialize , Deserialize ) ]
481+ pub enum MemberAccessKindCached {
482+ Struct { concrete_struct_id : ConcreteStructCached , member_id : LanguageElementCached } ,
483+ Index { tuple_ty : TypeIdCached , index : usize } ,
484+ }
485+ impl MemberAccessKindCached {
486+ pub fn new < ' db > (
487+ kind : MemberAccessKind < ' db > ,
488+ ctx : & mut SemanticCacheSavingContext < ' db > ,
489+ ) -> Self {
490+ match kind {
491+ MemberAccessKind :: Struct { concrete_struct_id, member_id } => {
492+ MemberAccessKindCached :: Struct {
493+ concrete_struct_id : ConcreteStructCached :: new ( concrete_struct_id, ctx) ,
494+ member_id : LanguageElementCached :: new ( member_id, & mut ctx. defs_ctx ) ,
495+ }
496+ }
497+ MemberAccessKind :: Index { tuple_ty, index } => {
498+ MemberAccessKindCached :: Index { tuple_ty : TypeIdCached :: new ( tuple_ty, ctx) , index }
499+ }
500+ }
501+ }
502+ pub fn get_embedded < ' db > (
503+ self ,
504+ data : & Arc < SemanticCacheLoadingData < ' db > > ,
505+ db : & ' db dyn Database ,
506+ ) -> MemberAccessKind < ' db > {
507+ match self {
508+ MemberAccessKindCached :: Struct { concrete_struct_id, member_id } => {
509+ let ( module_id, member_stable_ptr) =
510+ member_id. get_embedded ( & data. defs_loading_data ) ;
511+ let member_id = MemberLongId ( module_id, MemberPtr ( member_stable_ptr) ) . intern ( db) ;
512+ MemberAccessKind :: Struct {
513+ concrete_struct_id : concrete_struct_id. get_embedded ( data, db) ,
514+ member_id,
515+ }
516+ }
517+ MemberAccessKindCached :: Index { tuple_ty, index } => {
518+ MemberAccessKind :: Index { tuple_ty : tuple_ty. get_embedded ( data) , index }
519+ }
520+ }
521+ }
522+ }
523+
479524#[ derive( Serialize , Deserialize ) ]
480525pub enum ExprVarMemberPathCached {
481526 Var ( ExprVarCached ) ,
482527 Member {
483528 parent : Box < ExprVarMemberPathCached > ,
484- member_id : LanguageElementCached ,
485- concrete_struct_id : ConcreteStructCached ,
529+ kind : MemberAccessKindCached ,
486530 stable_ptr : SyntaxStablePtrIdCached ,
487531 ty : TypeIdCached ,
488532 } ,
@@ -496,11 +540,10 @@ impl ExprVarMemberPathCached {
496540 ExprVarMemberPath :: Var ( var) => {
497541 ExprVarMemberPathCached :: Var ( ExprVarCached :: new ( var, ctx) )
498542 }
499- ExprVarMemberPath :: Member { parent, member_id , concrete_struct_id , stable_ptr, ty } => {
543+ ExprVarMemberPath :: Member { parent, kind , stable_ptr, ty } => {
500544 ExprVarMemberPathCached :: Member {
501545 parent : Box :: new ( ExprVarMemberPathCached :: new ( * parent, ctx) ) ,
502- member_id : LanguageElementCached :: new ( member_id, & mut ctx. defs_ctx ) ,
503- concrete_struct_id : ConcreteStructCached :: new ( concrete_struct_id, ctx) ,
546+ kind : MemberAccessKindCached :: new ( kind, ctx) ,
504547 stable_ptr : SyntaxStablePtrIdCached :: new (
505548 stable_ptr. untyped ( ) ,
506549 & mut ctx. defs_ctx ,
@@ -517,21 +560,11 @@ impl ExprVarMemberPathCached {
517560 ) -> ExprVarMemberPath < ' db > {
518561 match self {
519562 ExprVarMemberPathCached :: Var ( var) => ExprVarMemberPath :: Var ( var. get_embedded ( data, db) ) ,
520- ExprVarMemberPathCached :: Member {
521- parent,
522- member_id,
523- concrete_struct_id,
524- stable_ptr,
525- ty,
526- } => {
563+ ExprVarMemberPathCached :: Member { parent, kind, stable_ptr, ty } => {
527564 let parent = Box :: new ( parent. get_embedded ( data, db) ) ;
528- let ( module_id, member_stable_ptr) =
529- member_id. get_embedded ( & data. defs_loading_data ) ;
530- let member_id = MemberLongId ( module_id, MemberPtr ( member_stable_ptr) ) . intern ( db) ;
531565 ExprVarMemberPath :: Member {
532566 parent,
533- member_id,
534- concrete_struct_id : concrete_struct_id. get_embedded ( data, db) ,
567+ kind : kind. get_embedded ( data, db) ,
535568 stable_ptr : ExprPtr ( stable_ptr. get_embedded ( & data. defs_loading_data ) ) ,
536569 ty : ty. get_embedded ( data) ,
537570 }
0 commit comments