package Ġeu . source way . j 2 ts . handler Ċ Ċ import Ġeu . source way . j 2 ts . Type Mappings Ċ import Ġeu . source way . j 2 ts . annotations . J 2 Ts Property Ċ import Ġeu . source way . j 2 ts . annotations . J 2 Ts Type Ċ import Ġjavax . annotation . processing . Processing Environment Ċ 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 . Type Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Type Kind Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ class ĠJ 2 Ts Class Handler ( private Ġval Ġtype El : ĠType Element , Ġprivate Ġval Ġprocessing Env : ĠProcessing Environment ) Ġ: ĠAbstract Type Handler ( type El , Ġprocessing Env ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcollection Types Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . util . List ", Ġ" java . util . List < E >", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . util . Set ", Ġ" java . util . Set < E >", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . util . Map ", Ġ" java . util . Map < K , V >" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġparse Fields (): ĠList < Field Meta > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocessing Env . element Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAll Members ( type El ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( this :: should Generate Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Executable Element :: class . java :: cast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . simple Name . toString (). startsWith (" get ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . simple Name . toString (). startsWith (" is ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ ĠType Kind . VOID Ġ== Ġit . returnType . kind Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( this :: build Field Meta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . ignore Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠField Meta ( val Ġname : ĠString , Ġval Ġtype : ĠString , Ġval Ġoptional : ĠBoolean , Ġval Ġignore : ĠBoolean , Ġval Ġimport : ĠString ) ĊĊĠĠĠ Ġprivate Ġfun Ġshould Generate Method ( element : ĠElement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . METHOD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġelement . enc lo sing Element Ġas ĠType Element ĊĠĠĠĠĠĠĠ Ġval Ġqualified Name Ġ= Ġtype Element . qualified Name . toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġqualified Name Ġ!= ĠAny :: class . java . canonical Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Code (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġparse Fields () ĊĊĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġfields . map Ġ{ Ġit . import Ġ}. distinct (). join ToString ("\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġfields Src Ġ= Ġfields . join ToString ("\ n ") Ġ{ Ġ" ĠĠĠ Ġ${ it . name }${ if Ġ( it . optional ) Ġ" ?" Ġelse Ġ"" }: Ġ${ it . type }; " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ""" Ċ $ imports Ċ /** Ċ Ġ* ĠGenerated Ġfrom Ġ${ type El . qualified Name } Ċ Ġ*/ Ċ export Ġinterface Ġ$ target Name Ġ{ Ċ $ fields Src Ċ } Ċ Ċ """. trim Indent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Field Meta ( el : ĠExec utable Element ): ĠField Meta Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Annotation : ĠJ 2 Ts Property ? Ġ= Ġel . getAnnotation ( J 2 Ts Property :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġval Ġignore Ġ= Ġmethod Annotation ?. ignore Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġoptional Ġ= Ġmethod Annotation ?. optional Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġel . simple Name . toString (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith (" is ") Ġ-> Ġit . substring ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith (" get ") Ġ-> Ġit . substring ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException ("$ el Ġis Ġnot Ġa Ġvalid Ġgetter ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. de capitalize () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( property Type , Ġimport ) Ġ= Ġdetermine PropertyType ( el . returnType , Ġmethod Annotation ) ĊĠĠĠĠĠĠĠ Ġreturn ĠField Meta ( propertyName , Ġproperty Type , Ġoptional , Ġignore , Ġimport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine PropertyType ( type Mirror : ĠType Mirror , Ġmethod Annotation : ĠJ 2 Ts Property ? Ġ= Ġnull ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġproperty Type Ġ= Ġmethod Annotation ?. type ĊĠĠĠĠĠĠĠ Ġvar Ġimport Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( property Type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( is Collection Type , Ġtype Arguments ) Ġ= Ġis Collection Type ( type Mirror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Collection Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . size Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( array Type , Ġarray Import ) Ġ= Ġdetermine PropertyType ( type Arguments [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type Ġ= Ġ"$ array Type []" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġ= Ġarray Import ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . size Ġ== Ġ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( key Type , Ġkey Import ) Ġ= Ġdetermine PropertyType ( type Arguments [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( valueType , Ġvalue Import ) Ġ= Ġdetermine PropertyType ( type Arguments [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type Ġ= Ġ"{ Ġ[ key : Ġ$ key Type ]: Ġ$ valueType ; Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġ= Ġkey Import Ġ+ Ġ"\ n " Ġ+ Ġvalue Import ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" expected Ġto Ġhave Ġ 1 Ġor Ġ 2 Ġtype Arguments , Ġgot Ġ${ type Arguments . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( property Type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Element Ġ= Ġtype Mirror . as Type Element () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġreturn Element ?. getAnnotation ( J 2 Ts Type :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type Ġ= Ġannotation ?. name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotation Ġ!= Ġnull Ġ&& Ġtype El . packageName Ġ!= Ġreturn Element . packageName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstring After Last Ġ= Ġif Ġ( property Type . isNull Or Blank ()) Ġreturn Element . simple Name Ġelse Ġproperty Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġ= Ġ" import Ġ{$ substring After Last } Ġfrom Ġ'./ ${ return Element . packageName }'; " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( property Type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type Ġ= ĠType Mappings [ type Mirror ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( property Type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type Ġ= Ġtype Mirror . toString (). substring After Last (".") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( property Type , Ġimport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Collection Type ( returnType : ĠType Mirror ): ĠPair < Boolean , ĠList < Type Mirror >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreturn Element Ġ= ĠreturnType . as Type Element () Ġ?: Ġreturn ĠPair ( false , Ġempty List ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ("$ return Element " Ġin Ġcollection Types Ġ|| Ġreturn Element . interfaces . any Ġ{ Ġ"$ it " Ġin Ġcollection Types Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠreturnType Ġis ĠDecl ared Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( true , ĠreturnType . type Arguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( false , Ġempty List ()) ĊĠĠĠ Ġ} Ċ } Ċ