/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . lang . core . resolve . ref Ċ Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Multi Range Reference Ċ import Ġorg . rust . lang . core . psi . Rs Binary Expr Ċ import Ġorg . rust . lang . core . psi . Rs Function Ċ import Ġorg . rust . lang . core . psi . Rs Index Expr Ċ import Ġorg . rust . lang . core . psi . ext .* Ċ import Ġorg . rust . lang . core . types . Trait Ref Ċ import Ġorg . rust . lang . core . types . impl Lookup And Known Items Ċ import Ġorg . rust . lang . core . types . type Ċ Ċ class ĠRs Index Expr Reference Impl ( element : ĠRs Index Expr ) Ġ: ĠRs Reference Cached < Rs Index Expr >( element ), ĠMulti Range Reference Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcache Dependency : ĠResolve Cache Dependency Ġget () Ġ= ĠResolve Cache Dependency . LOCAL _ AND _ R UST _ STRUCTURE ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Inner (): ĠList < Rs Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġelement . parent ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssume Ġthat ĠIndex Mut Ġwill Ġbe Ġused Ġif Ġthe Ġindexed Ġexpression Ġis Ġon Ġthe Ġleft Ġside Ġof Ġsome Ġassignment ĊĠĠĠĠĠĠĠ Ġval Ġis Maybe Mutable Context Ġ= Ġparent Ġis ĠRs Binary Expr Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . operator Type Ġis ĠAssignment Op Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . left Ġ== Ġelement ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Fn Ġ= Ġfind Index Function ( element , Ġis Maybe Mutable Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . exists After Expansion Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf NotNull ( index Fn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Ranges (): ĠList < Text Range > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġelement . l br ack . text Range In Parent , ĊĠĠĠĠĠĠĠ Ġelement . r br ack . text Range In Parent ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠT ries Ġto Ġresolve Ġa Ġfunction Ġthat Ġimplements Ġeither Ġ` Index ` Ġor Ġ` Index Mut ` Ġfor Ġthe Ġgiven Ġindex Ġexpression . Ċ Ġ* ĠIf Ġ` prefer Mutable ` Ġis Ġtrue , Ġ` Index Mut ` Ġwill Ġbe Ġattempted Ġfor Ġresolution Ġfirst . Ċ Ġ*/ Ċ fun Ġfind Index Function ( element : ĠRs Index Expr , Ġprefer Mutable : ĠBoolean ): ĠRs Function ? Ġ{ ĊĠĠĠ Ġval Ġcontainer Ġ= Ġelement . container Expr Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġindex Ġ= Ġelement . index Expr Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġ( lookup , Ġitems ) Ġ= Ġelement . impl Lookup And Known Items ĊĊĠĠĠ Ġval Ġcandidates Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠ Ġitems . Index Ġto Ġ" index ", ĊĠĠĠĠĠĠĠ Ġitems . Index Mut Ġto Ġ" index _ mut " ĊĠĠĠ Ġ) ĊĠĠĠ Ġif Ġ( prefer Mutable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcandidates . reverse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcandidates . map Ġ{ Ġ( trait , Ġfunction Name ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( trait Ġ== Ġnull ) Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġimpl Ġ= Ġlookup . select ( Trait Ref ( container . type , Ġtrait . with Subst ( index . type ))). ok ()?. impl Ġ?: Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠ Ġimpl . expanded Members ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. functions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . name Ġ== Ġfunction Name Ġ} ĊĠĠĠ Ġ}. first OrNull () Ċ } Ċ