package Ġio . github . pak 3 nu h . util . lang . enum _ expression . processor Ċ Ċ 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 . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġcom . squareup . jav ap o et . Type Variable Name Ċ import Ġio . github . pak 3 nu h . util . processor . Expression Builder Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Supplier Ċ import Ġjavax . annotation . processing . F iler Ċ import Ġjavax . lang . model . element . Modifier Ċ Ċ class ĠExpression Writer ( private Ġval Ġf iler : ĠF iler ) Ġ{ ĊĠĠĠ Ġfun Ġwrite ( enum Data : ĠEnum Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpr Interface Name : ĠClass Name Ġ= ĠClass Name . best Guess ("${ enum Data . pkg }.${ enum Data . expression Name }") ĊĠĠĠĠĠĠĠ Ġval Ġvariable Name : ĠType Variable Name Ġ= ĠType Variable Name . get (" T ") ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠType Spec . interface Builder ( expr Interface Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variable ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Methods ( to Interface Methods ( enum Data , Ġvariable Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( evaluator Method ( enum Data , Ġexpr Interface Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( lambda Ex haustive ( enum Data )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( enum Data . default Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Type ( default Interface ( enum Data , Ġvariable Name , Ġexpr Interface Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( enum Data . expression Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Builder Ġ= Ġget Expression Builder ( enum Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Types ( expression Builder . build Interfaces ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Type ( expression Builder . build Builder ( expr Interface Name , Ġ" eval Lambda ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠJava File . builder ( enum Data . pkg , Ġbuilder . build ()). build () ĊĠĠĠĠĠĠĠ Ġfile . writeTo ( filer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Expression Builder ( enum Data : ĠEnum Data ): ĠExpression Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠExpression Builder ( enum Data . enum Type , Ġenum Data . pkg ) ĊĠĠĠĠĠĠĠ Ġval Ġinput Type Ġ= ĠParameter ized TypeName . get ( ClassName . get ( Supplier :: class . java ), ĠType Variable Name . get (" T ")) ĊĠĠĠĠĠĠĠ Ġenum Data . symbols . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Branch (" on $ it ", Ġinput Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault Interface ( enum Data : ĠEnum Data , Ġvariable Name : ĠType Variable Name , Ġexpr Interface Name : ĠClass Name ): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠType Spec . interface Builder (" WithDefault ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( Parameterized TypeName . get ( expr Interface Name , Ġvariable Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variable ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder (" defaultValue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( variable Name ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Methods ( to Default Interface Methods ( enum Data , Ġvariable Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluator Method ( enum Data : ĠEnum Data , Ġexpr Interface Name : ĠClass Name ): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvariable Name Ġ= ĠType Variable Name . get (" W ") ĊĠĠĠĠĠĠĠ Ġval Ġexpression Type Ġ= ĠParameter ized TypeName . get ( expr Interface Name , Ġvariable Name ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder (" eval ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variable ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( enum Data . enum Type , Ġ" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( Parameter Spec . builder ( expression Type , Ġ" delegate "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( evaluator Code ( enum Data . symbols ){ Ġ" delegate .$ it ()" Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluator Code ( symbols : ĠSet < String >, Ġsymbol Fn : Ġ( String ) Ġ-> ĠString ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobjects ClassName Ġ= ĠClass Name . get ( Objects :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow (" switch (\ $ T . requireNonNull ( value )) ", Ġobjects ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" case Ġ$ it : Ġreturn Ġ${ symbol Fn ( it )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" default : Ġthrow Ġnew ĠIllegalStateException ( String . valueOf ( value )) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Interface Methods ( enum Data : ĠEnum Data , Ġvariable Name : ĠType Variable Name ): ĠIterable < Method Spec > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenum Data . symbols . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Default Interface Methods ( enum Data : ĠEnum Data , Ġvariable Name : ĠType Variable Name ): ĠIterable < Method Spec > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenum Data . symbols . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" return ĠdefaultValue (); ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlambda Ex haustive ( enum Data : ĠEnum Data ): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvariable Name Ġ= ĠType Variable Name . get (" W ") ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . method Builder (" eval Lambda ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variable ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( to Parameters ( enum Data . symbols , Ġvariable Name , Ġenum Data . enum Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( evaluator Code ( enum Data . symbols ){ Ġ"$ it . get ()" Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( variable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Parameters ( symbols : ĠSet < String >, Ġvariable Name : ĠType Variable Name , Ġenum Type : ĠClass Name ): ĠIterable < Parameter Spec > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsupplier Type Ġ= ĠParameter ized TypeName . get ( ClassName . get ( Supplier :: class . java ), Ġvariable Name ) ĊĠĠĠĠĠĠĠ Ġval Ġenum Parameter Ġ= ĠParameter Spec . builder ( enum Type , Ġ" value "). build () ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( enum Parameter ) Ġ+ Ġsymbols . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( supplier Type , Ġit ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ