package Ġcom . program mers box . dsl processor Ċ Ċ // import Ġcom . program mers box . dsl processor . AP Utils . getType Mirror From Annotation Value Ċ /* import Ġme . e ug eni om ar let ti . kotlin . metadata . Kotlin Class Metadata Ċ import Ġme . e ug eni om ar let ti . kotlin . metadata . kotlin Metadata Ċ import Ġme . e ug eni om ar let ti . kotlin . metadata . proto */ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . program mers box . dsl annotations . Dsl Field Ċ import Ġjavax . annotation . processing .* Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Type Element Ċ Ċ @ Auto Service ( Processor :: class ) Ċ @ Supported Source Version ( Source Version . RELEASE _ 8 ) Ċ @ Supported Options ( Dsl Fields Processor . K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ) Ċ class ĠD sl Fields Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK AP T _ K OT LIN _ GENERATED _ OPTION _ NAME Ġ= Ġ" k apt . kotlin . generated " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġannotation Ġ= ĠD sl Field :: class . java ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element >, Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* val Ġfunctions Ġ= Ġround Env . getElement s Annotated With ( annotation ). map NotNull Ġ{ Ġmethod Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" -------------------------------- ------------ ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Element . kind Ġ!= ĠElement Kind . FIELD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . error message Ġ{ Ġ" Can Ġonly Ġbe Ġapplied Ġto Ġvariables , Ġ Ġelement : Ġ$ method Element Ġ" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġ( method Element Ġas ? ĠVariable Element )?. let Ġ{ Ġgenerate New Method ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spec Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . get Package Of ( method Element ). toString () Ġto Ġspec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Sources Root : ĠString Ġ= Ġprocessing Env . options [ K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ]. or Empty () ĊĠĠĠĠĠĠĠ Ġif Ġ( generated Sources Root . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . error message Ġ{ Ġ" Can 't Ġfind Ġthe Ġtarget Ġdirectory Ġfor Ġgenerated ĠKotlin Ġfiles ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// println ( functions . join ToString ("\ n ")) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( functions . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Group Ġ= Ġfunctions . groupBy Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( g Ġin Ġpackage Group . entries . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( generated Sources Root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġfile . mkdir () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Builder Ġ= ĠFile Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . value . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dsl Fields Generated ${ g . index }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . value . value . forEach Ġ{ Ġfile Builder . addFunction ( it . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . also Ġ{ Ġprintln ( it . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* private Ġfun Ġgenerate New Method ( variable : ĠVariable Element ): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Info Ġ= Ġvariable . getAnnotation ( annotation ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFun Spec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder ( annotation Info . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( variable . enc lo sing Element . as Type (). as TypeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc ( annotation Info . comment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Data Ġ= Ġ( variable . enc lo sing Element . kotlin Metadata Ġas ? ĠKotlin Class Metadata )?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Data ?. let Ġ{ Ġbuilder . add Type Variables ( generic Type Names ( it . class Proto , Ġit . name Resolver )) Ġ} Ġ?: Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( variable . enc lo sing Element Ġas ? ĠType Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . type Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠType Variable Name ( it . simple Name . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġbuilder . add Type Variables ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa : ĠD sl Field Ġ= Ġannotation Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetType Mirror From Annotation Value ( object Ġ: ĠAP Utils . GetClass Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . dsl Marker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ?. forEach Ġ{ Ġit ?. let Ġ{ Ġ( it . as TypeName (). java To Kotlin Type () Ġas ? ĠClass Name )?. let Ġ{ Ġbuilder . add Annotation ( it ) Ġ} Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Annotation ( Dsl Field Marker :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Data Ġ= Ġ( variable . enc lo sing Element . kotlin Metadata Ġas ? ĠKotlin Class Metadata )?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġclass Data ?. proto ?. property List ?. find Ġ{ Ġclass Data . name Resolver . getString ( it . name ) Ġ== Ġvariable . simple Name . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty ?. returnType ?. as TypeName ( class Data . name Resolver , Ġclass Data . class Proto :: getType Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġvariable . as Type (). as TypeName (). java To Kotlin Type 2 (). copy ( nullable Ġ= Ġis Nullable Property ( variable )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ("${ variable . simple Name } Ġ= Ġblock ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ= Ġmutable Set Of ( annotation . canonical Name ) Ċ } Ċ