package Ġcom . step an ov . bbf . bug finder . util Ċ Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . step an ov . bbf . bug finder . executor . check ers . Compilation Checker Ċ import Ġcom . step an ov . bbf . bug finder . executor . comp ilers . JVM Compiler Ċ import Ġcom . step an ov . bbf . bug finder . executor . project . Project Ċ import Ġcom . step an ov . bbf . red uk tor . util . getAll Children Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parents Ċ import Ġkotlin . random . Random Ċ Ċ object ĠAn onym izer Ġ{ ĊĊĠĠĠ Ġval Ġcounters Ġ= Ġmutable ListOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġfun Ġan on ( project : ĠProject ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġproject . files . first (). psi File ĊĠĠĠĠĠĠĠ Ġval Ġchecker Ġ= ĠCompilation Checker ( JVM Compiler ()) ĊĊĠĠĠĠĠĠĠ Ġ/* if Ġ( f . name Ġ!= Ġ" single Assignment To Var arg In Annotation . kt ") Ġcontinue */ ĊĠĠĠĠĠĠĠ Ġ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 . text . contains ( Regex (""" fun Ġbox \ d *\ (""" )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġchild Ġ! is ĠK t Parameter Ġ&& Ġchild Ġ! is ĠK t Primary Constructor Ġ&& Ġchild Ġ! is ĠK t Secondary Constructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġchild . modifier List ?. let Ġ{ Ġ! it . has Modifier ( Kt Tokens . OVERRIDE _ KEYWORD ) Ġ} Ġ!= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġchild . modifier List ?. let Ġ{ Ġ! it . has Modifier ( Kt Tokens . OPERATOR _ KEYWORD ) Ġ} Ġ!= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( named . all Ġ{ Ġit . name Ġ!= Ġchild . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed . add ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Rename Ġbox ĊĠĠĠĠĠĠĠ Ġpsi . getAll P SI Children OfType < Kt Named Function >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . text . contains ( Regex (""" fun Ġbox \ d *\ (""" )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġtry To Replace ( psi , Ġ" box ${ Random . nextInt ( 1 0 0 , Ġ 1 0 0 0 )} ", Ġit , Ġchecker , Ġproject ) Ġ} ĊĠĠĠĠĠĠĠ Ġnamed . forEach Ġ{ Ġtry To Replace ( psi , Ġgenerate New Name ( it ), Ġit , Ġchecker , Ġproject ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry To Replace ( ĊĠĠĠĠĠĠĠ Ġpsi : ĠPsi File , ĊĠĠĠĠĠĠĠ ĠnewName : ĠString , ĊĠĠĠĠĠĠĠ Ġn : ĠK t Named Declaration , ĊĠĠĠĠĠĠĠ Ġchecker : ĠCompilation Checker , ĊĠĠĠĠĠĠĠ Ġproject : ĠProject ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Expr Ġ= Ġn . copy () ĊĠĠĠĠĠĠĠ Ġval Ġusage s Ġ= Ġpsi . getAll Children () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . node . elementType Ġ== ĠK t Tokens . IDENTIFIER Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . text Ġ== Ġn . name Ġ&& Ġit Ġ!= Ġn . name Identifier Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . parents . any Ġ{ Ġit Ġis ĠK t Import Directive Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ// 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 ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Usage s Ġ= Ġusage s . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠnewName Ref . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . replace This ( copy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy () Ġto Ġcopy ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġn . setName ( new Name ) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġchecker . check Comp iling ( project ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Usage s . forEach Ġ{ Ġit . second . replace This ( it . first ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn . replace This ( old Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! checker . check Comp iling ( project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate New Name ( decl : ĠK t Named Declaration ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( decl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġ" K la ${ counters [ 0 ] ++ }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> Ġ" fu ${ counters [ 1 ] ++ }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> Ġ" pro pe ${ counters [ 2 ] ++ }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter Ġ-> Ġ" para ${ counters [ 3 ] ++ }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" Ty ${ counters [ 4 ] ++ }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Counters () Ġ= Ġcounters . replaceAll Ġ{ Ġ 0 Ġ} Ċ }