/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠM oh amed ĠAl aa Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġm oh amed al aa . ma utils . sample . module _ gson _ processor . root Ċ Ċ import Ġm oh amed al aa . ma utils . core _ kotlin . extensions . add If NotNull Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . lang . reflect . Type Ċ import Ġkotlin . reflect . full . declared Member Properties Ċ import Ġkotlin . reflect . jvm . java Type Ċ Ċ val ĠType . as Class OrNull : ĠClass < *> ? ĊĠĠĠ Ġget () Ġ= Ġrun Catch ing Ġ{ ĠClass . forName ( typeName ) Ġ}. get OrNull () Ċ Ċ val ĠType . as Class : ĠClass < *> ĊĠĠĠ Ġget () Ġ= Ġas Class OrNull Ġ?: Ġthrow ĠRuntimeException (" Cannot Ġget Ġclass Ġfrom Ġ$ this ") Ċ Ċ val ĠString ?. as Class OrNull : ĠClass < *> ? ĊĠĠĠ Ġget () Ġ= Ġrun Catch ing Ġ{ ĠClass . forName ( this Ġ?: Ġ" error ") Ġ}. get OrNull () Ċ Ċ /** ĠAdds Ġall Ġclasses Ġin Ġtype Ġparams Ġeven Ġnested Ġones , ĠEx . ĠPair < Game < Some Thing >, ĠInt > Ġreturns Ġ[ Pair , ĠGame , ĠSome Thing , ĠInt ] Ġisa . Ġ*/ Ċ fun ĠClass <* >. all Type Param Classes And Nested ( exclude : ĠList < Class <* >> Ġ= Ġempty List (), Ġdistinct : ĠBoolean Ġ= Ġtrue ): ĠList < Class <* >> Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Class <* >>() ĊĊĠĠĠ Ġtype Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġit . bounds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġtype . all Type Param Classes ( true , Ġdistinct ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlist . removeAll ( exclude ) ĊĠĠĠ Ġreturn Ġif Ġ( distinct ) Ġlist . distinct () Ġelse Ġlist Ċ } Ċ Ċ private Ġfun ĠType . all Type Param Classes ( include Self : ĠBoolean , Ġdistinct : ĠBoolean Ġ= Ġtrue ): ĠList < Class <* >> Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Class <* >>() ĊĊĠĠĠ Ġif Ġ( this Ġis ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist Ġ+= Ġthis . all Type Param Classes ( true , Ġdistinct ) ĊĠĠĠ Ġ} else Ġif Ġ( include Self ){ ĊĠĠĠĠĠĠĠ Ġlist . add If NotNull ( this . as Class OrNull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġif Ġ( distinct ) Ġlist . distinct () Ġelse Ġlist Ċ } Ċ Ċ private Ġfun ĠParameter ized Type . all Type Param Classes ( include Self : ĠBoolean , Ġdistinct : ĠBoolean Ġ= Ġtrue ): ĠList < Class <* >> Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Class <* >>() ĊĊĠĠĠ Ġif Ġ( include Self ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . add If NotNull ( typeName . take While Ġ{ Ġit Ġ!= Ġ'< ' Ġ}. as Class OrNull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Type Arguments . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġit . all Type Param Classes ( true , Ġdistinct ) ĊĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add If NotNull ( it . as Class OrNull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġif Ġ( distinct ) Ġlist . distinct () Ġelse Ġlist Ċ } Ċ Ċ fun ĠClass <* >. all Declared Props With All Type Param And Nested ( ĊĠĠĠ Ġexclude : ĠList < Class <* >> Ġ= Ġempty List (), ĊĠĠĠ Ġdistinct : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġcheck Type Params : ĠBoolean , ĊĠĠĠ Ġcheck Nested : ĠBoolean Ċ ): ĠList < Class <* >> Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Class <* >>() ĊĊĠĠĠ Ġkotlin . declared Member Properties . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġlist Ġ+= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Type Params Ġ&& Ġcheck Nested Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp List 1 Ġ= Ġit . returnType . java Type . all Type Param Classes ( true , Ġdistinct ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp List 2 Ġ= Ġmutable ListOf < Class <* >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp List 1 . forEach Ġ{ Ġinner It Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp List 2 Ġ+= Ġinner It . all Declared Props With All Type Param And Nested ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude , Ġdistinct , Ġcheck Type Params , Ġcheck Nested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp List 1 Ġ+ Ġtemp List 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Type Params Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . returnType . java Type . all Type Param Classes ( true , Ġdistinct ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Nested Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Class Ġ= Ġit . returnType . java Type . ignore Parameterized Type OrNull ()?. as Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( j Class ) Ġ+ Ġj Class . all Declared Props With All Type Param And Nested ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude , Ġdistinct , Ġcheck Type Params , Ġcheck Nested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Class Ġ= Ġit . returnType . java Type . ignore Parameterized Type OrNull ()?. as Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Class Ġ== Ġnull ) Ġempty List () Ġelse ĠlistOf ( j Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlist . removeAll ( exclude ) ĊĠĠĠ Ġreturn Ġif Ġ( distinct ) Ġlist . distinct () Ġelse Ġlist Ċ } Ċ Ċ private Ġfun ĠType . ignore Parameterized Type OrNull () ĊĠĠĠ Ġ= Ġif Ġ( this Ġis ĠParameter ized Type ) ĠtypeName . take While Ġ{ Ġit Ġ!= Ġ'< ' Ġ}. as Class OrNull Ġelse Ġthis . as Class OrNull Ċ Ċ fun ĠList < Class <* >> . all Declared Props With All Type Param And Nested ( ĊĠĠĠ Ġexclude : ĠList < Class <* >> Ġ= Ġempty List (), ĊĠĠĠ Ġdistinct : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġcheck Type Params : ĠBoolean , ĊĠĠĠ Ġcheck Nested : ĠBoolean Ċ ): ĠList < Class <* >> Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Class <* >>() ĊĊĠĠĠ ĠforEach Ġ{ ĊĠĠĠĠĠĠĠ Ġlist Ġ+= Ġit . all Declared Props With All Type Param And Nested ( exclude , Ġdistinct , Ġcheck Type Params , Ġcheck Nested ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlist . removeAll ( exclude ) ĊĠĠĠ Ġreturn Ġif Ġ( distinct ) Ġlist . distinct () Ġelse Ġlist Ċ } Ċ