22
33import com .annimon .ownlang .lib .Types ;
44import com .annimon .ownlang .parser .ast .AssignmentExpression ;
5+ import com .annimon .ownlang .parser .ast .BlockStatement ;
56import com .annimon .ownlang .parser .ast .ExprStatement ;
7+ import com .annimon .ownlang .parser .ast .Expression ;
68import com .annimon .ownlang .parser .ast .IfStatement ;
79import com .annimon .ownlang .parser .ast .Node ;
10+ import com .annimon .ownlang .parser .ast .Statement ;
811import com .annimon .ownlang .parser .ast .TernaryExpression ;
912import com .annimon .ownlang .parser .ast .ValueExpression ;
1013import com .annimon .ownlang .parser .ast .VariableExpression ;
1114import com .annimon .ownlang .parser .ast .WhileStatement ;
15+ import static com .annimon .ownlang .parser .visitors .VisitorUtils .isConstantValue ;
1216import static com .annimon .ownlang .parser .visitors .VisitorUtils .isValue ;
1317import static com .annimon .ownlang .parser .visitors .VisitorUtils .isValueAsInt ;
1418import static com .annimon .ownlang .parser .visitors .VisitorUtils .isVariable ;
@@ -22,6 +26,7 @@ public class DeadCodeElimination extends OptimizationVisitor<Map<String, Variabl
2226 private int ifStatementEliminatedCount ;
2327 private int ternaryExpressionEliminatedCount ;
2428 private int whileStatementEliminatedCount ;
29+ private int assignmentExpressionEliminatedCount ;
2530
2631 @ Override
2732 public Node optimize (Node node ) {
@@ -32,7 +37,7 @@ public Node optimize(Node node) {
3237 @ Override
3338 public int optimizationsCount () {
3439 return ifStatementEliminatedCount + ternaryExpressionEliminatedCount
35- + whileStatementEliminatedCount ;
40+ + whileStatementEliminatedCount + assignmentExpressionEliminatedCount ;
3641 }
3742
3843 @ Override
@@ -48,6 +53,9 @@ public String summaryInfo() {
4853 if (whileStatementEliminatedCount > 0 ) {
4954 sb .append ("\n Eliminated WhileStatement: " ).append (whileStatementEliminatedCount );
5055 }
56+ if (whileStatementEliminatedCount > 0 ) {
57+ sb .append ("\n Eliminated AssignmentExpression: " ).append (assignmentExpressionEliminatedCount );
58+ }
5159 return sb .toString ();
5260 }
5361
@@ -104,9 +112,37 @@ public Node visit(AssignmentExpression s, Map<String, VariableInfo> t) {
104112 switch (info .value .type ()) {
105113 case Types .NUMBER :
106114 case Types .STRING :
115+ assignmentExpressionEliminatedCount ++;
107116 return new ValueExpression (info .value );
108117 default :
109118 return super .visit (s , t );
110119 }
111120 }
121+
122+ @ Override
123+ public Node visit (BlockStatement s , Map <String , VariableInfo > t ) {
124+ final BlockStatement result = new BlockStatement ();
125+ boolean changed = false ;
126+ for (Statement statement : s .statements ) {
127+ final Node node = statement .accept (this , t );
128+ if (node != statement ) {
129+ changed = true ;
130+ }
131+ if (node instanceof ExprStatement
132+ && isConstantValue ( ((ExprStatement ) node ).expr )) {
133+ changed = true ;
134+ continue ;
135+ }
136+
137+ if (node instanceof Statement ) {
138+ result .add ((Statement ) node );
139+ } else if (node instanceof Expression ) {
140+ result .add (new ExprStatement ((Expression ) node ));
141+ }
142+ }
143+ if (changed ) {
144+ return result ;
145+ }
146+ return super .visit (s , t );
147+ }
112148}
0 commit comments