/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . fir . low . level . api Ċ Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Declaration Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . api . F ir Declaration Design ation Ċ Ċ abstract Ġclass ĠContext By Design ation Collector < C Ġ: ĠAny >( private Ġval Ġdesign ation : ĠF ir Declaration Design ation ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcontext : ĠC ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdesign ation State Ġ= ĠF ir Design ation State ( designation ) ĊĊĠĠĠ Ġprotected Ġabstract Ġfun ĠgetCurrent Context (): ĠC ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgo To Nested Declaration ( declaration : ĠF ir Declaration ) ĊĊĠĠĠ Ġfun Ġget Collected Context (): ĠC Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Context Ġis Ġnot Ġcollected Ġyet ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Step () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( designation State . can Go Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesign ation State . go Next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( designation State . current Declaration If Present Ġ== Ġdesign ation . declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( context Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠgetCurrent Context () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgo To Nested Declaration ( designation State . current Declaration ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( designation State . current Declaration If Present Ġ== Ġdesign ation . declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesign ation State . goTo Inner Declaration () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠF ir Design ation State ( val Ġdesign ation : ĠF ir Declaration Design ation ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHold s Ġcurrent Ġdeclaration Ġindex ĊĠĠĠĠ Ġ* Ġif Ġ` currentIndex Ġin Ġ[ 0 , Ġdesign ation . path . last Index ]` Ġthen Ġcurrent Ġdeclaration Ġis Ġin Ġpath ĊĠĠĠĠ Ġ* Ġif Ġ` currentIndex Ġ== Ġ` designation . path . last Index Ġ+ Ġ 1 ` Ġthen Ġcurrent Ġdeclaration Ġis Ġour Ġtarget Ġdeclaration ĊĠĠĠĠ Ġ* Ġif Ġ` currentIndex Ġ> Ġdesign ation . path . last Index Ġ+ Ġ 1 ` Ġthen Ġwe Ġare Ġinside Ġcurrent Ġdeclaration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ- 1 ĊĊĠĠĠ Ġfun Ġcan Go Next (): ĠBoolean Ġ= ĠcurrentIndex Ġ< Ġdesign ation . path . size ĊĊĠĠĠ Ġval Ġcurrent Declaration If Present : ĠF ir Declaration ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( currentIndex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġdesign ation . path . indices Ġ-> Ġdesign ation . path [ currentIndex ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesign ation . path . size Ġ-> Ġdesign ation . declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent Declaration : ĠF ir Declaration ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Declaration If Present ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" W ent Ġinside Ġtarget Ġdeclaration ") ĊĊĠĠĠ Ġfun Ġgo Next () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( can Go Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex ++ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo To Inner Declaration () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ== Ġdesign ation . path . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex ++ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }