package Ġcom . step an ov . bbf . bug finder . mut ator Ċ Ċ import Ġcom . step an ov . bbf . bug finder . executor . project . LANGUAGE Ċ import Ġcom . step an ov . bbf . bug finder . executor . project . Project Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . java Transform ations .* Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . project Transform ations . Project Splitter Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . transform ations .* Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . transform ations . abi . Add Random DS Ċ import Ġcom . step an ov . bbf . bug finder . mut ator . transform ations . t ce . Add Nodes From Another Files Ċ import Ġorg . apache . log 4 j . Logger Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠMut ator ( val Ġproject : ĠProject ) Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Mutation ( t : ĠTransformation , Ġprob Percentage : ĠInt Ġ= Ġ 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Random . nextInt ( 0 , Ġ 1 0 0 ) Ġ< Ġprob Percentage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Cur Ġtransformation Ġ${ t :: class . simple Name }") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . transform () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// log . debug (" After Ġ${ t :: class . simple Name } Ġ= Ġ${ Transformation . checker . cur File . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// log . debug (" Verify Ġ= Ġ${ verify () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Update Ġctx Ġand Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchecker . cur File . change Psi File ( checker . cur File . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġnew File Ġ= ĠProject . createFrom Code ( Transformation . checker . cur File . text ). files . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Transformation . checker . cur File Ġ= Ġnew File Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Exception Ġ${ e . localized Message }\ n ${ e . stack Trace . toList (). join ToString ("\ n ") Ġ{ Ġ"$ it " Ġ}} ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠError ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Error Ġ${ e . localized Message }\ n ${ e . stack Trace . toList (). join ToString ("\ n ") Ġ{ Ġ"$ it " Ġ}} ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġstart Mutate () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( bbf File Ġin Ġproject . files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Mutation Ġof Ġ${ bbf File . name } Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransformation . checker . cur File Ġ= Ġb bf File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( bbf File . get Language ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLANGUAGE . JAVA Ġ-> Ġstart Java Mut ations () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstart Kotlin Mut ations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" End ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Stub ĊĠĠĠ Ġprivate Ġfun Ġstart Java Mut ations () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" START ING ĠJAVA ĠMUT ATIONS ") ĊĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Random Java AST Nodes From Another Trees (), Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġprintln (" END ĠJAVA ĠMUT ATIONS ") ĊĠĠĠĠĠĠĠ Ġlog . debug (" Verify Ġ= Ġ${ verify () }") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Kotlin Mut ations () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// execute Mutation ( Add Random Node (), Ġ 1 0 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Random DS (), Ġ 1 0 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Random AST Nodes From Another Trees (), Ġ 1 0 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexit Process ( 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Random AST Nodes (), Ġ 5 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Properties To Class (), Ġ 1 0 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexit Process ( 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Random Annotation (), Ġ 1 0 0 ) Ċ // ĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠRandom . nextInt ( 1 , Ġ 3 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutations . sh uffled (). forEach Ġ{ Ġexecute Mutation ( it . first , Ġit . second ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ// Set Ġof Ġtransformations Ġover ĠP SI Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Null ability Transformer ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Possible Modifiers ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Re ified To Type ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Sm th To Extension ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add DefaultValue To Arg ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Arg To Another Value ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Re init Properties ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add NotNull Assertions ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Block To Expression ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Operators ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Constants ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Types (), Ġ 7 5 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change ReturnValue To Constant ()) Ċ // ĠĠĠĠĠĠĠ Ġ// execute Mutation ( Remove Random Lines ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Br ackets To Expression ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Modifiers ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Same Functions ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Operator sTo Fun Inv ocations ()) Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( project . files . size Ġ> Ġ 1 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Mutation ( Shuffle Nodes (), Ġ 7 5 ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Random AST Nodes (), Ġ 7 5 ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Nodes From Another Files (), Ġ 7 5 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Fun Inv ocations (), Ġ 7 5 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Random Lines ()) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Change Random AST Nodes From Another Trees (), Ġ 7 5 ) Ċ // ĠĠĠĠĠĠĠ Ġexecute Mutation ( Add Try Expression ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġis Project () Ġ= Ġproject . files . size Ġ> Ġ 1 ĊĊĠĠĠ Ġprivate Ġfun Ġverify (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠTransformation . checker . check Comp iling ( project ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" C ant Ġcompile Ġproject Ġ${ project }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmutations Ġ= ĠlistOf ( Add Null ability Transformer () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd Possible Modifiers () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd Re ified To Type () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Sm th To Extension () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd DefaultValue To Arg () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Arg To Another Value () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠRe init Properties () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd NotNull Assertions () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd Block To Expression () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Operators () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Constants () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Types () Ġto Ġ 7 5 , ĊĠĠĠĠĠĠĠ ĠChange ReturnValue To Constant () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd Br ackets To Expression () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Modifiers () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd Same Functions () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Operator sTo Fun Inv ocations () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Random AST Nodes () Ġto Ġ 7 5 , ĊĠĠĠĠĠĠĠ ĠAdd Fun Inv ocations () Ġto Ġ 7 5 , ĊĠĠĠĠĠĠĠ ĠChange Random Lines () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠChange Random AST Nodes From Another Trees () Ġto Ġ 1 0 0 , ĊĠĠĠĠĠĠĠ ĠAdd Try Expression () Ġto Ġ 5 0 , ĊĠĠĠĠĠĠĠ ĠAdd Nodes From Another Files () Ġto Ġ 5 0 ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . getLogger (" bug Finder Logger ") ĊĠĠĠ Ġprivate Ġval Ġchecker ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠTransformation . checker Ċ Ċ }