1- package com .annimon .ownlang .parser .visitors ;
1+ package com .annimon .ownlang .parser .optimization ;
22
3- import com .annimon .ownlang .parser .Optimizer ;
43import com .annimon .ownlang .parser .ast .ExprStatement ;
54import com .annimon .ownlang .parser .ast .IfStatement ;
65import com .annimon .ownlang .parser .ast .Node ;
76import com .annimon .ownlang .parser .ast .TernaryExpression ;
8- import com .annimon .ownlang .parser .ast .ValueExpression ;
97import com .annimon .ownlang .parser .ast .WhileStatement ;
8+ import static com .annimon .ownlang .parser .visitors .VisitorUtils .isValue ;
9+ import static com .annimon .ownlang .parser .visitors .VisitorUtils .isValueAsInt ;
1010
1111/**
1212 * Performs dead code elimination.
1313 */
14- public class DeadCodeElimination extends OptimizationVisitor <Void > implements Optimizer . Info {
14+ public class DeadCodeElimination extends OptimizationVisitor <Void > implements Optimizable {
1515
1616 private int ifStatementEliminatedCount ;
1717 private int ternaryExpressionEliminatedCount ;
1818 private int whileStatementEliminatedCount ;
1919
20+ @ Override
21+ public Node optimize (Node node ) {
22+ return node .accept (this , null );
23+ }
24+
2025 @ Override
2126 public int optimizationsCount () {
2227 return ifStatementEliminatedCount + ternaryExpressionEliminatedCount
@@ -41,7 +46,7 @@ public String summaryInfo() {
4146
4247 @ Override
4348 public Node visit (IfStatement s , Void t ) {
44- if (s .expression instanceof ValueExpression ) {
49+ if (isValue ( s .expression ) ) {
4550 ifStatementEliminatedCount ++;
4651 // true statement
4752 if (s .expression .eval ().asInt () != 0 ) {
@@ -58,7 +63,7 @@ public Node visit(IfStatement s, Void t) {
5863
5964 @ Override
6065 public Node visit (TernaryExpression s , Void t ) {
61- if (s .condition instanceof ValueExpression ) {
66+ if (isValue ( s .condition ) ) {
6267 ternaryExpressionEliminatedCount ++;
6368 if (s .condition .eval ().asInt () != 0 ) {
6469 return s .trueExpr ;
@@ -70,11 +75,9 @@ public Node visit(TernaryExpression s, Void t) {
7075
7176 @ Override
7277 public Node visit (WhileStatement s , Void t ) {
73- if (s .condition instanceof ValueExpression ) {
74- if (s .condition .eval ().asInt () == 0 ) {
75- whileStatementEliminatedCount ++;
76- return new ExprStatement (s .condition );
77- }
78+ if (isValueAsInt (s .condition , 0 )) {
79+ whileStatementEliminatedCount ++;
80+ return new ExprStatement (s .condition );
7881 }
7982 return super .visit (s , t );
8083 }
0 commit comments