package Ġcom . bu k ow ie ck i . w ee vil . psi . visitor s . passes Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Block Statement Ċ import Ġcom . intellij . psi . Psi Code Block Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi If Statement Ċ import Ġcom . intellij . psi . impl . Java Psi Facade Impl Ċ import Ġcom . bu k ow ie ck i . w ee vil . debugger . Compilation Context Ċ import Ġcom . bu k ow ie ck i . w ee vil . psi . visitor s . W ee vil Debugger Base Visitor Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMar cin ĠBu k ow ie ck i Ċ Ġ*/ Ċ class ĠBlock Ad der Pass ( ĊĠĠĠ Ġexpressions To Compile : ĠList < Psi Element >, ĊĠĠĠ Ġprivate Ġval Ġproject : ĠProject , ĊĠĠĠ Ġprivate Ġval Ġcompilation Context : ĠCompilation Context Ċ ) Ġ: ĠW ee vil Debugger Base Visitor ( expressions To Compile ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġvisit If Statement ( statement : ĠPsi If Statement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatement . children . forEach Ġ{ Ġit . accept ( this ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( statement . then Branch Ġ!= Ġnull Ġ&& Ġstatement . then Branch Ġ! is ĠPsi Block Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Block ( statement . then Branch !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . set Then Branch ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( statement . then Branch Ġas ĠPsi Block Statement ). code Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( statement . else Branch Ġ!= Ġnull Ġ&& Ġstatement . else Branch Ġ! is ĠPsi Block Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Block ( statement . else Branch !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . set Else Branch ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( statement . else Branch Ġas ĠPsi Block Statement ). code Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Block ( element : ĠPsi Element , Ġto Apply : Ġ( Psi Block Statement ) Ġ-> ĠPsi Code Block ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreated Block Stmt Ġ= ĠJava Psi Facade Impl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getElement Factory ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. createStatement FromText (" {}", Ġnull ) Ġas ĠPsi Block Statement ĊĠĠĠĠĠĠĠ Ġcreated Block Stmt . code Block . add ( element ) ĊĠĠĠĠĠĠĠ Ġval Ġcode Block Ġ= Ġto Apply . invoke ( created Block Stmt ) ĊĠĠĠĠĠĠĠ Ġcompilation Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. code Event Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Block Visit (" block ${ compilation Context . block Counter ++ }", Ġcode Block ). let Ġ{ Ġcompilation Context . event Register . add ( it ) Ġ} ĊĠĠĠ Ġ} Ċ }