package Ġdev . mo ata z . kl query . codegen Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . Import Ċ import Ġdev . mo ata z . kl query . annotation . KL Query Ċ import Ġdev . mo ata z . kl query . util . Constants . CLASS _ POST FIX _ NAME Ċ import Ġdev . mo ata z . kl query . util . has Declared Types Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . tools . Diagnostic Ċ Ċ @ Auto Service ( Processor :: class ) Ċ class ĠQuery Processor : ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ= ĠSource Version . latest () ĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ= Ġmutable Set Of ( KL Query :: class . java . name ) ĊĠĠĠ Ġprivate Ġval Ġdeclared Elements : ĠQueue < Element > Ġ= ĠLinkedList < Element >() ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element > ?, Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk apt Kotlin Generated Dir Ġ= Ġprocessing Env . options [ K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ] Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġround Env . getElement s Annotated With ( KL Query :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , Ġ" Only Ġclasses Ġcan Ġbe Ġannotated Ġwith Ġ@ KL Query Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . has Declared Types ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . NOTE , Ġ" has Declared Types : Ġ Ġ${ element . simple Name } Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Elements . offer ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . NOTE , Ġ" generate Query Info : Ġ Ġ${ element . simple Name } Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Query Info ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġquery Info Ġ-> Ġbuild File Spec ( query Info ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġfile Spec Ġ-> Ġfile Spec . writeTo ( File ( k apt Kotlin Generated Dir )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( declared Elements . peek () Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Elements . poll ()?. let Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , Ġ" Only Ġclasses Ġcan Ġbe Ġannotated Ġwith Ġ@ KL Query Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . NOTE , Ġ" generate Query Info From Queue : Ġ Ġ${ element . simple Name } Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Query Info ( element ). let Ġ{ Ġquery Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild File Spec ( query Info ). apply Ġ{ ĠwriteTo ( File ( k apt Kotlin Generated Dir )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild File Spec ( query Info : ĠQuery Info ): ĠFile Spec { ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġquery Info . query ClassName ĊĠĠĠĠĠĠĠ Ġval Ġfile Builder Ġ= ĠFile Spec . builder ( query Info . query Package , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Builder . add Type ( QueryBuilder ( query Info ). build Class ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( QueryBuilder ( query Info ). build DSL ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Import (" dev . mo ata z . kl query . util ", Ġ" set F irs Char Small ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Query Info ( query Class Element : ĠElement ): ĠQuery Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Package Ġ= Ġprocessing Env . element Utils . get Package Of ( query Class Element ). toString () ĊĠĠĠĠĠĠĠ Ġval Ġitem ClassName Ġ= Ġquery Class Element . as Type (). toString (). drop ( item Package . length Ġ+ Ġ 1 )+ CLASS _ POST FIX _ NAME ĊĠĠĠĠĠĠĠ Ġreturn ĠQuery Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Class Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Package , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ClassName ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK AP T _ K OT LIN _ GENERATED _ OPTION _ NAME Ġ= Ġ" k apt . kotlin . generated " ĊĠĠĠ Ġ} Ċ }