import Ġcom . example . annotation . Builder Ċ import Ġcom . squareup . jav ap o et .* Ċ import Ġjava . util .* Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Package Element Ċ import Ġjavax . lang . model . element . Type Element Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ class ĠJava Builder Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSource Version . latest Supported () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of (" com . example . annotation . Builder ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Type ( type Element : ĠType Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Spec Builder Ġ= ĠType Spec . class Builder ("${ type Element . simple Name } Builder ") ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġtype Element . enc losed Elements . filter Is Instance < Executable Element >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . simple Name . toString () Ġ== Ġ"< init >" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĊĠĠĠĠĠĠĠ Ġconstructor . parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec Builder . addField ( ClassName . get ( it . as Type ()), Ġit . simple Name . toString (), ĠModifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Spec Ġ= ĠParameter Spec . builder ( ClassName . get ( it . as Type ()), Ġit . simple Name . toString ()). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec Builder . add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder (" with ${ it . simple Name . toString (). capitalize ( Locale . getDefault ()) }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( parameter Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" this .\ $ N Ġ= Ġ\$ N ", Ġit . simple Name , Ġit . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġthis ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( ClassName . best Guess ("${ type Element . qualified Name } Builder ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġconstructor . parameters . map Ġ{ Ġit . simple Name . toString () Ġ}. join ToString (", Ġ") ĊĠĠĠĠĠĠĠ Ġtype Spec Builder . add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder (" build ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( ClassName . get ( type Element . as Type ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġnew Ġ${ type Element . simple Name } ($ statements )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġjava File Builder Ġ= ĠJava File . builder (( type Element . enc lo sing Element Ġas ĠPackage Element ). qualified Name . toString (), Ġtype Spec Builder . build ()) ĊĠĠĠĠĠĠĠ Ġjava File Builder . skip Java Lang Imports ( true ). build (). writeTo ( processing Env . filer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element > ?, Ġround Env : ĠRound Environment ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġround Env !!. getElement s Annotated With ( Builder :: class . java ) ĊĠĠĠĠĠĠĠ Ġelements . filter Is Instance < Type Element >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġprocess Type ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ }