package Ġcom . ch imer apps . mos h ig ener ator Ċ Ċ import Ġcom . squareup . jav ap o et .* Ċ import Ġcom . squareup . jav ap o et . Wildcard TypeName Ċ import Ġcom . squareup . mos hi . Json Adapter Ċ import Ġjava . lang . reflect . Type Ċ import Ġjavax . annotation . processing . F iler Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . util . Elements ĊĊ Ċ /** Ċ Ġ* Ġ@ author ĠN ic ola ĠVer bee ck Ċ Ġ* Ġ@ date Ġ 2 6 / 0 5 / 2 0 1 7 . Ċ Ġ*/ Ċ class ĠM oshi Factory Generator ( val ĠclassName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapters : ĠList < TypeName >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf iler : ĠF iler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Utils : ĠElements ) Ġ{ ĊĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactory Class Builder Ġ= ĠType Spec . class Builder ( className ) ĊĠĠĠĠĠĠĠ Ġfactory Class Builder . add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠ Ġfactory Class Builder . add Super interface ( Json Adapter . Factory :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġfactory Class Builder . addField ( Field Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( Map :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( Type :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( Base Generated Adapter :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ildcard TypeName . subtype Of ( Any :: class . java ))), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ adapters ", ĠModifier . FINAL , ĠModifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĊĠĠĠĠĠĠĠ Ġfactory Class Builder . add Method ( generate Constructor ()) ĊĠĠĠĠĠĠĠ Ġfactory Class Builder . add Method ( generate Factory Method ()) ĊĊĠĠĠĠĠĠĠ Ġadapters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Class Builder . add Origin ating Element ( element Utils . getType Element ( it . toString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfactory Class Builder . add Javadoc (" Generated Ġusing Ġm oshi - generator ") ĊĊĠĠĠĠĠĠĠ ĠJava File . builder ( packageName , Ġfactory Class Builder . build ()). indent ("\ t "). build (). writeTo ( filer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Factory Method (): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder (" create ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Parameterized TypeName . get ( ClassName . get ( Json Adapter :: class . java ), ĠW ildcard TypeName . subtype Of ( Object :: class . java ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( Type :: class . java , Ġ" type ", ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( Parameterized TypeName . get ( ClassName . get ( Set :: class . java ), ĠW ildcard TypeName . subtype Of ( Annotation :: class . java )), Ġ" annotations ", ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( com . squareup . mos hi . M oshi :: class . java , Ġ" mos hi ", ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( create Factory Block ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Constructor (): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĊĠĠĠĠĠĠĠ Ġbuilder . add Statement ("_ adapters Ġ= Ġnew Ġ\$ T ()", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( HashMap :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( Type :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( Base Generated Adapter :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ildcard TypeName . subtype Of ( Any :: class . java )))) ĊĠĠĠĠĠĠĠ Ġadapters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Statement ("_ adapters . put (\ $ T . class , Ġnew Ġ\$ T ( this , Ġ\$ T . class )) ", Ġit , ĠClass Name . best Guess ( it . toString () Ġ+ Ġ" Adapter "), Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Factory Block (): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠCode Block . builder () ĊĊĠĠĠĠĠĠĠ Ġbuilder . add Statement ("\ $ T Ġadapter Ġ= Ġ_ adapters . get ( type )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( Base Generated Adapter :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ildcard TypeName . subtype Of ( Any :: class . java ))) ĊĊĠĠĠĠĠĠĠ Ġbuilder . begin Control Flow (" if Ġ( adapter Ġ!= Ġnull )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" adapter . set M oshi ( mos hi )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġadapter ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. next Control Flow (" else ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} Ċ Ċ } Ċ