package Ġcom . kp stv . processor Ċ Ċ import Ġcom . kp stv . bindings .* Ċ import Ġcom . kp stv . processor . generators .* Ċ import Ġcom . kp stv . processor . generators . auto . SQL Del ight Adapter Processor Ċ import Ġcom . kp stv . processor . generators . auto . Type Converter Processor Ċ import Ġcom . kp stv . processor . utils .* Ċ import Ġcom . squareup . jav ap o et .* Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element .* Ċ import Ġjavax . lang . model . util . Element Filter Ċ import Ġjavax . tools . Diagnostic Ċ Ċ class ĠBinding Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generate SQL Del ight Adapters :: class . java . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generate Converter :: class . java . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generate Map Converter :: class . java . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generate Pair Converter :: class . java . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generate List Converter :: class . java . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView ListAdapter :: class . java . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView Adapter :: class . java . canonical Name , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Options (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Utils . disable Incremental Processing ( processing Env )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of ( Consts . IS OL ATING _ AN NOT ATION _ PROCESS ORS _ IND IC ATOR ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . get Supported Options () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSource Version . latest Supported () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġannotations : ĠMutable Set < out ĠType Element > ?, ĊĠĠĠĠĠĠĠ Ġenv : ĠRound Environment ?, ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġparse RecyclerView Annotation ( env ) ĊĠĠĠĠĠĠĠ Ġparse RecyclerView List Annotation ( env ) ĊĠĠĠĠĠĠĠ Ġparse Auto Generate Annotations ( env ) ĊĠĠĠĠĠĠĠ Ġparse Auto Generate SQL Del ight Annotations ( env ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Auto Generate SQL Del ight Annotations ( env : ĠRound Environment ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauto Generate SQL Del ight Annotation Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv ?. getElement s Annotated With ( Auto Generate SQL Del ight Adapters :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= ĠElement Filter . types In ( auto Generate SQL Del ight Annotation Types ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġelements . forEach Ġ{ Ġtype Element Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! type Element . modifiers . contains ( Modifier . AB STR ACT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ type Element . qualified Name }: ĠClass Ġmust Ġbe Ġan Ġinterface ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġprocessing Env . element Utils . get Package Of ( type Element ). qualified Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ClassName Ġ= ĠClass Name . get ( type Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated ClassName Ġ= ĠClass Name . get ( packageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . simple Name . toString () Ġ+ Ġ" Impl ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Builder Ġ= ĠType Spec . class Builder ( generated ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( original ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Spec . builder ( generated ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Instance ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer (" new Ġ\$ T ()", Ġgenerated ClassName ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserializer Type Ġ= Ġtype Element . getAnnotation ( Auto Generate SQL Del ight Adapters :: class . java ). using ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . enc losed Elements . forEach Ġen closed @{ Ġen closed Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutable Element Ġ= Ġen closed Element Ġas ĠExec utable Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= ĠParameter ized TypeName . get ( executable Element . returnType ) Ġas ĠParameter ized TypeName ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Type Ġ= ĠreturnType . type Arguments [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Type Ġ= ĠreturnType . type Arguments [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Type . simple Name () Ġ!= Ġ" String ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ executable Element . simple Name }: ĠMethod 's Ġreturn Ġtype Ġmust Ġbe ĠColumn Adapter < *, ĠString >") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ enc losed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Builder . add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Del ight Adapter Processor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Name Ġ= Ġen closed Element . simple Name . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Type Ġ= Ġserializer Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase DataType Ġ= Ġbase Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). generate Method () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Builder . addField ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Spec . builder ( returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġen closed Element . simple Name . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PUBLIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer (" Instance .${ enc losed Element . simple Name }() ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . write ( packageName , Ġadapter Builder . build (), Ġprocessing Env ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Auto Generate Annotations ( env : ĠRound Environment ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauto Generate Annotation Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv ?. getElement s Annotated With ( Auto Generate Converter :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġnormal Types Ġ= ĠElement Filter . types In ( auto Generate Annotation Types ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġauto Generate List Annotation Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv ?. getElement s Annotated With ( Auto Generate List Converter :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Types Ġ= ĠElement Filter . types In ( auto Generate List Annotation Types ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġauto Generate Map Annotation Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv ?. getElement s Annotated With ( Auto Generate Map Converter :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġmap Types Ġ= ĠElement Filter . types In ( auto Generate Map Annotation Types ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġauto Generate Pair Annotation Types Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv ?. getElement s Annotated With ( Auto Generate Pair Converter :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpair Types Ġ= ĠElement Filter . types In ( auto Generate Pair Annotation Types ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġnormal Types . forEach Ġ{ Ġtype Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Attributes Ġ= Ġtype Element . getAnnotation ( Auto Generate Converter :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Parse Converter Annotation ( type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Attributes . using , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generator DataType . DATA ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlist Types . forEach Ġ{ Ġtype Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Attributes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation ( Auto Generate List Converter :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Parse Converter Annotation ( type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Attributes . using , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generator DataType . LIST ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Types . forEach Ġ{ Ġtype Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Attributes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation ( Auto Generate Map Converter :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation Class Value < Auto Generate Map Converter > Ġ{ Ġannotation Attributes . key Class Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Parse Converter Annotation ( type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Attributes . using , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generator DataType . MAP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( map Value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpair Types . forEach Ġ{ Ġtype Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Attributes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation ( Auto Generate Pair Converter :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation Class Value < Auto Generate Pair Converter > Ġ{ Ġannotation Attributes . key Class Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Parse Converter Annotation ( type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Attributes . using , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Generator DataType . PAIR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( map Value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcommon Parse Converter Annotation ( ĊĠĠĠĠĠĠĠ Ġtype Element : ĠType Element , ĊĠĠĠĠĠĠĠ Ġusing : ĠConverter Type , ĊĠĠĠĠĠĠĠ Ġgenerator DataType : ĠAuto Generator DataType , ĊĠĠĠĠĠĠĠ Ġsecond Class : ĠType Name ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . get Package Of ( type Element ). qualified Name . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġenum List = Ġtype Element . enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġele Ġ-> Ġele . kind Ġ== ĠElement Kind . FIELD Ġ&& ĠUtils . is Enum ( ele . as Type (), Ġprocessing Env . type Utils ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġele Ġ-> Ġele . getAnnotation ( Ignore Converter :: class . java ) Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠClass Name . get ( it . as Type ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġtype Element . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal ClassName Ġ= ĠClass Name . get ( type Element ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( packageName , ĠtypeName Ġ+ ĠUtils . get Appro priate Suffix ( generator DataType )) ĊĊĠĠĠĠĠĠĠ Ġval Ġconverter Builder Ġ= ĠType Spec . class Builder ( generated ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Converter Processor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec Builder Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum List Ġ= Ġenum List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Type Ġ= Ġusing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator DataType Ġ= Ġgenerator DataType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst ClassType Ġ= Ġoriginal ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond ClassType Ġ= Ġsecond Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠUtils . write ( packageName , Ġconverter Builder . build (), Ġprocessing Env , Ġtype Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse RecyclerView List Annotation ( env : ĠRound Environment ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView List Annotations Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv ?. getElement s Annotated With ( RecyclerView ListAdapter :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠElement Filter . types In ( re cyclerView List Annotations ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġtypes . forEach Ġ{ Ġtype Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataType Mirror Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation Class Value < RecyclerView ListAdapter > Ġ{ ĠdataSet Type Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . get Package Of ( type Element ). qualified Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġtype Element . simple Name . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ClassName Ġ= ĠClass Name . get ( packageName , ĠtypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated ClassName Ġ= ĠClass Name . get ( packageName , ĠConst s . adapter Prefix Ġ+ ĠtypeName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠviewHolder ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( generated ClassName . canonical Name (), ĠtypeName Ġ+ ĠConst s . holder Suffix ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextended Adapter ClassName Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConst s . CLASS NAME _ LIST ADAPTER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( dataType Mirror ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name . get ( view Holder ClassName . canonical Name ()). box () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Util Ġ= ĠDiff Util Generator . generate Diff Util ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( dataType Mirror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Builder Ġ= ĠType Spec . class Builder ( generated ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField ( original ClassName , ĠConst s . className , ĠModifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( ViewHolder Generator . create ViewHolder ( view Holder ClassName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( extended Adapter ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( original ClassName , ĠConst s . className , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" super (${ diff Util }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" this .${ Consts . className } Ġ= Ġ${ Consts . className }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBind View Generator . generate On BindView List Holder ( it , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ViewType Generator . generate Item ViewType ( type Element )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . write ( packageName , Ġadapter Builder . build (), Ġprocessing Env , Ġtype Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse RecyclerView Annotation ( env : ĠRound Environment ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Annotations Ġ= Ġenv ?. getElement s Annotated With ( RecyclerView Adapter :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠElement Filter . types In ( re cyclerView Annotations ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġtypes . forEach Ġ{ Ġtype Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataType Mirror Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . getAnnotation Class Value < RecyclerView Adapter > Ġ{ ĠdataSet Type Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . get Package Of ( type Element ). qualified Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġtype Element . simple Name . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ClassName Ġ= ĠClass Name . get ( packageName , ĠtypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated ClassName Ġ= ĠClass Name . get ( packageName , ĠConst s . adapter Prefix Ġ+ ĠtypeName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠviewHolder ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( generated ClassName . canonical Name (), ĠtypeName Ġ+ ĠConst s . holder Suffix ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġbuilding Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextended Adapter ClassName Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConst s . CLASS NAME _ REC Y CL ER VIEW . packageName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConst s . CLASS NAME _ REC Y CL ER VIEW . simple Name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Adapter < ${ generated ClassName }.${ view Holder ClassName . simple Name () }> " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSet Parameter Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( Mutable List :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( dataType Mirror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Builder Ġ= ĠType Spec . class Builder ( generated ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( ViewHolder Generator . create ViewHolder ( view Holder ClassName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( extended Adapter ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet Parameter , ĠConst s . data Set , ĠModifier . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField ( original ClassName , ĠConst s . className , ĠModifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( original ClassName , ĠConst s . className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( data Set Parameter , ĠConst s . data Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" this .${ Consts . className } Ġ= Ġ${ Consts . className }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" this .${ Consts . data Set } Ġ= Ġ${ Consts . data Set }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBind View Generator . generate On Bind ViewHolder ( it , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ViewType Generator . generate Item ViewType ( type Element )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ItemCount Generator . generate GetItem Count Method ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . write ( packageName , Ġadapter Builder . build (), Ġprocessing Env , Ġtype Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }