/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . ide . search Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . us ages . Usage Target Ċ import Ġcom . intellij . us ages . impl . rules . Usage Type Ċ import Ġcom . intellij . us ages . impl . rules . Usage Type Provider Ex Ċ import Ġorg . rust . lang . core . macros . find Expansion Elements Ċ import Ġorg . rust . lang . core . psi .* Ċ Ċ object ĠRs Usage Type Provider Ġ: ĠUsage Type Provider Ex Ġ{ ĊĠĠĠ Ġ// ĠInstantiate Ġeach ĠUsage Type Ġonly Ġonce , Ġso Ġthat Ġthe Ġequality Ġcheck Ġin ĠUsage Type Group . equals () Ġworks Ġcorrectly ĊĠĠĠ Ġprivate Ġval ĠIMP L Ġ= ĠUsage Type Ġ{ Ġ" impl " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠTYPE _ REFERENCE Ġ= ĠUsage Type Ġ{ Ġ" type Ġreference " Ġ} ĊĠĠĠ Ġprivate Ġval ĠTR A IT _ REFERENCE Ġ= ĠUsage Type Ġ{ Ġ" trait Ġreference " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠEX PR Ġ= ĠUsage Type Ġ{ Ġ" expr " Ġ} ĊĠĠĠ Ġprivate Ġval ĠDOT _ EXPR Ġ= ĠUsage Type Ġ{ Ġ" dot Ġexpr " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠFUNCTION _ CALL Ġ= ĠUsage Type Ġ{ Ġ" function Ġcall " Ġ} ĊĠĠĠ Ġprivate Ġval ĠMETHOD _ CALL Ġ= ĠUsage Type Ġ{ Ġ" method Ġcall " Ġ} ĊĠĠĠ Ġprivate Ġval ĠARG UMENT Ġ= ĠUsage Type Ġ{ Ġ" argument " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠMAC RO _ CALL Ġ= ĠUsage Type Ġ{ Ġ" macro Ġcall " Ġ} ĊĠĠĠ Ġprivate Ġval ĠMAC RO _ ARGUMENT Ġ= ĠUsage Type Ġ{ Ġ" macro Ġargument " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠINIT _ STRUCT Ġ= ĠUsage Type Ġ{ Ġ" init Ġstruct " Ġ} ĊĠĠĠ Ġprivate Ġval ĠINIT _ FIELD Ġ= ĠUsage Type Ġ{ Ġ" init Ġfield " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠPAT _ BINDING Ġ= ĠUsage Type Ġ{ Ġ" variable Ġbinding " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠFIELD Ġ= ĠUsage Type Ġ{ Ġ" field " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠMETA _ ITEM Ġ= ĠUsage Type Ġ{ Ġ" meta Ġitem " Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠUSE Ġ= ĠUsage Type Ġ{ Ġ" use " Ġ} ĊĠĠĠ Ġprivate Ġval ĠMOD Ġ= ĠUsage Type Ġ{ Ġ" mod " Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Usage Type ( element : ĠPsi Element ?): ĠUsage Type ? Ġ= Ġget Usage Type ( element , ĠUsage Target . EMPTY _ ARRAY ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Usage Type ( element : ĠPsi Element ?, Ġtargets : ĠArray < out ĠUsage Target >): ĠUsage Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref ined Element Ġ= Ġelement ?. find Expansion Elements ()?. first OrNull ()?. parent Ġ?: Ġelement ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġref ined Element ?. go Up < Rs Path >() Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs BaseType Ġ-> Ġwhen Ġ( parent . parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Impl Item Ġ-> ĠIMP L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTYPE _ REFERENCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Path Expr Ġ-> Ġwhen Ġ( parent . go Up < Rs Path Expr >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Dot Expr Ġ-> ĠDOT _ EXPR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Call Expr Ġ-> ĠFUNCTION _ CALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Value ArgumentList Ġ-> ĠARG UMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Format Macro Arg Ġ-> ĠMAC RO _ ARGUMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Expr Ġ-> ĠEX PR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Use Spe ck Ġ-> ĠUSE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Struct Literal Ġ-> ĠINIT _ STRUCT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Struct Literal Field Ġ-> ĠINIT _ FIELD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Trait Ref Ġ-> ĠTR A IT _ REFERENCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs MethodCall Ġ-> ĠMETHOD _ CALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Meta Item Ġ-> ĠMETA _ ITEM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Field Lookup Ġ-> ĠFIELD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Macro Call Ġ-> ĠMAC RO _ CALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Pat Binding Ġ-> ĠPAT _ BINDING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( parent . parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Mod Decl Item Ġ-> ĠMOD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠPsi Element . go Up (): ĠPsi Element Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( context Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠ Ġ} Ċ } Ċ