package Ġcom . step an ov . bbf . body generator Ċ Ċ import Ġcom . step an ov . bbf . body generator . Config . Collection Types Ċ import Ġcom . step an ov . bbf . body generator . Config . Power Of User Defined Types Ċ import Ġcom . step an ov . bbf . body generator . Config . Primitive Types Ċ import Ġcom . step an ov . bbf . body generator . Utils . Project Tools . ctx Ċ import Ġcom . step an ov . bbf . body generator . Utils . Project Tools . kt File Ċ import Ġcom . step an ov . bbf . body generator . Utils . Project Tools . rig Ċ import Ġcom . step an ov . bbf . body generator . Utils . generate User Defined Type Path Ċ import Ġcom . step an ov . bbf . body generator . Utils . isNot Enum Ċ import Ġcom . step an ov . bbf . body generator . Utils . random Content Ċ import Ġcom . step an ov . bbf . body generator . Utils . with Random Param Types Ċ import Ġcom . step an ov . bbf . bug finder . util . getAll P SI Children OfType Ċ import Ġcom . step an ov . bbf . bug finder . util . getFirst Parent OfType Ċ import Ġcom . step an ov . bbf . bug finder . util . has Type Param Ċ import Ġcom . step an ov . bbf . bug finder . util . name Ċ import Ġorg . jetbrains . kotlin . cfg . get Declaration Descriptor In cluding Construct ors Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Abstract Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parent sWith Self Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Primitive Number Type Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ class ĠUser Defined Type Ċ Ċ object ĠType Table Ġ{ ĊĠĠĠ Ġval Ġprimitive Types Translator Ġ= ĠPrimitive Types . keys ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit . simple Name !! Ġto Ġgenerate Type ( it . simple Name !! ) Ġ} ĊĊĠĠĠ Ġval Ġnumeric Types Ġ= ĠPrimitive Types . filter Ġ{ Ġprimitive Types Translator [ it . key . simple Name ] !!. is Primitive Number Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . key . simple Name Ġ!= Ġ" Char " Ġ} ĊĊĠĠĠ Ġval Ġarithmetic Types Ġ= ĠPrimitive Types . filter Ġ{ Ġset Of ( Int :: class , ĠLong :: class , ĠFloat :: class , ĠDouble :: class ). contains ( it . key ) Ġ} ĊĊĠĠĠ Ġval Ġuser Defined Types Ġ= Ġkt File ĊĠĠĠĠĠĠĠ Ġ. getAll P SI Children OfType < Kt Class >() ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġklass Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġklass . getFirst Parent OfType < Kt Class >() ?. isNot Enum () Ġ?: Ġtrue Ġ&& Ġklass . parent sWith Self . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Class >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . is Abstract () Ġ|| Ġit . is Interface () Ġ} Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit Ġto Ġ( it . get Declaration Descriptor In cluding Construct ors ( ctx ) Ġas ĠClass Descriptor ). default Type Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rig . class Instance Generator . generate Random InstanceOf User Class ( it . value ) Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ filter Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( i -- Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ filter Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcollection Types Translator Ġ= Ġmutable Map Of < String , ĠKotlin Type >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( user Defined Types . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPower Of User Defined Types Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetRandom Type (): ĠKotlin Type Ġ= ĊĠĠĠĠĠĠĠ Ġ( Primitive Types Ġ+ ĠCollection Types Ġ+ Ġ( User Defined Type :: class Ġto ĠPower Of User Defined Types )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. random Content (). let Ġ{ Ġklass Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass Ġ== ĠUser Defined Type :: class Ġ-> Ġuser Defined Types . values . random (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . has Type Param ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Type ( generate User Defined Type Path ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . type Parameters . isNotEmpty () Ġ-> Ġgenerate Collection Type From Class ( klass ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprimitive Types Translator [ klass . simple Name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetRandom Primitive Or Collection Type (): ĠKotlin Type Ġ= ĊĠĠĠĠĠĠĠ Ġ( Primitive Types Ġ+ ĠCollection Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. random Content (). let Ġ{ Ġklass Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . type Parameters . isNotEmpty () Ġ-> Ġgenerate Collection Type From Class ( klass ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprimitive Types Translator [ klass . simple Name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠKotlin Type . getRandom Numeric Before Type (): ĠKotlin Type Ġ= ĊĠĠĠĠĠĠĠ Ġnumeric Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġpair Ġ-> Ġpair . key Ġin Ġnumeric Types . keys . toList (). drop Last While Ġ{ Ġit . simple Name Ġ!= Ġthis . name Ġ}. drop Last ( 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. random Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive Types Translator [ it . simple Name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠKotlin Type . getRandom Numeric Before Or Collection Type (): ĠKotlin Type Ġ= ĊĠĠĠĠĠĠĠ Ġ( numeric Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġpair Ġ-> Ġpair . key Ġin Ġnumeric Types . keys . toList (). drop Last While Ġ{ Ġit . simple Name Ġ!= Ġthis . name Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠCollection Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. random Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġklass Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( klass . type Parameters . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Collection Type From Class ( klass ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive Types Translator [ klass . simple Name !! ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetRandom Primitive Type (): ĠKotlin Type Ġ= Ġprimitive Types Translator [ Primitive Types . random Content (). simple Name ] !! ĊĊĠĠĠ Ġfun ĠgetRandom Simple Type (): ĠKotlin Type Ġ= ĊĠĠĠĠĠĠĠ Ġ( Primitive Types Ġ+ Ġ( User Defined Type :: class Ġto ĠPower Of User Defined Types )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. random Content (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠUser Defined Type :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Defined Types . values . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive Types Translator [ it . simple Name ] !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Collection Type From Class ( klass : ĠK Class < *> ): ĠKotlin Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġklass . with Random Param Types () ĊĠĠĠĠĠĠĠ Ġif Ġ( collection Types Translator . containsKey ( type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcollection Types Translator [ type ] !! ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Type ( type ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Types Translator [ type ]= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Type ( type : ĠString ): ĠKotlin Type Ġ= Ġrig . random Type Generator . generate Type ( type ) !! Ċ }