/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠAnd rei ĠHe ide lb acher Ġ< and rei . he ide lb acher @ gmail . com > Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . chron ol ens . java Ċ Ċ import Ġorg . chron ol ens . core . model . Function Ċ import Ġorg . chron ol ens . core . model . Source Entity Ċ import Ġorg . chron ol ens . core . model . SourceFile Ċ import Ġorg . chron ol ens . core . model . Source Node . Companion . CONTAINER _ SEPARATOR Ċ import Ġorg . chron ol ens . core . model . Source Node . Companion . MEMBER _ SEPARATOR Ċ import Ġorg . chron ol ens . core . model . Type Ċ import Ġorg . chron ol ens . core . model . Variable Ċ import Ġorg . chron ol ens . core . model . returnType Modifier Of Ċ import Ġorg . chron ol ens . core . model . type Modifier Of Ċ import Ġorg . eclipse . jdt . core . dom . AST Node Ċ import Ġorg . eclipse . jdt . core . dom . Abstract Type Declaration Ċ import Ġorg . eclipse . jdt . core . dom . Annotation Type Member Declaration Ċ import Ġorg . eclipse . jdt . core . dom . Compilation Unit Ċ import Ġorg . eclipse . jdt . core . dom . Enum Constant Declaration Ċ import Ġorg . eclipse . jdt . core . dom . Initializer Ċ import Ġorg . eclipse . jdt . core . dom . Method Declaration Ċ import Ġorg . eclipse . jdt . core . dom . Variable Declaration Ċ Ċ internal Ġdata Ġclass ĠParser Context ( ĊĠĠĠ Ġprivate Ġval Ġpath : ĠString , ĊĠĠĠ Ġprivate Ġval Ġsource : ĠString , ĊĠĠĠ Ġprivate Ġval ĠparentId : ĠString Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . to Source (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġsource . substring ( start Position , ĠstartPosition Ġ+ Ġlength ) ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . modifier Set (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadditional Modifier Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAbstract Type Declaration Ġ-> Ġtype Modifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Declaration Ġ-> ĠreturnType ()?. let (:: returnType Modifier Of ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtype ()?. let (:: type Modifier Of ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġget Modifiers ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Source () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. require Distinct () ĊĠĠĠĠĠĠĠ Ġreturn Ġmodifiers Ġ+ ĠlistOf NotNull ( additional Modifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMethod Declaration . body (): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġbody ?. to Source (). to Block () ĊĊĠĠĠ Ġprivate Ġfun ĠVariable Declaration . initializer (): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġinitializer ?. to Source (). to Block () ĊĊĠĠĠ Ġprivate Ġfun ĠEnum Constant Declaration . initializer (): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġanonymous Class Declaration ?. to Source (). to Block () ĊĊĠĠĠ Ġprivate Ġfun ĠAnnotation Type Member Declaration . defaultValue (): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġdefault ?. to Source (). to Block () ĊĊĠĠĠ Ġprivate Ġfun Ġget TypeId ( name : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"$ parentId $ CONTAINER _ SEPARATOR $ name " ĊĊĠĠĠ Ġprivate Ġfun Ġget Function Id ( signature : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"$ parentId $ MEMBER _ SEPARATOR $ signature " ĊĊĠĠĠ Ġprivate Ġfun Ġget Variable Id ( name : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"$ parentId $ MEMBER _ SEPARATOR $ name " ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Member ( node : ĠAny ?): ĠSource Entity ? Ġ= Ġwhen Ġ( node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠAbstract Type Declaration Ġ-> Ġvisit ( node ) ĊĠĠĠĠĠĠĠ Ġis ĠAnnotation Type Member Declaration Ġ-> Ġvisit ( node ) ĊĠĠĠĠĠĠĠ Ġis ĠEnum Constant Declaration Ġ-> Ġvisit ( node ) ĊĠĠĠĠĠĠĠ Ġis ĠVariable Declaration Ġ-> Ġvisit ( node ) ĊĠĠĠĠĠĠĠ Ġis ĠMethod Declaration Ġ-> Ġvisit ( node ) ĊĠĠĠĠĠĠĠ Ġis ĠInitial izer Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" Unknown Ġdeclaration Ġ'$ node ' !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit ( node : ĠAbstract Type Declaration ): ĠType Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Not Malformed ( node ) ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġget TypeId ( node . name ()) ĊĠĠĠĠĠĠĠ Ġval Ġchild Context Ġ= Ġcopy ( parentId Ġ= Ġid ) ĊĠĠĠĠĠĠĠ Ġval Ġmembers Ġ= Ġnode . members (). map NotNull ( child Context :: visit Member ) ĊĠĠĠĠĠĠĠ Ġmembers . map ( Source Entity :: simple Id ). require Distinct () ĊĠĠĠĠĠĠĠ Ġreturn ĠType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġnode . name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsup ert ypes Ġ= Ġnode . sup ert ypes (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifiers Ġ= Ġnode . modifier Set (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmembers Ġ= Ġmembers . toSet () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit ( node : ĠAnnotation Type Member Declaration ): ĠVariable Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Not Malformed ( node ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVariable ( node . name (), Ġnode . modifier Set (), Ġnode . defaultValue ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit ( node : ĠEnum Constant Declaration ): ĠVariable Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Not Malformed ( node ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVariable ( node . name (), Ġnode . modifier Set (), Ġnode . initializer ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit ( node : ĠVariable Declaration ): ĠVariable Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Not Malformed ( node ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVariable ( node . name (), Ġnode . modifier Set (), Ġnode . initializer ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit ( node : ĠMethod Declaration ): ĠFunction Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Not Malformed ( node ) ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġnode . parameter List () ĊĠĠĠĠĠĠĠ Ġparameters . require Distinct () ĊĠĠĠĠĠĠĠ Ġreturn ĠFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Ġ= Ġnode . signature (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġparameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifiers Ġ= Ġnode . modifier Set (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġnode . body () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( node : ĠCompilation Unit ): ĠSource File Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Not Malformed ( node ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Context Ġ= Ġcopy ( parentId Ġ= Ġpath ) ĊĠĠĠĠĠĠĠ Ġval Ġentities Ġ= Ġnode . types () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. require Is Instance < Abstract Type Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( child Context :: visit ) ĊĠĠĠĠĠĠĠ Ġentities . map ( Type :: name ). require Distinct () ĊĠĠĠĠĠĠĠ Ġreturn ĠSource File ( path , Ġentities . toSet ()) ĊĠĠĠ Ġ} Ċ } Ċ