package Ġcom . fold right . auto . pipeline . processor . generator Ċ Ċ import Ġcom . fold right . auto . pipeline . processor . Auto Pipeline Class Descriptor Ċ import Ġcom . fold right . auto . pipeline . processor . Auto Pipeline Operators Descriptor . Companion . expand Ċ import Ġcom . squareup . jav ap o et .* Ċ import Ġjavax . annotation . processing . F iler Ċ import Ġjavax . lang . model . element . Modifier Ċ Ċ class ĠAbstract HandlerContext Generator ( private Ġval Ġdesc : ĠAuto Pipeline Class Descriptor , Ġprivate Ġval Ġf iler : ĠF iler ) Ġ: ĊĠĠĠ ĠAbstract Generator ( desc ) Ġ{ ĊĊĠĠĠ Ġfun Ġgen () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġabstract Context Class Builder Ġ= ĠType Spec . class Builder ( desc . abstract HandlerContext Raw ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variables ( desc . entity Declared Type Variables ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( desc . handler Context TypeName ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Field Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField Spec . builder ( desc . pipeline TypeName , Ġ" pipeline ", ĠModifier . PRIVATE , ĠModifier . FINAL ). build () ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . addField ( pipeline Field ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprev Context Field Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField Spec . builder ( desc . abstract HandlerContext TypeName , Ġ" prev ", ĠModifier . VOL AT ILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . addField ( prev Context Field ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Context Field Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField Spec . builder ( desc . abstract HandlerContext TypeName , Ġ" next ", ĠModifier . VOL AT ILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . addField ( next Context Field ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( Parameter Spec . builder ( desc . pipeline TypeName , Ġ" pipeline "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pipeline Ġ= Ġpipeline ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . add Method ( constructor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoperation Methods Ġ= Ġgen Pipeline Override Methods Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( TypeName . get ( it . returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . VOID Ġ-> Ġ""" handler (). ${ it . methodName } (${ it . params . expand ()}, Ġnext ); """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ""" return Ġhandler (). ${ it . methodName } (${ it . params . expand ()}, Ġnext ); """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . add Methods ( operation Methods ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhandler Method Ġ= ĠMethod Spec . method Builder (" handler ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PROTECT ED , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( desc . handler TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . add Method ( handler Method ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Method Ġ= ĠMethod Spec . method Builder (" pipeline ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( desc . pipeline TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" return Ġpipeline ; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġabstract Context Class Builder . add Method ( pipeline Method ) ĊĊĠĠĠĠĠĠĠ Ġjava File Builder ( desc . abstract HandlerContext Raw ClassName . packageName (), Ġabstract Context Class Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( filer ) ĊĠĠĠ Ġ} Ċ } Ċ