/* Ċ Ġ* ĠS cribe Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠP arch ment MC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġorg . par ch ment mc . scribe . io Ċ Ċ import Ġcom . google . common . base . Char Matcher Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . squareup . mos hi . Types Ċ import Ġcom . squareup . mos hi . kotlin . reflect . Kotlin Json Adapter Factory Ċ import Ġok io . buffer Ċ import Ġok io . sink Ċ import Ġok io . source Ċ import Ġorg . par ch ment mc . feather . io . mos hi . Linked HashSet M oshi Adapter Ċ import Ġorg . par ch ment mc . feather . io . mos hi . MD CM oshi Adapter Ċ import Ġorg . par ch ment mc . feather . io . mos hi . Metadata M oshi Adapter Ċ import Ġorg . par ch ment mc . feather . io . mos hi . Offset DateTime Adapter Ċ import Ġorg . par ch ment mc . feather . io . mos hi . Simple Version Adapter Ċ import Ġorg . par ch ment mc . feather . mapping . Immutable Mapping Data Container Ċ import Ġorg . par ch ment mc . feather . mapping . Immutable Mapping Data Container . Immutable Class Data Ċ import Ġorg . par ch ment mc . feather . mapping . Mapping Data Builder Ċ import Ġorg . par ch ment mc . feather . mapping . Mapping Data Container . Class Data Ċ import Ġorg . par ch ment mc . feather . mapping . Mapping Data Container . Package Data Ċ import Ġorg . par ch ment mc . feather . mapping . Version ed M DC Delegate Ċ import Ġorg . par ch ment mc . feather . mapping . Version ed Mapping Data Container Ċ import Ġorg . par ch ment mc . feather . util . Simple Version Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Writer Ċ import Ġjava . nio . file . File Visit Result Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Simple File Visitor Ċ import Ġjava . nio . file . attribute . Basic File Attributes Ċ import Ġjava . util . Objects Ċ import Ġjava . util . Sorted Map Ċ import Ġjava . util . Weak HashMap Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . stream . Collectors Ċ Ċ private Ġval Ġinternal Holder Child Class Map Ġ= ĠWeak HashMap < Class Data , ĠSorted Map < String , ĠClass Data >>() Ċ Ċ val ĠClass Data . child Class Map : ĠSorted Map < String , ĠClass Data > ĊĠĠĠ Ġget () Ġ= Ġinternal Holder Child Class Map . compute If Absent ( this ) Ġ{ Ġsorted Map Of ( En igma Formatted Explo ded IO . CLASS _ NAME _ LENGTH _ THEN _ LEX ICO GRAPH IC ALLY ) Ġ} Ċ Ċ class ĠEn igma Formatted Explo ded IO ( private Ġval Ġm oshi : ĠM oshi , Ġprivate Ġval Ġjson Indent : ĠString , Ġprivate Ġval Ġextension : ĠString ) Ġ: ĠMapping Data IO Ġ{ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġwrite ( data : ĠVersion ed Mapping Data Container , Ġoutput : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Files Ġ= Ġoutput . take If ( Files :: exists )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . walk ( it ). use Ġ{ Ġs Ġ-> Ġs . filter ( Files :: is Regular File ). map ( Path :: to AbsolutePath ). collect ( Collectors . toSet ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( output ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Json Ġ= Ġoutput . resolve (" info . json "). to AbsolutePath () ĊĠĠĠĠĠĠĠ Ġexisting Files . remove ( info Json ) ĊĠĠĠĠĠĠĠ Ġinfo Json . sink (). buffer (). use Ġ{ Ġsink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠData Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . version Ġ= Ġdata . format Version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm oshi . adapter ( Data Info :: class . java ). indent ( json Indent ). toJson ( sink , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Json Ġ= Ġoutput . resolve (" packages . json ") ĊĠĠĠĠĠĠĠ Ġexisting Files . remove ( package Json ) ĊĠĠĠĠĠĠĠ Ġpackage Json . sink (). buffer (). use Ġ{ Ġsink Ġ-> Ġm oshi . adapter < Any >( PACKAGE _ COLLECTION _ TYPE ). indent ( json Indent ). toJson ( sink , Ġdata . packages ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclass Map Ġ= Ġmutable Map Of < String , ĠClass Data >() ĊĠĠĠĠĠĠĠ Ġval Ġclass Generator : Ġ( String ) Ġ-> ĠClass Data Ġ= Ġ{ Ġclassname Ġ-> Ġclass Map . compute If Absent ( classname ) Ġ{ Ġdata . getClass ( classname ) Ġ?: Ġempty Class Data ( classname ) Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġall Ġthe Ġchild Ġclass Ġmap Ġdata ĊĠĠĠĠĠĠĠ Ġdata . classes . flatMap To ( mutable Set Of ()) Ġ{ ĠEn igma Writer . expand Class ( it . name ) Ġ}. forEach Ġ{ Ġclassname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Class name Ġ= Ġclassname . substring Before Last ('$ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Class Data Ġ= Ġclass Generator ( upper Class name ) Ġ// ĠCan 't Ġinline Ġthis Ġas Ġwe Ġneed Ġto Ġalways Ġgenerate Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( upper Class name Ġ!= Ġclassname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Class Data . child Class Map [ classname . substring After Last ('$ ')] Ġ= Ġclass Generator ( classname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWrite Ġout Ġclasses ĊĠĠĠĠĠĠĠ Ġclass Map . values . filter Ġ{ Ġit . name . indexOf ('$ ') Ġ== Ġ- 1 Ġ}. forEach Ġ{ Ġclass Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapping File Ġ= Ġoutput . resolve ("${ class Data . name }. $ extension "). to AbsolutePath () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping File . parent ?. let ( Files :: create Directories ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Files . remove ( mapping File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . new Buffered Writer ( mapping File ). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEn igma Writer . write Class ( writer , Ġ 0 , Ġclass Data . name , Ġclass Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Child Map ( writer , Ġclass Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġany Ġremaining Ġfiles Ġthat Ġwe Ġdidn 't Ġwrite ĊĠĠĠĠĠĠĠ Ġexisting Files . forEach ( Files :: delete IfExists ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġread ( input : ĠPath , Ġmutable : ĠBoolean ): ĠVersion ed M DC Delegate < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinfo : ĠData Info ĊĠĠĠĠĠĠĠ Ġinput . resolve (" info . json "). source (). buffer (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= Ġm oshi . adapter ( Data Info :: class . java ). fromJson ( it ) Ġ?: Ġthrow ĠIOException (" info . json Ġdid Ġnot Ġdeserialize ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġpackages : ĠCollection < Package Data > ĊĠĠĠĠĠĠĠ Ġinput . resolve (" packages . json "). source (). buffer (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackages Ġ= Ġm oshi . adapter < Collection < Package Data >>( PACKAGE _ COLLECTION _ TYPE ). fromJson ( it ) Ġ?: Ġthrow ĠIOException (" packages . json Ġdid Ġnot Ġdeserialize ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠMapping Data Builder () ĊĠĠĠĠĠĠĠ Ġpackages . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . get OrCreate Package ( it . name ). add Javadoc ( it . javadoc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFiles . walk File Tree ( input , Ġobject Ġ: ĠSimple File Visitor < Path >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠPath , Ġattrs : ĠBasic File Attributes ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObjects . requireNonNull ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObjects . requireNonNull ( attrs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġfiles Ġnot Ġending Ġwith Ġthe Ġextension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . toString (). endsWith ( extension )) Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . new BufferedReader ( file ). use Ġ{ Ġreader Ġ-> ĠEn igma Reader . readFile ( builder , Ġreader ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġif Ġ( mutable ) Ġbuilder Ġelse ĠImmutable Mapping Data Container ( builder . packages , Ġbuilder . classes ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVersion ed M DC Delegate ( info . version Ġ?: Ġthrow ĠIllegalArgumentException (" info . json Ġversion Ġwas Ġnot Ġset "), Ġcontainer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠData Info ( var Ġversion : ĠSimple Version ? Ġ= Ġnull ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMO SH I Ġ= ĠM oshi . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Offset DateTime Adapter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( MD CM oshi Adapter ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Simple Version Adapter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Linked HashSet M oshi Adapter . FACTORY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Metadata M oshi Adapter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Last ( Kotlin Json Adapter Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval ĠINSTANCE Ġ= ĠEn igma Formatted Explo ded IO ( MO SH I , Ġ" ĠĠĠ Ġ", Ġ" mapping ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠD OL L AR _ SIGN : ĠChar Matcher Ġ= ĠChar Matcher .` is ` ('$ ') ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠCLASS _ NAME _ LENGTH _ THEN _ LEX ICO GRAPH IC ALLY : ĠComparator < String > Ġ= ĠComparator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. comp aring Int Ġ{ Ġobj : ĠString Ġ-> Ġobj . length Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Comp aring ( Function . identity ()) ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLASS Ġ= Ġ" CLASS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIELD Ġ= Ġ" FIELD " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMETHOD Ġ= Ġ" METHOD " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPARAM Ġ= Ġ" ARG " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMENT Ġ= Ġ" COMMENT " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPACK AGE _ COLLECTION _ TYPE Ġ= ĠTypes . new Parameterized Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMutable Collection :: class . java , ĠTypes . subtype Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Data :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġempty Class Data ( classname : ĠString ) Ġ= ĠImmutable Class Data ( classname , Ġempty List (), Ġempty List (), Ġempty List ()) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġwrite Child Map ( writer : ĠWriter , Ġclass Data : ĠClass Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Data . child Class Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEn igma Writer . write Class ( writer , ĠD OL L AR _ SIGN . count In ( it . name ), ĠEn igma Writer . strip To Most Inner ( it . name ), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Child Map ( writer , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }