/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . lang . core . type Ċ Ċ import Ġorg . intellij . lang . annotations . Language Ċ import Ġorg . rust . Project Descriptor Ċ import Ġorg . rust . Rs TestBase Ċ import Ġorg . rust . With Std lib Rust Project Descriptor Ċ import Ġorg . rust . lang . core . psi . Rs Expr Ċ import Ġorg . rust . lang . core . psi . Rs Struct Literal Field Ċ import Ġorg . rust . lang . core . psi . ext . Rs Element Ċ import Ġorg . rust . lang . core . types . adjust ments Ċ import Ġorg . rust . lang . core . types . infer . Adjustment Ċ Ċ class ĠRs Adjustment Test Ġ: ĠRs TestBase () Ġ{ ĊĠĠĠ Ġfun Ġ` test Ġmethod Ġwithout Ġadjust ements `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo ( self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS . foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġmethod Ġborrow `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS . foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġborrow (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġmethod Ġborrow Ġmut `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& mut Ġself ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS . foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġborrow (& mut ĠS ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġmethod Ġderef `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( && S ). foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġmethod Ġderef Ġ 2 `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( && & S ). foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& & S ), Ġderef (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġmethod Ġderef Ġmut Ġand Ġborrow Ġref `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(& mut ĠS ). foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef ( S ), Ġborrow (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġmethod Ġderef Ġmut Ġ 2 Ġand Ġborrow Ġref `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(& mut Ġ& mut ĠS ). foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& mut ĠS ), Ġderef ( S ), Ġborrow (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġmethod Ġderef ĠBox Ġand Ġborrow Ġref `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo (& self ) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Box :: new ( S )). foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef ( S ), Ġborrow (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġmethod Ġno Ġadjust ments Ġwith ĠBox Ġself `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġimpl ĠS Ġ{ Ġfn Ġfoo ( self : ĠBox < Self >) Ġ{} Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Box :: new ( S )). foo (); ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġfield Ġwithout Ġadjust ments `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf : Ġi 3 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġfoo ( s : ĠS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . f ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġfield Ġderef `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf : Ġi 3 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġfoo ( s : Ġ& S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . f ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef ( S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġfield Ġderef Ġ 2 `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf : Ġi 3 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġfoo ( s : Ġ&& S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . f ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& S ), Ġderef ( S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġtuple Ġfield Ġwithout Ġadjust ments `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ( i 3 2 ); ĊĠĠĠĠĠĠĠ Ġfn Ġfoo ( s : ĠS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . 0 ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġtuple Ġfield Ġderef `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ( i 3 2 ); ĊĠĠĠĠĠĠĠ Ġfn Ġfoo ( s : Ġ& S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . 0 ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef ( S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġtuple Ġfield Ġderef Ġ 2 `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ( i 3 2 ); ĊĠĠĠĠĠĠĠ Ġfn Ġfoo ( s : Ġ&& S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . 0 ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& S ), Ġderef ( S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġno Ġreference Ġco erc ion `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġ_: Ġ& S Ġ= Ġ& S ; ĊĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ^ ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġreference Ġco erc ion `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġ_: Ġ& S Ġ= Ġ&& S ; ĊĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ^ Ġderef (& S ), Ġderef ( S ), Ġborrow (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ// ĠIt 's Ġweird , Ġbut Ġthis Ġis Ġhow Ġrustc Ġworks ĊĠĠĠ Ġfun Ġ` test Ġreference Ġco erc ion Ġmut Ġmut `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġ_: Ġ& mut ĠS Ġ= Ġ& mut ĠS ; ĊĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ^ Ġderef ( S ), Ġborrow (& mut ĠS ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġreference Ġco erc ion Ġbox `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġ_: Ġ& S Ġ= Ġ& Box :: new ( S ); ĊĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ^ Ġderef ( Box < S >), Ġderef ( S ), Ġborrow (& S ) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġfun Ġ` test Ġreference Ġco erc ion Ġin Ġfield Ġsh orthand `() Ġ= Ġtest Field Sh orthand (""" ĊĠĠĠĠĠĠĠ Ġstruct ĠS ; ĊĠĠĠĠĠĠĠ Ġstruct ĠW <' a > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf : Ġ&' a ĠS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġf Ġ= Ġ&& S ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġ_ Ġ= ĠW Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; // ^ Ġderef (& S ), Ġderef ( S ), Ġborrow (& S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġindex Ġexpr Ġborrow `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġv Ġ= ĠVec ::< i 3 2 >:: new (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv [ 0 ]; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġborrow (& Vec < i 3 2 >) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġindex Ġexpr Ġderef `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġv Ġ= Ġ&& Vec ::< i 3 2 >:: new (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv [ 0 ]; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& Vec < i 3 2 >) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġindex Ġexpr Ġderef Ġ 2 `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġv Ġ= Ġ&& & Vec ::< i 3 2 >:: new (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv [ 0 ]; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef (& & Vec < i 3 2 >), Ġderef (& Vec < i 3 2 >) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġindex Ġexpr Ġderef Ġborrow `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġv Ġ= Ġ& mut ĠVec ::< i 3 2 >:: new (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv [ 0 ]; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġderef ( Vec < i 3 2 >), Ġborrow (& Vec < i 3 2 >) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġ@ Project Descriptor ( With Std lib Rust Project Descriptor :: class ) ĊĠĠĠ Ġfun Ġ` test Ġindex Ġexpr Ġborrow Ġmut `() Ġ= Ġtest Expr (""" ĊĠĠĠĠĠĠĠ Ġfn Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmut Ġv Ġ= ĠVec ::< i 3 2 >:: new (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv [ 0 ] Ġ= Ġ 1 ; ĊĠĠĠĠĠĠĠ Ġ} Ġ// ^ Ġborrow (& mut ĠVec < i 3 2 >) ĊĠĠĠ Ġ"" ") ĊĊĠĠĠ Ġprivate Ġfun Ġtest Expr (@ Language (" Rust ") Ġcode : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠInline File ( code ) ĊĠĠĠĠĠĠĠ Ġval Ġ( expr , Ġexpected Adjust ments ) Ġ= Ġfind Element And Data In Editor < Rs Expr >() ĊĠĠĠĠĠĠĠ Ġcheck Adjust ments ( expr , Ġexpected Adjust ments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Field Sh orthand (@ Language (" Rust ") Ġcode : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠInline File ( code ) ĊĠĠĠĠĠĠĠ Ġval Ġ( expr , Ġexpected Adjust ments ) Ġ= Ġfind Element And Data In Editor < Rs Struct Literal Field >() ĊĠĠĠĠĠĠĠ Ġcheck Adjust ments ( expr , Ġexpected Adjust ments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Adjust ments ( expr : ĠRs Element , Ġexpected Adjust ments : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadjust ments Ġ= Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Expr Ġ-> Ġexpr . adjust ments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Struct Literal Field Ġ-> Ġexpr . adjust ments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġelement : Ġ$ expr ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġadjust ments Str Ġ= Ġadjust ments . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdjust ment . Deref Ġ-> Ġ" deref (${ it . target })" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdjust ment . Borrow Reference Ġ-> Ġ" borrow (${ it . target })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Adjust ments , Ġadjust ments Str ) ĊĠĠĠ Ġ} Ċ } Ċ