/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 , ĠF ra un ho fer ĠAI SEC . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ $$$$ $\ Ġ Ġ$ $$$$ $$ \ ĠĠ Ġ$ $$$$ $\ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$$ Ġ Ġ__ $$ \ Ġ$$ Ġ Ġ__ $$ \ Ġ$$ Ġ Ġ__ $$ \ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$$ Ġ/ Ġ Ġ\ __| $$ Ġ| Ġ Ġ$$ Ġ| $$ Ġ/ Ġ Ġ\ __| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$$ Ġ| ĠĠĠĠĠ Ġ$ $$$$ $$ Ġ Ġ| $$ Ġ| $$$$ \ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$$ Ġ| ĠĠĠĠĠ Ġ$$ Ġ Ġ__ __/ Ġ$$ Ġ| \_ $$ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$$ Ġ| Ġ Ġ$$\ Ġ$$ Ġ| ĠĠĠĠĠ Ġ$$ Ġ| Ġ Ġ$$ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ\ $$$$ $ ĠĠ Ġ| $$ Ġ| ĠĠĠĠĠ Ġ\ $$$$ $ ĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ\ ____ __/ Ġ\ __| ĠĠĠĠĠĠ Ġ\ ____ __/ Ċ Ġ* Ċ Ġ*/ Ċ package Ġde . f ra un ho fer . aise c . cp g . graph Ċ Ċ import Ġde . f ra un ho fer . aise c . cp g . Translation Result Ċ import Ġde . f ra un ho fer . aise c . cp g . graph . declarations . Declaration Ċ import Ġde . f ra un ho fer . aise c . cp g . graph . declarations . Function Declaration Ċ import Ġde . f ra un ho fer . aise c . cp g . graph . edge . Property Edge Ċ import Ġde . f ra un ho fer . aise c . cp g . graph . statements . Compound Statement Ċ import Ġde . f ra un ho fer . aise c . cp g . graph . statements . Statement Ċ import Ġde . f ra un ho fer . aise c . cp g . helpers . Sub graph Walker Ċ Ċ @ Jvm Name (" all Nodes ") Ċ fun ĠTranslation Result . all (): ĠList < Node > Ġ{ ĊĠĠĠ Ġreturn Ġthis . all < Node >() Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠNode > ĠTranslation Result . all (): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġchildren Ġ= ĠSub graph Walker . flatten AST ( this ) ĊĊĠĠĠ Ġreturn Ġchildren . filter Is Instance < T >() Ċ } Ċ Ċ @ Jvm Name (" all Nodes ") Ċ fun ĠNode . all (): ĠList < Node > Ġ{ ĊĠĠĠ Ġreturn Ġthis . all < Node >() Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠNode > ĠNode . all (): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġchildren Ġ= ĠSub graph Walker . flatten AST ( this ) ĊĊĠĠĠ Ġreturn Ġchildren . filter Is Instance < T >() Ċ } Ċ Ċ @ Jvm Name (" ast Nodes ") Ċ fun ĠNode . ast (): ĠList < Node > Ġ{ ĊĠĠĠ Ġreturn Ġthis . ast < Node >() Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠNode > ĠNode . ast (): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġchildren Ġ= ĠSub graph Walker . get Ast Children ( this ) ĊĊĠĠĠ Ġreturn Ġchildren . filter Is Instance < T >() Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠNode > ĠNode . df g From (): ĠList < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . prev DF G . toList (). filter Is Instance < T >() Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠDeclaration > ĠDeclaration Holder . by Name OrNull ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġf qn : ĠBoolean Ġ= Ġfalse Ċ ): ĠT ? Ġ{ ĊĠĠĠ Ġvar Ġbase Ġ= Ġthis ĊĠĠĠ Ġvar Ġlookup Ġ= Ġname ĊĊĠĠĠ Ġ// Ġlets Ġdo Ġa Ġ_ very _ Ġsimple ĠF QN Ġlookup ĊĠĠĠ Ġ// ĠTODO ( ox isto ): Ġwe Ġcould Ġdo Ġthis Ġwith Ġa Ġfor - loop Ġfor Ġmultiple Ġnested Ġlevels ĊĠĠĠ Ġif Ġ( fq n Ġ&& Ġname . contains (". ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtake Ġthe Ġmost Ġleft Ġone ĊĠĠĠĠĠĠĠ Ġval Ġbase Name Ġ= Ġname . split (". ")[ 0 ] ĊĊĠĠĠĠĠĠĠ Ġbase Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . declarations . filter Is Instance < Declaration Holder >(). first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠNode )?. name Ġ== Ġbase Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġlookup Ġ= Ġname . split (". ")[ 1 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbase . declarations . filter Is Instance < T >(). first OrNull Ġ{ Ġit . name Ġ== Ġlookup Ġ} Ċ } Ċ Ċ @ Throws ( Declaration NotFound :: class ) Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠDeclaration > ĠDeclaration Holder . by Name ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġf qn : ĠBoolean Ġ= Ġfalse Ċ ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġby Name OrNull ( name , Ġf qn ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDeclaration NotFound (" declaration Ġwith Ġname Ġnot Ġfound Ġor Ġincorrect Ġtype ") Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġinline Ġfunction Ġreturns Ġthe Ġ` n `- th Ġbody Ġstatement Ġ( in ĠAST Ġorder ) Ġas Ġspecified Ġin ĠT Ġor Ġ` null ` Ċ Ġ* Ġif Ġit Ġdoes Ġnot Ġexist Ġor Ġthe Ġtype Ġdoes Ġnot Ġmatch . Ċ Ġ* Ċ Ġ* ĠFor Ġconvenience , Ġ` n ` Ġdefaults Ġto Ġzero , Ġso Ġthat Ġthe Ġfirst Ġstatement Ġis Ġalways Ġeasy Ġto Ġfetch . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠStatement > ĠFunction Declaration . body OrNull ( n : ĠInt Ġ= Ġ 0 ): ĠT ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . body Ġis ĠCompound Statement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( body Ġas ? ĠCompound Statement )?. statements ?. filter Is Instance < T >() ?. get OrNull ( n ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ 0 Ġ&& Ġthis . body Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . body Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġinline Ġfunction Ġreturns Ġthe Ġ` n `- th Ġbody Ġstatement Ġ( in ĠAST Ġorder ) Ġas Ġspecified Ġin ĠT . ĠIt Ċ Ġ* Ġthrows Ġa Ġ[ Statement NotFound ] Ġexception Ġif Ġit Ġdoes Ġnot Ġexist Ġor Ġmatch Ġthe Ġtype . Ċ Ġ* Ċ Ġ* ĠFor Ġconvenience , Ġ` n ` Ġdefaults Ġto Ġzero , Ġso Ġthat Ġthe Ġfirst Ġstatement Ġis Ġalways Ġeasy Ġto Ġfetch . Ċ Ġ*/ Ċ @ Throws ( Statement NotFound :: class ) Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠStatement > ĠFunction Declaration . body ( n : ĠInt Ġ= Ġ 0 ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġbody OrNull ( n ) Ġ?: Ġthrow ĠStatement NotFound () Ċ } Ċ Ċ class ĠStatement NotFound Ġ: ĠException () Ċ Ċ class ĠDeclaration NotFound ( message : ĠString ) Ġ: ĠException ( message ) Ċ Ċ fun ĠNode . follow Prev EO G ( predicate : Ġ( Property Edge <* >) Ġ-> ĠBoolean ): ĠList < Property Edge <* >> ? Ġ{ ĊĠĠĠ Ġval Ġpath Ġ= Ġmutable ListOf < Property Edge <* >>() ĊĊĠĠĠ Ġfor Ġ( edge Ġin Ġthis . prev EO G Edges ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġedge . start ĊĊĠĠĠĠĠĠĠ Ġpath . add ( edge ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( edge )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsub Path Ġ= Ġsource . follow Prev EO G ( predicate ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sub Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . addAll ( sub Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ