package Ġorg . open rs 2 . de ob . ast . transform Ċ Ċ import Ġcom . github . jav ap ar ser . ast . Compilation Unit Ċ import Ġcom . github . jav ap ar ser . ast . NodeList Ċ import Ġcom . github . jav ap ar ser . ast . body . Method Declaration Ċ import Ġcom . github . jav ap ar ser . ast . expr . Binary Expr Ċ import Ġcom . github . jav ap ar ser . ast . expr . Conditional Expr Ċ import Ġcom . github . jav ap ar ser . ast . stmt . Block Stmt Ċ import Ġcom . github . jav ap ar ser . ast . stmt . If Stmt Ċ import Ġcom . github . jav ap ar ser . ast . stmt . Return Stmt Ċ import Ġcom . github . jav ap ar ser . ast . stmt . Statement Ċ import Ġcom . github . jav ap ar ser . ast . stmt . Throw Stmt Ċ import Ġcom . github . jav ap ar ser . ast . type . Void Type Ċ import Ġorg . open rs 2 . de ob . ast . Library Ċ import Ġorg . open rs 2 . de ob . ast . Library Group Ċ import Ġorg . open rs 2 . de ob . ast . util . count Not s Ċ import Ġorg . open rs 2 . de ob . ast . util . not Ċ import Ġorg . open rs 2 . de ob . ast . util . walk Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ public Ġclass ĠIf Else Transformer Ġ: ĠTransformer () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtransform Unit ( group : ĠLibrary Group , Ġlibrary : ĠLibrary , Ġunit : ĠCompilation Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġold Unit : ĠCompilation Unit ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Unit Ġ= Ġunit . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( unit ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( unit Ġ!= Ġold Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtransform ( unit : ĠCompilation Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġstmt : ĠIf Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . else Stmt . if Present Ġ{ Ġelse Stmt : ĠStatement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġstmt . condition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthen Stmt Ġ= Ġstmt . then Stmt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( then Stmt . is If () Ġ&& Ġ! else Stmt . is If ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ(! a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . condition Ġ= Ġcondition . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . then Stmt Ġ= Ġelse Stmt . clone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . set Else Stmt ( then Stmt . clone ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! then Stmt . is If () Ġ&& Ġelse Stmt . is If ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDon 't Ġconsider Ġany Ġmore Ġconditions Ġfor Ġsw apping Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġif / else Ġbranches , Ġas Ġit 'll Ġintroduce Ġanother Ġlevel Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġindentation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠP refer Ġfewer ĠNOT s Ġin Ġthe Ġif Ġcondition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠRew rites : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ(! a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ.... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Condition Ġ= Ġcondition . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( not Condition . count Not s () Ġ< Ġcondition . count Not s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . condition Ġ= Ġnot Condition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Stmt Ġis ĠIf Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠBlock Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock . statements . add ( else Stmt . clone ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . then Stmt Ġ= Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . then Stmt Ġ= Ġelse Stmt . clone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . set Else Stmt ( then Stmt . clone ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ.... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġstmt : ĠIf Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . else Stmt . if Present Ġ{ Ġelse Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Stmt Ġ= Ġelse Stmt . get If () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if Stmt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . set Else Stmt ( if Stmt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ(! a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġthrow Ġ... ; Ġ// Ġor Ġreturn ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthrow Ġ... ; Ġ// Ġor Ġreturn ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġstmt : ĠIf Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . else Stmt . if Present Ġ{ Ġelse Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Stmt Ġ! is ĠBlock Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġelse Stmt . statements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( statements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Stmt Ġ= Ġstatements [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if Stmt Ġ! is ĠIf Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( if Stmt . else Stmt . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthen Stmt Ġ= Ġif Stmt . then Stmt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! then Stmt . is Tail Throw Or Return ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrewrite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġif Stmt . condition . not () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġelse Stmt . clone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail . statements . remove At ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Stmt . replace ( If Stmt ( condition , Ġtail , Ġthen Stmt . clone ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġreturn Ġa Ġ? Ġ... Ġ: Ġ... ; ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġreturn Ġ... ; ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġreturn Ġ... ; ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġstmt : ĠIf Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . else Stmt . if Present Ġ{ Ġelse Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Stmt Ġ! is ĠBlock Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġelse Stmt . statements . single OrNull () Ġ?: Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( head Ġ! is ĠReturn Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . expression . if Present Ġ{ Ġexpr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expr Ġ! is ĠConditional Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthen Block Ġ= ĠBlock Stmt ( NodeList ( Return Stmt ( expr . then Expr ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Block Ġ= ĠBlock Stmt ( NodeList ( Return Stmt ( expr . else Expr ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . set Else Stmt ( If Stmt ( expr . condition , Ġthen Block , Ġelse Block )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ( a Ġ&& Ġb ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġouter Stmt : ĠIf Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outer Stmt . else Stmt . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Stmt Ġ= Ġouter Stmt . then Stmt . get If () Ġ?: Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Stmt . else Stmt . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Stmt . condition Ġ= ĠBinary Expr ( outer Stmt . condition , Ġinner Stmt . condition , ĠBinary Expr . Operator . AND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Stmt . then Stmt Ġ= Ġinner Stmt . then Stmt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġmethod : ĠMethod Declaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method . type Ġ! is ĠVoid Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . body . if Present Ġ{ Ġbody Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Stmt Ġ= Ġbody . statements . last OrNull () Ġ?: Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if Stmt Ġ! is ĠIf Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthen Statements Ġ= Ġif Stmt . then Stmt . findAll ( Statement :: class . java ). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . else Stmt . if Present OrElse ({ Ġelse Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Stmt . is If ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present OrElse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Statements Ġ= Ġelse Stmt . findAll ( Statement :: class . java ). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( then Statements Ġ<= ĠIF _ DE IND ENT _ THRESHOLD Ġ&& Ġelse Statements Ġ<= ĠIF _ DE IND ENT _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present OrElse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġvoid Ġm (...) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġvoid Ġm (...) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ(! a ) Ġ{ Ġ// Ġor Ġ` if Ġ( a )`, Ġdepending Ġon Ġwhich Ġarm Ġis Ġsmaller ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Statements Ġ> Ġthen Statements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . statements . addAll ( else Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . then Stmt Ġ= Ġif Stmt . then Stmt . append Return () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . remove Else Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . statements . addAll ( if Stmt . then Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . condition Ġ= Ġif Stmt . condition . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . then Stmt Ġ= Ġelse Stmt . append Return () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . remove Else Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġvoid Ġm (...) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġvoid Ġm (...) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġ(! a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( then Statements Ġ<= ĠIF _ DE IND ENT _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present OrElse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . statements . addAll ( if Stmt . then Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . condition Ġ= Ġif Stmt . condition . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . then Stmt Ġ= ĠBlock Stmt ( NodeList ( Return Stmt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠRewrite : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthrow Ġ... ; Ġ// Ġor Ġreturn ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġ( a ) Ġ{ Ġ// Ġor Ġ` if Ġ(! a )`, Ġif Ġthe Ġar ms Ġare Ġsw apped ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthrow Ġ... ; Ġ// Ġor Ġreturn ĊĠĠĠĠĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* Ġ... ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġblock Stmt : ĠBlock Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠXXX ( g pe ): Ġneed Ġto Ġiterate Ġthrough Ġblock Stmt . stm ts Ġmanually Ġas Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġinsert Ġextra Ġstatements Ġduring Ġiteration Ġ( ugh !) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġblock Stmt . statements . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Stmt Ġ= Ġblock Stmt . statements [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if Stmt Ġ! is ĠIf Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . else Stmt . if Present Ġ{ Ġelse Stmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Stmt . is If ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġone Ġof Ġthe Ġar ms Ġconsists Ġof Ġjust Ġa Ġthrow , Ġmove Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġinto Ġan Ġif Ġregardless Ġof Ġthe Ġfact Ġthat Ġthe Ġmethod Ġas Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhole Ġwill Ġend Ġup Ġlonger . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if Stmt . then Stmt . is Throw ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stmt . statements . addAll ( index Ġ+ Ġ 1 , Ġelse Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . remove Else Stmt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( else Stmt . is Throw ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stmt . statements . addAll ( index Ġ+ Ġ 1 , Ġif Stmt . then Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . condition Ġ= Ġif Stmt . condition . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . then Stmt Ġ= Ġelse Stmt . append Return () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . remove Else Stmt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthen Statements Ġ= Ġif Stmt . then Stmt . findAll ( Statement :: class . java ). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Statements Ġ= Ġelse Stmt . findAll ( Statement :: class . java ). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( then Statements Ġ<= ĠIF _ DE IND ENT _ THRESHOLD Ġ&& Ġelse Statements Ġ<= ĠIF _ DE IND ENT _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ if Present ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Statements Ġ> Ġthen Statements Ġ&& Ġif Stmt . then Stmt . is Tail Throw Or Return ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stmt . statements . addAll ( index Ġ+ Ġ 1 , Ġelse Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . remove Else Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( else Stmt . is Tail Throw Or Return ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Stmt . statements . addAll ( index Ġ+ Ġ 1 , Ġif Stmt . then Stmt . flatten ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . condition Ġ= Ġif Stmt . condition . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . then Stmt Ġ= Ġelse Stmt . append Return () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Stmt . remove Else Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStatement . append Return (): ĠStatement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġis ĠBlock Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġstatements . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Ġis ĠReturn Stmt Ġ|| Ġlast Ġis ĠThrow Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Stmt ( NodeList ( statements . map ( Statement :: clone ). plus ( Return Stmt ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( this Ġis ĠReturn Stmt Ġ|| Ġthis Ġis ĠThrow Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclone () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Stmt ( NodeList ( clone (), ĠReturn Stmt ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStatement . flatten (): ĠCollection < Statement > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġis ĠBlock Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . map ( Statement :: clone ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( clone ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStatement . is If (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget If () Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStatement . get If (): ĠIf Stmt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIf Stmt Ġ-> Ġclone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Stmt Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġstatements . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( head Ġis ĠIf Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . clone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStatement . is Throw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠThrow Stmt Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Stmt Ġ-> Ġstatements . single OrNull () Ġis ĠThrow Stmt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStatement . is Tail Throw Or Return (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠThrow Stmt , Ġis ĠReturn Stmt Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Stmt Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġstatements . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Ġis ĠThrow Stmt Ġ|| Ġtail Ġis ĠReturn Stmt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠIF _ DE IND ENT _ THRESHOLD Ġ= Ġ 5 ĊĠĠĠ Ġ} Ċ } Ċ