package Ġcom . step an ov . bbf . bug finder . mut ator . transform ations . t ce Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . transform ations . Factory Ċ import Ġcom . step an ov . bbf . bug finder . util . type Generators . Random Type Generator Ċ import Ġcom . step an ov . bbf . bug finder . util . get True Ċ import Ġorg . apache . log 4 j . Logger Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Call Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . is Nullable Ċ import Ġjava . lang . StringBuilder Ċ import Ġkotlin . random . Random Ċ Ċ class ĠFill er Generator ( ĊĠĠĠ Ġprivate Ġval Ġpsi : ĠK t File , ĊĠĠĠ Ġprivate Ġval Ġctx : ĠBinding Context , ĊĠĠĠ Ġprivate Ġval Ġgenerated Usage s : ĠList < Triple < Kt Expression , ĠString , ĠKotlin Type ? >> Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġrandom Type Generator Ġ= ĠRandom Type Generator ĊĠĠĠ Ġprivate Ġval Ġblock ListOf Types Ġ= ĠlistOf (" Unit ", Ġ" Nothing ", Ġ" Nothing ?") ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . getLogger (" mut ator Logger ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrandom Type Generator . set File And Context ( psi , Ġctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Fill Expressions ( node : ĠPair < Kt Expression , ĠKotlin Type ? >, Ġdepth : ĠInt Ġ= Ġ 0 ): ĠList < Kt Expression > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" repl acing Ġ${ node . first . text } Ġ${ node . second }") ĊĠĠĠĠĠĠĠ Ġ// Nullable Ġor Ġmost Ġcommon Ġtypes ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Kt Expression >() ĊĠĠĠĠĠĠĠ Ġval Ġnode Type Ġ= Ġnode . second Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġlog . debug (" Getting Ġvalue Ġof Ġtype Ġ$ nodeType ") ĊĠĠĠĠĠĠĠ Ġval Ġstr NodeType Ġ= Ġnode Type . toString (). let Ġ{ Ġif Ġ( it . endsWith (" ? ")) Ġit . substring ( 0 , Ġit . length Ġ- Ġ 1 ) Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġis Nullable Ġ= Ġnode Type . is Nullable () ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= ĠRandom Instances Generator ( psi ). generate Value OfType ( nodeType ) ĊĠĠĠĠĠĠĠ Ġlog . debug (" GENERATED ĠVALUE ĠOF ĠTYPE Ġ$ nodeType Ġ= Ġ$ generated ") ĊĠĠĠĠĠĠĠ Ġif Ġ( generated . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFactory . psi Factory . create Expression If Possible ( generated )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" GENERATED ĠIS ĠCALL Ġ= ${ it Ġis ĠK t Call Expression }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Generate Ġinstance Ġof Ġrandom Ġtype Ġand Ġtry Ġto Ġget Ġneeded Ġtype Ġfrom Ġit ĊĠĠĠĠĠĠĠ Ġval Ġrandom Type Ġ= Ġrandom Type Generator . generate Random Type With Ctx () !! ĊĠĠĠĠĠĠĠ Ġlog . debug (" random Type Ġ= Ġ$ random Type ") ĊĠĠĠĠĠĠĠ Ġval Ġins Ġ= ĠRandom Instances Generator ( psi ). generate Value OfType ( random Type ) ĊĠĠĠĠĠĠĠ Ġval Ġvariants Ġ= ĠUsage Samples Generator With St Library . generate For Standard Type ( random Type , Ġstr NodeType ) ĊĠĠĠĠĠĠĠ Ġvariants . random OrNull ()?. let Ġ{ Ġvariant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( random Type . is Nullable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ ins )? ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" ($ ins )." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Seq Ġ= Ġhandle Call Seq ( variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpostfix Ġ= Ġif Ġ( variant . any Ġ{ Ġit . returnType ?. is Nullable () Ġ== Ġtrue Ġ} Ġ&& Ġ! is Nullable ) Ġ" !! " Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFactory . psi Factory . create Expression If Possible ("$ prefix ${ call Seq ?. text }$ postfix ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Generated Ġcall Ġfrom Ġrandom Ġtype Ġ= Ġ${ it . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Random . get True ( 2 0 )) Ġreturn ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Res Ġ= Ġmutable ListOf < Psi Element >() ĊĠĠĠĠĠĠĠ Ġval Ġchecked Types Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( el Ġin Ġgenerated Usage s . filter Ġ{ Ġit . first Ġ! is ĠK t Property Ġ}. sh uffled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el . third . toString () Ġin Ġblock ListOf Types ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel . third ?. toString () Ġ== Ġstr NodeType Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Res . add ( el . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel . third ?. toString () Ġ== Ġ"$ nodeType ?" Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Res . add ( el . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsage Samples Generator With St Library . is Implementation ( nodeType , Ġel . third ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Res . add ( el . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// common Types Map [ str NodeType ]?. contains ( el . third ?. toString ()) Ġ?: Ġfalse Ġ-> Ġlocal Res . add ( el . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Nullable Type Ġ= Ġif Ġ( str NodeType . last () Ġ== Ġ'? ') Ġstr NodeType . substring Before Last (' ?') Ġelse Ġstr NodeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notNullable Type Ġ!= Ġstr NodeType ) Ġres . add ( Factory . psi Factory . create Expression (" null ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ> Ġ 0 ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġdeeper Cases Ġ= ĠUsage Samples Generator With St Library . generate For Standard Type ( el . third !! , Ġnode Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" GET TING Ġ${ nodeType } Ġfrom Ġ${ el . third . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checked Types . contains ( el . third !!. toString ())) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecked Types . add ( el . third !!. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUsage Samples Generator With St Library . generate For Standard Type ( el . third !! , Ġstr NodeType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sh uffled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Case Ġ= Ġ${ list . map Ġ{ Ġit Ġ}} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Call Seq ( list )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( is Nullable ) Ġ" (${ el . second }) ? ." Ġelse Ġ" (${ el . second }). " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFactory . psi Factory . create Expression If Possible ("$ prefix ${ it . text }") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" GENERATED ĠCALL Ġ= Ġ${ it . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Res . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Res . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Res . forEach Ġ{ Ġres . add ( it Ġas ĠK t Expression ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Call Seq ( postfix : ĠList < Callable Descriptor >): ĠK t Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġprefix Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġpostfix . map Ġ{ Ġdesc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpr Ġ= Ġwhen Ġ( desc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProperty Descriptor Ġ-> Ġdesc . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction Descriptor Ġ-> Ġgenerate Call Expr ( desc )?. text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . append ( prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġif Ġ( desc . returnType ?. is Nullable () Ġ== Ġtrue ) Ġ"? ." Ġelse Ġ"." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . append ( expr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠFactory . psi Factory . create Expression ( res . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// We Ġare Ġnot Ġexpecting Ġtype Params ĊĠĠĠ Ġprivate Ġfun Ġgenerate Call Expr ( func : ĠCallable Descriptor ): ĠK t Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" GENER ATING Ġcall Ġof Ġtype Ġ$ func ") ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfunc . name ĊĠĠĠĠĠĠĠ Ġval Ġvalue Params Ġ= Ġfunc . value Parameters . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRandom Instances Generator ( psi ). generate Value OfType ( it . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Inser table Expressions ( Pair ( it , Ġit . type Reference ?. get Abbre vi ated Type Or Type ()), Ġ 1 ). random OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Params . any Ġ{ Ġit . isEmpty () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" C ANT ĠGENER ATE ĠPARAM S ĠFOR Ġ$ func ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinv Ġ= Ġ"$ name (${ value Params . join ToString () })" ĊĠĠĠĠĠĠĠ Ġreturn ĠFactory . psi Factory . create Expression ( inv ) ĊĠĠĠ Ġ} Ċ Ċ }