/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . lang . core . psi . ext Ċ Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . stubs . I Stub ElementType Ċ import Ġorg . rust . lang . core . Rs Psi Pattern Ċ import Ġorg . rust . lang . core . psi .* Ċ import Ġorg . rust . lang . core . psi . Rs Element Types .* Ċ import Ġorg . rust . lang . core . resolve .* Ċ import Ġorg . rust . lang . core . resolve . ref .* Ċ import Ġorg . rust . lang . core . stubs . Rs Path Stub Ċ import Ġorg . rust . lang . core . stubs . common . Rs Path Psi Or Stub Ċ import Ġorg . rust . lang . core . types . ty . Ty Primitive Ċ Ċ private Ġval ĠRS _ PATH _ KIND S Ġ= Ġtoken Set Of ( IDENTIFIER , ĠS ELF , ĠSUP ER , ĠC SELF , ĠCR ATE ) Ċ Ċ val ĠRs Path . has C self : ĠBoolean Ġget () Ġ= Ġkind Ġ== ĠPath Kind . C SELF Ċ Ċ /** ĠFor Ġ` Foo :: bar :: baz :: qu ux ` Ġpath Ġreturns Ġ` Foo ` Ġ*/ Ċ tail rec Ġfun Ġ< T Ġ: ĠRs Path Psi Or Stub > ĠT . basePath (): ĠT Ġ{ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġval Ġqualifier Ġ= Ġpath Ġas ĠT ? ĊĠĠĠ Ġreturn Ġif Ġ( qual ifier Ġ=== Ġnull ) Ġthis Ġelse Ġqualifier . basePath () Ċ } Ċ Ċ /** ĠFor Ġ` Foo :: bar ` Ġin Ġ` Foo :: bar :: baz :: qu ux ` Ġreturns Ġ` Foo :: bar :: baz :: qu ux ` Ġ*/ Ċ tail rec Ġfun ĠRs Path . rootPath (): ĠRs Path Ġ{ ĊĠĠĠ Ġ// ĠUse Ġ` parent ` Ġinstead Ġof Ġ` context ` Ġbecause Ġof Ġbetter Ġperformance . ĊĠĠĠ Ġ// ĠAssume Ġnobody Ġset Ġa Ġcontext Ġfor Ġa Ġpart Ġof Ġa Ġpath ĊĠĠĠ Ġval Ġparent Ġ= Ġparent ĊĠĠĠ Ġreturn Ġif Ġ( parent Ġis ĠRs Path ) Ġparent . rootPath () Ġelse Ġthis Ċ } Ċ Ċ val ĠRs Path . text Range Of Last Segment : ĠText Range ? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreference Name Element Ġ= Ġreference Name Element Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠText Range ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Name Element . start Offset , Ġtype ArgumentList ?. end Offset Ġ?: Ġreference Name Element . end Offset ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ enum Ġclass ĠPath Kind Ġ{ ĊĠĠĠ ĠIDENT IFIER , ĊĠĠĠ ĠS ELF , ĊĠĠĠ ĠSUP ER , ĊĠĠĠ ĠC SELF , ĊĠĠĠ ĠCR ATE , ĊĠĠĠ ĠM AL FOR MED Ċ } Ċ Ċ val ĠRs Path . qual ifier : ĠRs Path ? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġctx Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġwhile Ġ( ctx Ġis ĠRs Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx Ġ= Ġctx . context ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( ctx Ġas ? ĠRs Use Spe ck )?. qual ifier ĊĠĠĠ Ġ} Ċ Ċ fun ĠRs Path . allowed Namespaces ( is Completion : ĠBoolean Ġ= Ġfalse ): ĠSet < Namespace > Ġ= Ġwhen Ġ( val Ġparent Ġ= Ġparent ) Ġ{ ĊĠĠĠ Ġis ĠRs Path , Ġis ĠRs Trait Ref , Ġis ĠRs Struct Literal , Ġis ĠRs Pat Struct Ġ-> ĠTY PES ĊĠĠĠ Ġis ĠR sType Reference Ġ-> Ġwhen Ġ( parent . parent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠR sType ArgumentList Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtype ĠA Ġ= ĠFoo < T > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ~ Ġ` T ` Ġcan Ġbe Ġeither Ġtype Ġor Ġconst Ġargument ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ArgumentList Ġ== Ġnull Ġ&& Ġvalue Parameter List Ġ== Ġnull Ġ-> ĠTY PES _ N _ VALUES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTY PES ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTY PES ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠRs Use Spe ck Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġfoo :: bar ::{ self , Ġbaz }; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ ~~~~~~~~ ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġfoo :: bar ::*; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ ~~~~~~~~ ĊĠĠĠĠĠĠĠ Ġparent . use Group Ġ!= Ġnull Ġ|| Ġparent . is Star Import Ġ-> ĠTY PES ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġfoo :: bar ; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ ~~~~~~~~ ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTY PES _ N _ VALUES _ N _ MAC ROS ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠRs Path Expr Ġ-> Ġif Ġ( is Completion ) ĠTY PES _ N _ VALUES Ġelse ĠVALUES ĊĠĠĠ Ġis ĠRs Pat Tuple Struct Ġ-> ĠVALUES ĊĠĠĠ Ġis ĠRs Macro Call Ġ-> ĠMAC ROS ĊĠĠĠ Ġis ĠRs Path Code Fragment Ġ-> Ġparent . ns ĊĠĠĠ Ġelse Ġ-> ĠTY PES _ N _ VALUES Ċ } Ċ Ċ val ĠRs Path . resolve Status : ĠPath Resolve Status ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġreference Ġ?: Ġreturn ĠPath Resolve Status . NO _ REFERENCE ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Ty Primitive . from Path ( this ) Ġ== Ġnull Ġ&& Ġreference . multi Resolve (). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPath Resolve Status . UN RESOL VED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPath Resolve Status . RESOL VED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ enum Ġclass ĠPath Resolve Status Ġ{ ĊĠĠĠ ĠRES OL VED , ĠUN RESOL VED , ĠNO _ REFERENCE Ċ } Ċ Ċ val ĠRs Path . lifetime Arguments : ĠList < Rs Lifetime > Ġget () Ġ= Ġtype ArgumentList ?. lifetime Arguments . or Empty () Ċ Ċ val ĠRs Path . type Arguments : ĠList < Rs Type Reference > Ġget () Ġ= Ġtype ArgumentList ?. type Arguments . or Empty () Ċ Ċ val ĠRs Path . const Arguments : ĠList < Rs Element > Ġget () Ġ= Ġtype ArgumentList ?. const Arguments . or Empty () Ċ Ċ abstract Ġclass ĠRs Path Impl Mixin Ġ: ĠRs Stub bed Element Impl < Rs Path Stub >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRs Path Ġ{ ĊĠĠĠ Ġconstructor ( node : ĠAST Node ) Ġ: Ġsuper ( node ) ĊĊĠĠĠ Ġconstructor ( stub : ĠRs Path Stub , Ġnode Type : ĠI Stub ElementType < *, Ġ* >) Ġ: Ġsuper ( stub , Ġnode Type ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Reference (): ĠRs Path Reference ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( reference Name Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġparent Ġ= Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Macro Call Ġ-> ĠRs Macro Path Reference Impl ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Meta Item Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRs Psi Pattern . derived Trait Meta Item . accept s ( parent ) Ġ-> ĠRs Der ive Trait Reference Impl ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRs Psi Pattern . non Std Outer Attribute Meta Item . accept s ( parent ) Ġ-> ĠRs Attribute Proc Macro Reference Impl ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRs Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Path Parent Ġ= Ġparent . rootPath (). parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rootPath Parent Ġ! is ĠRs Meta Item Ġ|| ĠRs Psi Pattern . non Std Outer Attribute Meta Item . accept s ( rootPath Parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRs Path Reference Impl ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRs Path Reference Impl ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġreference Name Element : ĠPsi Element ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnode . find Child ByType ( RS _ PATH _ KIND S )?. psi ĊĊĠĠĠ Ġoverride Ġval Ġreference Name : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġgreen Stub ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( stub Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . reference Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . reference Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcontaining Mod : ĠRs Mod ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthe Ġcase Ġof Ġpath Ġinside Ġvis Ġrestriction Ġfor Ġmod Ġitem , Ġcontaining Mod Ġmust Ġbe Ġthe Ġparent Ġmodule : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ``` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmod Ġfoo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġpub ( in Ġself ) Ġmod Ġbar Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠ Ġ// ^ Ġcontaining Mod Ġ== Ġ` foo ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ``` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvis Parent Ġ= Ġ( rootPath (). parent Ġas ? ĠRs Vis Restriction )?. parent ?. parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( vis Parent Ġis ĠRs Mod ) Ġvis Parent . containing Mod Ġelse Ġsuper . containing Mod ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġhas Colon Colon : ĠBoolean Ġget () Ġ= Ġgreen Stub ?. has Colon Colon Ġ?: Ġ( colon colon Ġ!= Ġnull ) ĊĊĠĠĠ Ġoverride Ġval Ġkind : ĠPath Kind ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġgreen Stub ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stub Ġ!= Ġnull ) Ġreturn Ġstub . kind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġnode . find Child ByType ( RS _ PATH _ KIND S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( child ?. elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIDENT IFIER Ġ-> ĠPath Kind . IDENTIFIER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ELF Ġ-> ĠPath Kind . SELF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUP ER Ġ-> ĠPath Kind . SUPER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC SELF Ġ-> ĠPath Kind . C SELF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCR ATE Ġ-> ĠPath Kind . CR ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPath Kind . MAL FOR MED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ