/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . lang . core . types . infer Ċ Ċ import Ġorg . rust . lang . core . psi .* Ċ import Ġorg . rust . lang . core . psi . ext . container Expr Ċ import Ġorg . rust . lang . core . psi . ext . mut ability Ċ import Ġorg . rust . lang . core . types . builtin Deref Ċ import Ġorg . rust . lang . core . types . infer . Adjustment . Deref Ċ import Ġorg . rust . lang . core . types . inference Ċ import Ġorg . rust . lang . core . types . is Dere ference Ċ import Ġorg . rust . lang . core . types . ty .* Ċ import Ġorg . rust . lang . core . types . type Ċ import Ġorg . rust . st dex t . next OrNull ĊĊ Ċ enum Ġclass ĠMut ability Category Ġ{ ĊĠĠĠ ĠImmutable , ĊĠĠĠ Ġ/** ĠDirect ly Ġdeclared Ġas Ġmutable Ġ*/ ĊĠĠĠ ĠDecl ared , ĊĠĠĠ Ġ/** ĠInherit ed Ġfrom Ġthe Ġfact Ġthat Ġowner Ġis Ġmutable Ġ*/ ĊĠĠĠ ĠInherit ed ; ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġvalue Of ( mut ability : ĠMut ability ): ĠMut ability Category Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mut ability ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMut ability . IM MUT ABLE Ġ-> ĠMut ability Category . Immutable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMut ability . MUT ABLE Ġ-> ĠMut ability Category . Declared ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinherit (): ĠMut ability Category Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMut ability Category . Immutable Ġ-> ĠMut ability Category . Immutable ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMut ability Category . Declared , ĠMut ability Category . Inherited Ġ-> ĠMut ability Category . Inherited ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Mutable : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMut ability Category . Immutable Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMut ability Category . Declared , ĠMut ability Category . Inherited Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCategory , ĠMut ability Category , Ġand ĠType Ċ Ġ* ĠCurrently Ġsupports Ġonly ĠMut ability Category Ġand ĠType Ċ Ġ*/ Ċ class ĠC mt ( val Ġty : ĠTy , Ġval Ġmut ability Category : ĠMut ability Category ? Ġ= Ġnull ) Ċ Ċ private Ġfun Ġprocess Unary Expr ( unary Expr : ĠRs Unary Expr ): ĠC mt Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġunary Expr . type ĊĠĠĠ Ġif Ġ(! unary Expr . is Dere ference ) Ġreturn ĠC mt ( type ) ĊĠĠĠ Ġval Ġbase Ġ= Ġunary Expr . expr Ġ?: Ġreturn ĠC mt ( type ) ĊĊĠĠĠ Ġval Ġbase C mt Ġ= Ġprocess Expr ( base ) ĊĠĠĠ Ġreturn Ġprocess Deref ( base C mt ) Ċ } Ċ Ċ private Ġfun Ġprocess Dot Expr ( dot Expr : ĠRs Dot Expr ): ĠC mt Ġ{ ĊĠĠĠ Ġif Ġ( dot Expr . method Call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess R value ( dot Expr ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtype Ġ= Ġdot Expr . type ĊĠĠĠ Ġval Ġbase Ġ= Ġdot Expr . expr ĊĠĠĠ Ġval Ġbase C mt Ġ= Ġprocess Expr ( base ) ĊĠĠĠ Ġreturn ĠC mt ( type , Ġbase C mt . mut ability Category ?. inherit ()) Ċ } Ċ Ċ private Ġfun Ġprocess Index Expr ( index Expr : ĠRs Index Expr ): ĠC mt Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġindex Expr . type ĊĠĠĠ Ġval Ġbase Ġ= Ġindex Expr . container Expr Ġ?: Ġreturn ĠC mt ( type ) ĊĠĠĠ Ġval Ġbase C mt Ġ= Ġprocess Expr ( base ) ĊĠĠĠ Ġreturn ĠC mt ( type , Ġbase C mt . mut ability Category ?. inherit ()) Ċ } Ċ Ċ private Ġfun Ġprocess Path Expr ( path Expr : ĠRs Path Expr ): ĠC mt Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġpath Expr . type ĊĠĠĠ Ġval Ġdeclaration Ġ= Ġpath Expr . path . reference . resolve () Ġ?: Ġreturn ĠC mt ( type ) ĊĊĠĠĠ Ġreturn Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRs Constant , Ġis ĠRs Enum Variant , Ġis ĠRs Struct Item , Ġis ĠRs Function Ġ-> ĠC mt ( type , ĠMut ability Category . Declared ) ĊĊĠĠĠĠĠĠĠ Ġis ĠRs Pat Binding Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration . mut ability . is Mut ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC mt ( type , ĠMut ability Category . Declared ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC mt ( type , ĠMut ability Category . Immutable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠRs Self Parameter Ġ-> ĠC mt ( type , ĠMut ability Category . valueOf ( declaration . mut ability )) ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠC mt ( type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprocess Paren Expr ( paren Expr : ĠRs Paren Expr ): ĠC mt Ġ= ĊĠĠĠ ĠC mt ( paren Expr . type , Ġp aren Expr . expr . mut ability Category ) Ċ Ċ private Ġfun Ġprocess Expr ( expr : ĠRs Expr ): ĠC mt Ġ{ ĊĠĠĠ Ġval Ġadjust ments Ġ= Ġexpr . inference ?. adjust ments ?. get ( expr ) Ġ?: Ġempty List () ĊĠĠĠ Ġreturn Ġprocess Expr Adjust ed With ( expr , Ġadjust ments . as Re versed (). iterator ()) Ċ } Ċ Ċ private Ġfun Ġprocess Expr Adjust ed With ( expr : ĠRs Expr , Ġadjust ments : ĠIterator < Adjustment >): ĠC mt Ġ= ĊĠĠĠ Ġwhen Ġ( adjust ments . next OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠD eref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġover loaded Ġderef ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Deref ( process Expr Adjust ed With ( expr , Ġadjust ments )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprocess Expr Un adjusted ( expr ) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġprocess Deref ( base C mt : ĠC mt ): ĠC mt Ġ{ ĊĠĠĠ Ġval Ġbase Type Ġ= Ġbase C mt . ty ĊĠĠĠ Ġval Ġ( deref Type , Ġderef Mut ) Ġ= Ġbase Type . builtin Deref () Ġ?: ĠPair ( Ty Unknown , ĠMut ability . DEFAULT _ MUT ABILITY ) ĊĊĠĠĠ Ġreturn Ġwhen Ġ( base Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠTy Reference Ġ-> ĠC mt ( deref Type , ĠMut ability Category . valueOf ( deref Mut )) ĊĠĠĠĠĠĠĠ Ġis ĠTy Pointer Ġ-> ĠC mt ( deref Type , ĠMut ability Category . valueOf ( deref Mut )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠC mt ( deref Type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprocess R value ( expr : ĠRs Expr ): ĠC mt Ġ= ĊĠĠĠ ĠC mt ( expr . type , ĠMut ability Category . Declared ) Ċ Ċ private Ġfun Ġprocess Expr Un adjusted ( expr : ĠRs Expr ): ĠC mt Ġ= ĊĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRs Unary Expr Ġ-> Ġprocess Unary Expr ( expr ) ĊĠĠĠĠĠĠĠ Ġis ĠRs Dot Expr Ġ-> Ġprocess Dot Expr ( expr ) ĊĠĠĠĠĠĠĠ Ġis ĠRs Index Expr Ġ-> Ġprocess Index Expr ( expr ) ĊĠĠĠĠĠĠĠ Ġis ĠRs Path Expr Ġ-> Ġprocess Path Expr ( expr ) ĊĠĠĠĠĠĠĠ Ġis ĠRs Paren Expr Ġ-> Ġprocess Paren Expr ( expr ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprocess R value ( expr ) ĊĠĠĠ Ġ} ĊĊ Ċ val ĠRs Expr . mut ability Category : ĠMut ability Category ? ĊĠĠĠ Ġget () Ġ= Ġprocess Expr ( this ). mut ability Category Ċ