/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . android . build . gradle . internal . tasks . structure plugin Ċ Ċ import Ġcom . google . gson . Type Adapter Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġjava . util . Locale Ċ Ċ class ĠASP o et Info Json Adapter Ġ: ĠType Adapter < AS Po et Info >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġwrite ( output : ĠJson Writer , Ġdata : ĠASP o et Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . begin Object () ĊĠĠĠĠĠĠĠ Ġoutput . name (" input Version "). value ( data . po et Version ) ĊĊĠĠĠĠĠĠĠ Ġwrite Project Config ( output , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġoutput . end Object () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Project Config ( output : ĠJson Writer , Ġdata : ĠASP o et Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . name (" project Config "). begin Object () ĊĠĠĠĠĠĠĠ Ġoutput . name (" projectName "). value (" generated ") ĊĠĠĠĠĠĠĠ Ġoutput . name (" root "). value ("./ ") ĊĊĠĠĠĠĠĠĠ Ġwrite Build System Config ( output , Ġdata ) ĊĠĠĠĠĠĠĠ Ġwrite Module Configs ( output , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġoutput . end Object () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Build System Config ( output : ĠJson Writer , Ġdata : ĠASP o et Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . name (" build System Config "). begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" build System Version "). value ( data . gradle Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" ag p Version "). value ( data . ag p Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Object () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Module Configs ( output : ĠJson Writer , Ġdata : ĠASP o et Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . name (" module Configs "). begin Array () ĊĠĠĠĠĠĠĠ Ġdata . modules . forEach Ġ{ ĠJava Module Info Json Adapter (). write ( output , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . end Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( input : ĠJson Reader ): ĠASP o et Info Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Full ĠConfig Ġreading Ġnot Ġsupported .") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠJava Module Info Json Adapter Ġ: ĠType Adapter < Module Info >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġwrite ( output : ĠJson Writer , Ġdata : ĠModule Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . begin Object () ĊĊĠĠĠĠĠĠĠ Ġoutput . name (" moduleName "). value ( data . name ) ĊĠĠĠĠĠĠĠ Ġoutput . name (" module Type "). value ( data . type . toString (). toLowerCase ( Locale . US )) ĊĊĠĠĠĠĠĠĠ Ġwrite Source Files Info ( output , Ġ" java ", Ġdata . java Source Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( data . use Kotlin ) Ġoutput . name (" use Kotlin "). value ( data . use Kotlin ) ĊĠĠĠĠĠĠĠ Ġwrite Source Files Info ( output , Ġ" kotlin ", Ġdata . kotlin Source Info ) ĊĊĠĠĠĠĠĠĠ Ġwrite Android Fields ( output , Ġdata ) ĊĠĠĠĠĠĠĠ Ġwrite Dependencies ( output , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġoutput . end Object () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Source Files Info ( output : ĠJson Writer , Ġlanguage : ĠString , Ġdata : ĠSource Files Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . isEmpty ) Ġreturn ĊĠĠĠĠĠĠĠ Ġoutput . name ( language ) ĊĠĠĠĠĠĠĠ Ġoutput . begin Object () ĊĠĠĠĠĠĠĠ Ġoutput . name (" packages "). value ( data . packages ) ĊĠĠĠĠĠĠĠ Ġoutput . name (" classes Per Package "). value ( data . classes Per Package ) ĊĠĠĠĠĠĠĠ Ġoutput . name (" methods Per Class "). value ( data . methods Per Class ) ĊĠĠĠĠĠĠĠ Ġoutput . name (" fields Per Class "). value ( data . fields Per Class ) ĊĠĠĠĠĠĠĠ Ġoutput . end Object () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Dependencies ( output : ĠJson Writer , Ġdata : ĠModule Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . name (" dependencies "). begin Array () ĊĠĠĠĠĠĠĠ Ġdata . dependencies . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. name ( it . type . json Value ). value ( it . dependency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" method "). value ( it . scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Object () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . end Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Android Fields ( output : ĠJson Writer , Ġdata : Ġcom . android . build . gradle . internal . tasks . structure plugin . Module Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . type Ġ!= Ġcom . android . build . gradle . internal . tasks . structure plugin . Module Type . ANDROID ) Ġreturn ĊĠĠĠĠĠĠĠ Ġoutput . name (" android Build Config "). begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" min Sdk Version "). value ( data . android Build Config . min Sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" target Sdk Version "). value ( data . android Build Config . target Sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" compile Sdk Version "). value ( data . android Build Config . compile Sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Object () ĊĠĠĠĠĠĠĠ Ġoutput . name (" activity Count "). value ( data . activity Count ) ĊĠĠĠĠĠĠĠ Ġoutput . name (" has Launch Activity "). value ( data . has Launch Activity ) ĊĠĠĠĠĠĠĠ Ġoutput . name (" resources Config "). begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" string Count "). value ( data . resources . string Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" image Count "). value ( data . resources . image Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" layout Count "). value ( data . resources . layout Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Object () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( input : ĠJson Reader ): ĠModule Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠModule Info () ĊĊĠĠĠĠĠĠĠ Ġinput . read Object Properties Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" moduleName " Ġ-> Ġdata . name Ġ= Ġnext String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" module Type " Ġ-> Ġdata . type Ġ= ĠModule Type . valueOf ( next String (). toUpperCase ( Locale . US )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " Ġ-> Ġdata . java Source Info Ġ= Ġread Source Files Info ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" use Kotlin " Ġ-> Ġdata . use Kotlin Ġ= Ġnext Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin " Ġ-> Ġdata . kotlin Source Info Ġ= Ġread Source Files Info ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dependencies " Ġ-> Ġdata . dependencies Ġ= Ġread Dependencies ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" activity Count " Ġ-> Ġdata . activity Count Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" has Launch Activity " Ġ-> Ġdata . has Launch Activity Ġ= Ġnext Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android Build Config " Ġ-> Ġdata . android Build Config Ġ= Ġread Android Build Config ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" resources Config " Ġ-> Ġdata . resources Ġ= Ġread Resources ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġskip Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Source Files Info ( input : ĠJson Reader ): ĠSource Files Info Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpackages Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġclasses Per Package Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġmethods Per Class Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġfields Per Class Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinput . read Object Properties Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" packages " Ġ-> Ġpackages Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" classes Per Package " Ġ-> Ġclasses Per Package Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" methods Per Class " Ġ-> Ġmethods Per Class Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fields Per Class " Ġ-> Ġfields Per Class Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġskip Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSource Files Info ( packages , Ġclasses Per Package , Ġmethods Per Class , Ġfields Per Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Dependencies ( input : ĠJson Reader ): ĠMutable List < Po et Dependencies Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġmutable ListOf < Po et Dependencies Info >() ĊĊĠĠĠĠĠĠĠ Ġinput . read Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype : ĠDependency Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdependency : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscope : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Object Properties Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" moduleName " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠDependency Type . MODULE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Ġ= Ġnext String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" library " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠDependency Type . EXTERNAL _ LIBRARY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Ġ= Ġnext String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" method " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġnext String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġskip Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPo et Dependencies Info ( type !! , Ġscope !! , Ġdependency !! )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdependencies ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Resources ( input : ĠJson Reader ): ĠPo et Resource Info Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstring Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġimage Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġlayout Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinput . read Object Properties Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" string Count " Ġ-> Ġstring Count Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" image Count " Ġ-> Ġimage Count Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" layout Count " Ġ-> Ġlayout Count Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġskip Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPo et Resource Info ( string Count , Ġimage Count , Ġlayout Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Android Build Config ( input : ĠJson Reader ) Ġ: ĠAndroid Build Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Config Ġ= ĠAndroid Build Config () ĊĠĠĠĠĠĠĠ Ġinput . read Object Properties Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" min Sdk Version " Ġ-> Ġbuild Config . min Sdk Version Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" target Sdk Version " Ġ-> Ġbuild Config . target Sdk Version Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" compile Sdk Version " Ġ-> Ġbuild Config . compile Sdk Version Ġ= Ġnext Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġskip Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Config ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġinline Ġfun ĠJson Reader . read Object Properties ( consumer : ĠJson Reader .( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġbegin Object () ĊĠĠĠ Ġwhile Ġ( hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġconsumer ( this , Ġnext Name ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġend Object () Ċ } Ċ Ċ private Ġinline Ġfun ĠJson Reader . read Array ( object Reader : ĠJson Reader . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġbegin Array () ĊĠĠĠ Ġwhile Ġ( hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Reader () ĊĠĠĠ Ġ} ĊĠĠĠ Ġend Array () Ċ } Ċ