package Ġcom . ju ul . pom mel . compiler . generator Ċ Ċ import Ġcom . ju ul . pom mel . compiler . P om mel Module Ċ import Ġcom . ju ul . pom mel . compiler . P om mel Processor Ċ import Ġcom . ju ul . pom mel . compiler . extensions . error Ċ import Ġcom . ju ul . pom mel . compiler . extensions . has Annotation Ċ import Ġcom . ju ul . pom mel . compiler . extensions . join To Code Ċ import Ġcom . ju ul . pom mel . compiler . extensions . qualified Type Ċ import Ġcom . ju ul . pom mel . compiler . extensions . raw ClassName Ċ import Ġcom . ju ul . pom mel . compiler . extensions . solo ModuleName Ċ import Ġcom . ju ul . pom mel . compiler . extensions . to ClassName Ċ import Ġcom . ju ul . pom mel . compiler . extensions . to Solo Module Params Ċ import Ġcom . ju ul . pom mel . compiler . extensions . to TypeName Ċ import Ġcom . ju ul . pom mel . compiler . utils . IN JECT _ AN NOT ATION Ċ import Ġcom . ju ul . pom mel . compiler . utils . apply Each Ċ import Ġcom . ju ul . pom mel . compiler . utils . bind s Ċ import Ġcom . ju ul . pom mel . compiler . utils . cast Each Ċ import Ġcom . ju ul . pom mel . compiler . utils . generated Ċ import Ġcom . ju ul . pom mel . compiler . utils . install In Ċ import Ġcom . ju ul . pom mel . compiler . utils . module Ċ import Ġcom . ju ul . pom mel . compiler . utils . provides Ċ import Ġcom . squareup . jav ap o et . Annotation Spec Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġjavax . annotation . processing . Mess ager Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Type Element Ċ Ċ internal Ġclass ĠClass Solo Module Generator Ġ: ĠSo lo Module Generator Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġis Generator For ( element : ĠElement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . kind Ġ== ĠElement Kind . CLASS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( pom mel Module : ĠP om mel Module , Ġelement : ĠElement ): ĠJava File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Type Ġ= Ġpom mel Module . module Type . to ClassName (). solo ModuleName () ĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠType Spec . class Builder ( generated Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( generated ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member (" value ", Ġ"\ $ S ", ĠP om mel Processor :: class . qualified Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member (" comments ", Ġ"\ $ S ", Ġ" https :// github . com / Ju ul Labs / pom mel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( install In ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member (" value ", Ġ"\ $ T .\ $ L ", Ġpom mel Module . component , Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġvalue Ġof ĠreturnType Ġis Ġequal Ġto Ġthe Ġtarget Ġclass Ġannotated Ġwith Ġ@ Solo Module ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġwe Ġgenerate Ġa Ġprovides Ġmethod Ġotherwise Ġthe Ġvalue Ġof Ġthe Ġtarget Ġclass Ġis Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġimplementation Ġof ĠreturnType Ġand Ġwe Ġgenerate Ġa Ġbind s Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pom mel Module . target Type Ġ== Ġpom mel Module . returnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Provides Method ( pom mel Module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bind s Method ( pom mel Module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJava File . builder ( generated Type . packageName (), Ġspec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate ( element : ĠElement , Ġmess ager : ĠMess ager ): ĠP om mel Module ? Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( element Ġis ĠType Element ) ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Modifier . PUBLIC Ġ! in Ġelement . modifiers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . error (" Types Ġmarked Ġwith Ġ@ Solo Module Ġmust Ġbe Ġpublic ", Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( element . enc lo sing Element . kind Ġ== ĠElement Kind . CLASS Ġ&& ĠModifier . STATIC Ġ! in Ġelement . modifiers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . error (" Nested Ġtypes Ġmarked Ġwith Ġ@ Solo Module Ġmust Ġbe Ġstatic ", Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġelement . enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠElement Kind . CON STRUCTOR Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Annotation ( IN JECT _ AN NOT ATION ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast Each < Executable Element >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( construct ors . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . error (" Multiple Ġconstructors Ġmarked Ġwith Ġ@ Inject Ġannotated Ġfound .", Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! valid ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġconstructors . single () ĊĠĠĠĠĠĠĠ Ġif Ġ( Modifier . PRIVATE Ġin Ġconstructor . modifiers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . error ("@ Inject Ġconstructor Ġmust Ġnot Ġbe Ġprivate .", Ġconstructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsolo Module Params Ġ= Ġelement . to Solo Module Params () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! valid ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠP om mel Module ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Type Ġ= Ġelement , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Type Ġ= Ġelement . as Type (). to TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġsolo Module Params . scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqualifier Ġ= Ġsolo Module Params . qual ifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Ġ= Ġsolo Module Params . component , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġconstructor . parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġsolo Module Params . binding Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Provides Method ( pom mel Module : ĠP om mel Module ): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder ( pom mel Module . target Type . raw ClassName (). provide FunctionName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( provides ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġif Ġ( pom mel Module . scope Ġ!= Ġnull ) Ġadd Annotation ( pom mel Module . scope ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġif Ġ( pom mel Module . qual ifier Ġ!= Ġnull ) Ġadd Annotation ( pom mel Module . qual ifier ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( pom mel Module . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Each ( pom mel Module . parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( it . qualified Type , Ġit . simple Name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġnew Ġ\$ T (\ n \$ L )", Ġpom mel Module . target Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpom mel Module . parameters . map Ġ{ ĠCode Block . of ("\ $ N ", Ġit . simple Name ) Ġ}. join To Code (", \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Bind s Method ( pom mel Module : ĠP om mel Module ): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder ( pom mel Module . target Type . raw ClassName (). bind s FunctionName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( bind s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġif Ġ( pom mel Module . scope Ġ!= Ġnull ) Ġadd Annotation ( pom mel Module . scope ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġif Ġ( pom mel Module . qual ifier Ġ!= Ġnull ) Ġadd Annotation ( pom mel Module . qual ifier ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( pom mel Module . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpom mel Module . target Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpom mel Module . target Type . raw ClassName (). simple Name (). de capitalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass Name . provide FunctionName () Ġ= Ġ" provides _" Ġ+ Ġreflection Name (). replace ('.', Ġ'_ ') ĊĊĠĠĠ Ġprivate Ġfun ĠClass Name . bind s FunctionName () Ġ= Ġ" bind s _" Ġ+ Ġreflection Name (). replace ('.', Ġ'_ ') Ċ } Ċ