/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠZ ac ĠS we ers Ċ Ġ* Ċ Ġ* Ġ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 Ġio . s we ers . copy dynamic Ċ Ċ import Ġcom . google . auto . common . More Elements Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . kotlin po et . Annotation Spec Ċ import Ġcom . squareup . kotlin po et . ClassName Ċ import Ġcom . squareup . kotlin po et . Code Block Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Lambda TypeName Ċ import Ġcom . squareup . kotlin po et . Name Allocator Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . squareup . kotlin po et . Property Spec Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . UNIT Ċ import Ġcom . squareup . kotlin po et . as ClassName Ċ import Ġcom . squareup . kotlin po et . class inspector . elements . Elements Class Inspector Ċ import Ġcom . squareup . kotlin po et . metadata . Kotlin Po et Metadata Preview Ċ import Ġcom . squareup . kotlin po et . metadata . specs . to Type Spec Ċ import Ġio . s we ers . copy dynamic . Copy Dynamic Processor . Companion . OPTION _ GENERATED Ċ import Ġio . s we ers . copy dynamic . annotations . Copy Dynamic Ċ import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Ċ import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Type Ċ import Ġjava . io . File Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . F iler Ċ import Ġjavax . annotation . processing . Mess ager Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . annotation . processing . Supported Options Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . util . Elements Ċ import Ġjavax . lang . model . util . Types Ċ import Ġjavax . tools . Diagnostic . Kind . ERROR Ċ Ċ @ Kotlin Po et Metadata Preview Ċ @ Incremental Annotation Processor ( Incremental Annotation Processor Type . DYNAMIC ) Ċ @ Supported Options ( OPTION _ GENERATED ) Ċ @ Auto Service ( Processor :: class ) Ċ class ĠCopy Dynamic Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġannotation Ġprocessing Ġargument Ġcan Ġbe Ġspecified Ġto Ġhave Ġa Ġ`@ Generated ` Ġannotation ĊĠĠĠĠ Ġ* Ġincluded Ġin Ġthe Ġgenerated Ġcode . ĠIt Ġis Ġnot Ġencour aged Ġunless Ġyou Ġneed Ġit Ġfor Ġstatic Ġanalysis ĊĠĠĠĠ Ġ* Ġreasons Ġand Ġnot Ġenabled Ġby Ġdefault . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġcan Ġonly Ġbe Ġone Ġof Ġthe Ġfollowing Ġvalues : ĊĠĠĠĠ Ġ* ĠĠ Ġ* Ġ`" javax . annotation . processing . Generated "` Ġ( J RE Ġ 9 +) ĊĠĠĠĠ Ġ* ĠĠ Ġ* Ġ`" javax . annotation . Generated "` Ġ( J RE Ġ< 9 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠOPTION _ GENERATED Ġ= Ġ" copy dynamic . generated " ĊĠĠĠ Ġconst Ġval ĠOPTION _ USE _ FIL ER Ġ= Ġ" copy dynamic . use F iler " ĊĠĠĠ Ġprivate Ġval ĠPOSS IBLE _ GENERATED _ NAMES Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ Ġ" javax . annotation . processing . Generated ", ĊĠĠĠĠĠĠĠ Ġ" javax . annotation . Generated " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval ĠALLOW ABLE _ PROPERTY _ VIS IBILITY Ġ= Ġset Of ( K Modifier . INTERNAL , ĠK Modifier . PUBLIC ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġlateinit Ġvar Ġf iler : ĠF iler ĊĠ Ġprivate Ġlateinit Ġvar Ġmess ager : ĠMess ager ĊĠ Ġprivate Ġlateinit Ġvar Ġelements : ĠElements ĊĠ Ġprivate Ġlateinit Ġvar Ġtypes : ĠTypes ĊĠ Ġprivate Ġlateinit Ġvar Ġoptions : ĠMap < String , ĠString > ĊĠ Ġprivate Ġlateinit Ġvar Ġwrite Fun : ĠFile Spec . () Ġ-> ĠUnit ĊĠ Ġprivate Ġvar Ġuse F iler Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġgenerated Annotation : ĠAnnotation Spec ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun Ġinit ( processing Env : ĠProcessing Environment ) Ġ{ ĊĠĠĠ Ġsuper . init ( processing Env ) ĊĠĠĠ Ġf iler Ġ= Ġprocessing Env . filer ĊĠĠĠ Ġmess ager Ġ= Ġprocessing Env . mess ager ĊĠĠĠ Ġelements Ġ= Ġprocessing Env . element Utils ĊĠĠĠ Ġtypes Ġ= Ġprocessing Env . type Utils ĊĠĠĠ Ġoptions Ġ= Ġprocessing Env . options ĊĠĠĠ Ġuse F iler Ġ= Ġprocessing Env . options [ OPTION _ USE _ FIL ER ]?. to Boolean () Ġ== Ġtrue ĊĠĠĠ Ġwrite Fun Ġ= Ġif Ġ( use F iler ) Ġ{ ĊĠĠĠĠĠ Ġ{ ĠwriteTo ( filer ) Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġoptions [" k apt . kotlin . generated "] ?. let (:: File ) Ġ?: Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠ Ġ" No Ġk apt . kotlin . generated Ġoption Ġprovided Ġand Ġalso Ġnot Ġusing ĠF iler ") ĊĠĠĠĠĠ Ġ({ ĠwriteTo ( output Dir ) Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġgenerated Annotation Ġ= Ġprocessing Env . options [ OPTION _ GENERATED ]?. let Ġ{ ĊĠĠĠĠĠ Ġrequire ( it Ġin ĠPOSS IBLE _ GENERATED _ NAMES ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Invalid Ġoption Ġvalue Ġfor Ġ$ OPTION _ GENERATED . ĠFound Ġ$ it , Ġallow able Ġvalues Ġare Ġ$ PO SS IBLE _ GENERATED _ NAMES ." ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelements . getType Element ( it ) ĊĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠ ĠAnnotation Spec . builder ( it . as ClassName ()) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Member (" value Ġ= Ġ[% S ]", ĠCopy Dynamic Processor :: class . java . canonical Name ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Member (" comments Ġ= Ġ% S ", Ġ" https :// github . com / hz s we ers / copy dynamic ") ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Supported Options (): ĠSet < String > Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( use F iler ) Ġ{ ĊĠĠĠĠĠ Ġset Of ( Incremental Annotation Processor Type . IS OL ATING . processor Option ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġempty Set () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ{ ĊĠĠĠ Ġreturn ĠSource Version . latest Supported () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠSet < String > Ġ{ ĊĠĠĠ Ġreturn Ġset Of ( Copy Dynamic :: class . java . canonical Name ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġprocess ( annotations : ĠSet < Type Element >, ĊĠĠĠĠĠ Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĊĠĠĠ Ġval Ġclass Inspector Ġ= ĠElements Class Inspector . create ( elements , Ġtypes ) ĊĠĠĠ Ġround Env . getElement s Annotated With ( Copy Dynamic :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠType Element Ġ} ĊĠĠĠĠĠĠĠ Ġ. associate With Ġ{ Ġit . to Type Spec ( class Inspector ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( element , Ġclass Data ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġcreate Type ( element , Ġclass Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Type ( element : ĠType Element , Ġclass Data : ĠType Spec ) Ġ{ ĊĠĠĠ Ġ// ĠFind Ġthe Ġprimary Ġconstructor ĊĠĠĠ Ġval Ġconstructor Ġ= Ġclass Data . primary Constructor ĊĠĠĠ Ġif Ġ( constructor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠ ĠERROR , Ġ"@ Copy Dynamic Ġcan 't Ġbe Ġapplied Ġto Ġ$ element : Ġmust Ġhave Ġa Ġprimary Ġconstructor ", ĊĠĠĠĠĠĠĠĠĠ Ġelement ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġproperties ByName Ġ= Ġclass Data . property Specs . associate By Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġval Ġparameters ByName Ġ= Ġconstructor . parameters . associate By Ġ{ Ġit . name Ġ} ĊĊĠĠĠ Ġ// ĠMake Ġsure Ġparameters Ġare Ġpublic Ġor Ġinternal ĊĠĠĠ Ġif Ġ( parameters ByName . keys . any Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġproperties ByName . getValue ( it ). modifiers . visibility Ġ! in ĠALLOW ABLE _ PROPERTY _ VIS IBILITY ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠ Ġmess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠ ĠERROR , ĊĠĠĠĠĠĠĠĠĠ Ġ"@ Copy Dynamic Ġcan 't Ġbe Ġapplied Ġto Ġ$ element : Ġconstructor Ġproperties Ġmust Ġhave Ġpublic Ġor Ġinternal Ġvisibility ", ĊĠĠĠĠĠĠĠĠĠ Ġelement ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreate Ġa ĠName Allocator Ġand Ġfill Ġits Ġcache Ġwith Ġexisting Ġparameter Ġnames Ġso Ġwe Ġdon 't Ġcol lide ĊĠĠĠ Ġ// Ġwith Ġour Ġown Ġparameter Ġname ĊĠĠĠ Ġval Ġname Allocator Ġ= ĠName Allocator () ĊĠĠĠ Ġparameters ByName . keys . forEach Ġ{ Ġname Allocator . new Name ( it ) Ġ} ĊĊĠĠĠ Ġval ĠpackageName Ġ= ĠMore Elements . get Package ( element ). toString () ĊĠĠĠ Ġval Ġbuilder Name Ġ= Ġ"${ element . simple Name } Dynamic Builder " ĊĠĠĠ Ġval Ġtype Params Ġ= Ġclass Data . type Variables ĊĠĠĠ Ġval Ġsource Type Ġ= Ġelement . as ClassName (). let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . parameter ized By (*( type Params . to Typed Array ())) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġvisibility Ġ= Ġclass Data . modifiers . visibility ĊĠĠĠ Ġval Ġsource Param Ġ= ĠParameter Spec . builder ( name Allocator . new Name (" source "), Ġsource Type ). build () ĊĠĠĠ Ġval Ġproperties Ġ= Ġmutable ListOf < Pair < String , ĠProperty Spec >>() ĊĠĠĠ Ġval Ġbuilder Spec Ġ= ĠType Spec . class Builder ( builder Name ) ĊĠĠĠĠĠĠĠ Ġ. add Origin ating Element ( element ) ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġgenerated Annotation ?. let (:: add Annotation ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( visibility Ġ!= ĠK Modifier . PUBLIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( visibility ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Variables ( type Params ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. primary Constructor ( Fun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . INTERNAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( source Param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠ Ġ. addProperty ( Property Spec . builder ( source Param . name , Ġsource Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ("% N ", Ġsource Param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġparameters ByName . forEach Ġ{ Ġ( name , Ġparameter ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Property ( Property Spec . builder ( name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mutable ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ("% N .% L ", Ġsource Param , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġproperties . add ( name Ġto Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ// ĠGenerate Ġthe Ġextension Ġfun ĊĠĠĠ Ġval Ġbuilder Spec Kind Ġ= ĠClass Name ( packageName , Ġbuilder Name ). let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . parameter ized By (*( type Params . to Typed Array ())) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcopy Block Param Ġ= ĠParameter Spec . builder (" copy Block ", ĊĠĠĠĠĠĠĠ ĠLambda TypeName . get ( receiver Ġ= Ġbuilder Spec Kind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠUNIT ĊĠĠĠĠĠĠĠ Ġ )). build () ĊĠĠĠ Ġval Ġcopy Code Block Ġ= ĠCode Block . of ( ĊĠĠĠĠĠĠĠ Ġ" copy (${ properties . join ToString (", Ġ") Ġ{ Ġ"${ it . first } Ġ= Ġ% N " Ġ} })", ĊĠĠĠĠĠĠĠ Ġ*( properties . map ( Pair < String , ĠProperty Spec >:: second ). to Typed Array ())) ĊĊĠĠĠ Ġval Ġextension Fun Ġ= ĠFun Spec . builder (" copy Dynamic ") ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġgenerated Annotation ?. let (:: add Annotation ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( visibility Ġ!= ĠK Modifier . PUBLIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( visibility ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Variables ( type Params ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. receiver ( source Type ) ĊĠĠĠĠĠĠĠ Ġ. returns ( source Type ) ĊĠĠĠĠĠĠĠ Ġ. add Parameter ( copy Block Param ) ĊĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġ% T ( this ). also Â· { Ġ% N ( it ) Ġ}. run Â· { Ġ% L Ġ} ", Ġbuilder Spec Kind , Ġcopy Block Param , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Code Block ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ ĠFile Spec . builder ( packageName , Ġbuilder Name ) ĊĠĠĠĠĠĠĠ Ġ. indent (" Ġ Ġ") ĊĠĠĠĠĠĠĠ Ġ. add Comment (" Code Ġgenerated Ġby Ġcopy dynamic . ĠDo Ġnot Ġedit .") ĊĠĠĠĠĠĠĠ Ġ. add Type ( builder Spec ) ĊĠĠĠĠĠĠĠ Ġ. addFunction ( extension Fun ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. write Fun () ĊĠ Ġ} Ċ } Ċ Ċ private Ġval ĠVIS IBILITY _ MODI FI ERS Ġ= Ġset Of ( ĊĠĠĠ ĠK Modifier . PUBLIC , ĊĠĠĠ ĠK Modifier . INTERNAL , ĊĠĠĠ ĠK Modifier . PROTECT ED , ĊĠĠĠ ĠK Modifier . PRIVATE Ċ ) Ċ Ċ private Ġval ĠK Modifier . is Visibility : ĠBoolean ĊĠ Ġget () Ġ= Ġthis Ġin ĠVIS IBILITY _ MODI FI ERS Ċ Ċ private Ġval ĠIterable < K Modifier >. visibility : ĠK Modifier ĊĠ Ġget () Ġ= Ġfind Ġ{ Ġit . is Visibility Ġ} Ġ?: ĠK Modifier . PUBLIC Ċ