package Ġcom . step an ov . bbf . bug finder . generator . constructor Ċ Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . psi . tree . I ElementType Ċ import Ġcom . step an ov . bbf . bug finder . executor . Compiler Args Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . transform ations . Factory Ċ import Ġcom . step an ov . bbf . bug finder . util .* Ċ import Ġcom . step an ov . bbf . red uk tor . parser . PS IC re ator Ċ import Ġorg . jetbrains . kotlin . Kt Node Types Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . binding Context Util . get Abbre vi ated Type Or Type Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . getType Ċ import Ġcom . step an ov . bbf . bug finder . util . getType Ġas ĠgetType 1 Ċ import Ġjava . io . File Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . streams . toList Ċ Ċ object ĠNode DB Ġ{ ĊĊĠĠĠ Ġ// ĠData Structure Ġto Ġusing Ġexamples ĊĠĠĠ Ġfun ĠgetRandom Data Structures ( ind : ĠInt ): ĠMap < AST Node , ĠList < Using Example > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Map Ġ= Ġmutable Map Of < AST Node , ĠList < Using Example > ?> () Ċ // ĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( Random . nextInt ( 0 , Ġ 1 0 )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠK t Node Types . OBJECT _ DECL AR ATION Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠK t Node Types . CLASS Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// val Ġpsi With Needed Nodes Ġ= ĠgetRandom File With Nodes OfType ( type ) ĊĠĠĠĠĠĠĠ Ġval Ġpsi With Needed Nodes Ġ= ĠlistOf (" box Nullable Int . kt ", Ġ" kt 2 3 9 9 . kt ", Ġ" classifier Is Class . kt ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFactory . psi Factory . create File ( File ("${ Compiler Args . base Dir }/ $ it "). read Text ()) Ġ} [ ind ] Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! anon ym ize ( psi With Needed Nodes , Ġchecker )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( psi With Needed Nodes . text ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of () Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdata Structures Ġ= Ġpsi With Needed Nodes . getAll P SI Children OfType < Kt Class Or Object >() ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠPS IC re ator . analyze ( psi With Needed Nodes ) Ġ?: Ġreturn Ġmap Of () ĊĠĠĠĠĠĠĠ Ġfor Ġ( ds Ġin Ġdata Structures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ds . name Ġ== Ġnull ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusing Examples Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi With Needed Nodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAll P SI Children OfType < Kt Expression > Ġ{ Ġit . text . contains ( ds . name !! ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġit . getType ( ctx ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first Ġ! is ĠK t Class Or Object Ġ&& Ġit . second Ġ!= Ġnull Ġ&& Ġit . second . toString () Ġ!= Ġ" Nothing " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠUsing Example ( it . first . node , Ġit . second !! ) Ġ} + ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi With Needed Nodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAll P SI Children OfType < Kt Named Function >() Ġ{ Ġ! it . text . contains (" fun Ġbox ") Ġ&& Ġit . is TopLevel } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġ( it . type Reference ?. get Abbre vi ated Type Or Type ( ctx ) Ġ?: Ġit . getType 1 ( ctx )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠUsing Example ( it . first . node , Ġit . second !! ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Map [ ds . node ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( using Examples . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusing Examples ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// println ( res Map . entries . map Ġ{ Ġit . value ?. map Ġ{ Ġit . node . text Ġto Ġit . type Ġ} Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġres Map ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġprivate Ġfun Ġan onym ize ( psi : ĠK t File , Ġchecker : ĠCheck er ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġnamed Ġ= Ġmutable ListOf < Kt Named Declaration >() Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġpsi . getAll Children ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠK t Named Declaration Ġ&& Ġchild . name Ġ!= Ġnull Ġ&& Ġ! child . name !!. startsWith ("< ") Ġ&& Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! child . name !!. contains (" box ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( named . all Ġ{ Ġit . name Ġ!= Ġchild . name Ġ}) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed . add ( child ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġnamed ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewName Ġ= Ġwhen Ġ( n ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġ" Kl ${ counters [ 0 ] ++ }" Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> Ġ" f ${ counters [ 1 ] ++ }" Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> Ġ" prop ${ counters [ 2 ] ++ }" Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter Ġ-> Ġ" par ${ counters [ 3 ] ++ }" Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" sm th ${ counters [ 4 ] ++ }" Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage s Ġ= Ġpsi . getAll P SI Children OfType < Kt Name Reference Expression >(). filter Ġ{ Ġit . text Ġ== Ġn . name Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewName Ref Ġ= ĠK t Psi Factory ( psi . project ). create Simple Name ( new Name ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġusage s . map Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠnewName Ref . copy () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . replace This ( copy ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy () Ġto Ġcopy Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġn . setName ( new Name ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġchecker . check Comp iling ( Project . createFrom Code ( psi . text )) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġfun Ġre init Counters () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġcounters . replaceAll Ġ{ Ġ 0 Ġ} Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetRandom File With Nodes OfType ( type : ĠI ElementType ): ĠK t File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġfile . filter Ġ{ Ġit . take While Ġ{ Ġit Ġ!= Ġ' Ġ' Ġ} Ġ== Ġtype . toString () Ġ}. first () ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġline . drop Last ( 1 ). take Last While Ġ{ Ġit Ġ!= Ġ'[' Ġ}. split (", Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġrandom File Ġ= Ġfiles . random () ĊĠĠĠĠĠĠĠ Ġ// val Ġrandom File Ġ= Ġ" single Element Step Two 0 . kt " ĊĠĠĠĠĠĠĠ Ġ// println (" NAME Ġ= Ġ$ random File ") ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= ĠFactory . psi Factory . create File ( File ("${ Compiler Args . base Dir }/ $ random File "). read Text ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġpsi ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Nodes OfType From Random File ( type : ĠI ElementType ): ĠList < AST Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= ĠgetRandom File With Nodes OfType ( type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpsi . node . getAll Children Nodes (). filter Ġ{ Ġit . elementType Ġ== Ġtype Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Nodes OfType From Random File With Ctx ( type : ĠI ElementType ): ĠPair < List < AST Node >, ĠBinding Context > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= ĠgetRandom File With Nodes OfType ( type ) ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠPS IC re ator . analyze ( psi ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpsi . node . getAll Children Nodes (). filter Ġ{ Ġit . elementType Ġ== Ġtype Ġ} Ġto Ġctx !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetRandom Node OfType From Random File ( type : ĠI ElementType ): ĠAST Node Ġ= ĠgetAll Nodes OfType From Random File ( type ). random () ĊĠĠĠ Ġfun ĠgetRandom Node OfType From Random File With Ctx ( type : ĠI ElementType ): ĠPair < AST Node , ĠBinding Context > Ġ= ĊĠĠĠĠĠĠĠ ĠgetAll Nodes OfType From Random File With Ctx ( type ). let Ġ{ Ġit . first . random () Ġto Ġit . second Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġfile Ġ= ĠFile (" database . txt "). buffered Reader (). lines (). toList () ĊĠĠĠ Ġprivate Ġval Ġcounters Ġ= Ġmutable ListOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 ) Ċ }