package Ġutils Ċ Ċ import Ġspo on . reflect . code .* Ċ import Ġspo on . reflect . declaration . Ct Element Ċ import Ġspo on . reflect . declaration . Ct Field Ċ import Ġspo on . reflect . declaration . Modifier Kind Ċ import Ġspo on . support . reflect . code . Ct Variable Read Impl Ċ import Ġjava . lang . Number FormatException Ċ Ċ val Ġdefault Values Ġ= Ġmap Of ( Pair (" boolean ", Ġfalse ), ĊĠĠĠĠĠĠĠ ĠPair (" int ", Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠPair (" byte ", Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠPair (" short ", Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠPair (" long ", Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠPair (" float ", Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠ ĠPair (" double ", Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠ ĠPair (" char ", Ġ'\ u 0 0 0 0 ')) Ċ Ċ fun Ġretrieve Value ( elem : ĠC t Element ): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġelem Type Ġ= Ġretrieve Type ( elem ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġelem String Ġ= Ġelem . toString (). replace (" (", Ġ""). replace (" )", Ġ"") ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( elem Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" int " Ġ-> Ġelem String . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" byte " Ġ-> Ġelem String . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" short " Ġ-> Ġelem String . to Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" long " Ġ-> Ġelem String . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> Ġelem String . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġelem String . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" boolean " Ġ-> Ġelem String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġelem . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( n fe : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// println (" invalid Ġnumber Ġformat : Ġ$ elem String ") ĊĠĠĠĠĠĠĠ Ġelem String ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġretrieve Type ( elem : ĠC t Element ): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( elem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠC t Literal < *> Ġ-> Ġelem . type ?. simple Name ĊĠĠĠĠĠĠĠ Ġis ĠC t Unary Operator < *> Ġ-> Ġelem . type ?. simple Name ĊĠĠĠĠĠĠĠ Ġis ĠC t Binary Operator < *> Ġ-> Ġelem . type ?. simple Name ĊĠĠĠĠĠĠĠ Ġis ĠC t Variable Read < *> Ġ-> Ġelem . variable . type ?. simple Name ĊĠĠĠĠĠĠĠ Ġis ĠC t Invocation < *> Ġ-> Ġelem . executable . type ?. simple Name ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Relational ( kind : ĠBinary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind . name Ġ== Ġ" EQ " Ġ|| Ġkind . name Ġ== Ġ" NE " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġkind . name Ġ== Ġ" LT " Ġ|| Ġkind . name Ġ== Ġ" GT " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġkind . name Ġ== Ġ" LE " Ġ|| Ġkind . name Ġ== Ġ" GE " Ċ } Ċ Ċ fun Ġis Arithmetic ( kind : ĠBinary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind . name Ġ== Ġ" PLUS " Ġ|| Ġkind . name Ġ== Ġ" MINUS " Ġ|| Ġkind . name Ġ== Ġ" MUL " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġkind . name Ġ== Ġ" DIV " Ġ|| Ġkind . name Ġ== Ġ" MOD " Ċ } Ċ Ċ fun Ġis Conditional ( kind : ĠBinary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind . name Ġ== Ġ" OR " Ġ|| Ġkind . name Ġ== Ġ" AND " Ċ } Ċ Ċ fun Ġis Bit shift ( kind : ĠBinary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind . name Ġ== Ġ" SL " Ġ|| Ġkind . name Ġ== Ġ" SR " Ġ|| Ġkind . name Ġ== Ġ" USR " Ċ } Ċ Ċ fun Ġis Bit wise ( kind : ĠBinary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind . name Ġ== Ġ" BIT OR " Ġ|| Ġkind . name Ġ== Ġ" BIT XOR " Ġ|| Ġkind . name Ġ== Ġ" BIT AND " Ċ } Ċ Ċ fun Ġis TypeString ( elem : ĠC t Expression < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġelem . type ?. simple Name Ġ== Ġ" String " Ċ } Ċ Ċ fun Ġis DefaultValue ( ins Src : ĠC t Literal < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġins Src Parent Ġ= Ġins Src . parent ĊĠĠĠ Ġreturn Ġ( ins Src Parent Ġis ĠC t Assignment < *, *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġins Src . value Ġ== Ġdefault Values [ ins Src Parent . getType ()?. toString ()]) Ċ } Ċ Ċ fun Ġis Accessor ( kind : ĠModifier Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind Ġ== ĠModifier Kind . PRIVATE Ġ|| Ġkind Ġ== ĠModifier Kind . PROTECT ED Ġ|| Ġkind Ġ== ĠModifier Kind . PUBLIC Ċ } Ċ Ċ fun Ġhas One Accessor ( elem : ĠC t Field < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġelem . modifiers . size Ġ== Ġ 1 Ġ&& Ġis Accessor ( elem . modifiers . first ()) Ċ } Ċ Ċ fun Ġhas One Static ( elem : ĠC t Field < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġelem . modifiers . size Ġ== Ġ 1 Ġ&& Ġelem . modifiers . first () Ġ== ĠModifier Kind . STATIC Ċ } Ċ Ċ fun Ġare Opp osite ( kind 1 : ĠUnary Operator Kind , Ġkind 2 : ĠUnary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ( kind 1 Ġ== ĠUnary Operator Kind . POST DEC Ġ&& Ġkind 2 Ġ== ĠUnary Operator Kind . POST INC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( kind 1 Ġ== ĠUnary Operator Kind . POST INC Ġ&& Ġkind 2 Ġ== ĠUnary Operator Kind . POST DEC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( kind 1 Ġ== ĠUnary Operator Kind . PRE DEC Ġ&& Ġkind 2 Ġ== ĠUnary Operator Kind . PRE INC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( kind 1 Ġ== ĠUnary Operator Kind . PRE INC Ġ&& Ġkind 2 Ġ== ĠUnary Operator Kind . PRE DEC ) Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Plus Or Minus ( kind : ĠUnary Operator Kind ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkind Ġ== ĠUnary Operator Kind . NEG Ġ|| Ġkind Ġ== ĠUnary Operator Kind . POS Ċ } Ċ Ċ fun Ġis Signed Constant ( unary Op : ĠC t Unary Operator < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Plus Or Minus ( unary Op . kind ) Ġ&& Ġunary Op . operand Ġis ĠC t Literal < *> Ċ } Ċ Ċ fun Ġis Part Of ( node : ĠC t Element , Ġcontainer : ĠC t Expression < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( node Ġ=== Ġcontainer ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif Ġ( container Ġis ĠC t Binary Operator < *> ){ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Part Of ( node , Ġcontainer . left Hand Operand ) Ġ|| Ġis Part Of ( node , Ġcontainer . right Hand Operand ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġreturn Ġfalse Ċ } Ċ Ċ fun Ġnull Literal ( expr : ĠC t Expression < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġexpr . toString () Ġ== Ġ" null " Ċ } Ċ Ċ fun Ġ< T > Ġsimple Expr ( expr : ĠC t Expression < T >): ĠC t Expression < T > Ġ{ ĊĠĠĠ Ġreturn Ġwhen ( expr ){ ĊĠĠĠĠĠĠĠ Ġis ĠC t Variable Read < T > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Expr Ġ= Ġexpr . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Expr . setType Cast s < Ct Expression < T >>( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Expr . set Variable < Ct Variable Access < T >>( expr . variable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Expr ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpr . clone () ĊĠĠĠ Ġ} Ċ } Ċ