2
2
3
3
import com .annimon .ownlang .lib .Types ;
4
4
import com .annimon .ownlang .parser .ast .AssignmentExpression ;
5
+ import com .annimon .ownlang .parser .ast .BlockStatement ;
5
6
import com .annimon .ownlang .parser .ast .ExprStatement ;
7
+ import com .annimon .ownlang .parser .ast .Expression ;
6
8
import com .annimon .ownlang .parser .ast .IfStatement ;
7
9
import com .annimon .ownlang .parser .ast .Node ;
10
+ import com .annimon .ownlang .parser .ast .Statement ;
8
11
import com .annimon .ownlang .parser .ast .TernaryExpression ;
9
12
import com .annimon .ownlang .parser .ast .ValueExpression ;
10
13
import com .annimon .ownlang .parser .ast .VariableExpression ;
11
14
import com .annimon .ownlang .parser .ast .WhileStatement ;
15
+ import static com .annimon .ownlang .parser .visitors .VisitorUtils .isConstantValue ;
12
16
import static com .annimon .ownlang .parser .visitors .VisitorUtils .isValue ;
13
17
import static com .annimon .ownlang .parser .visitors .VisitorUtils .isValueAsInt ;
14
18
import static com .annimon .ownlang .parser .visitors .VisitorUtils .isVariable ;
@@ -22,6 +26,7 @@ public class DeadCodeElimination extends OptimizationVisitor<Map<String, Variabl
22
26
private int ifStatementEliminatedCount ;
23
27
private int ternaryExpressionEliminatedCount ;
24
28
private int whileStatementEliminatedCount ;
29
+ private int assignmentExpressionEliminatedCount ;
25
30
26
31
@ Override
27
32
public Node optimize (Node node ) {
@@ -32,7 +37,7 @@ public Node optimize(Node node) {
32
37
@ Override
33
38
public int optimizationsCount () {
34
39
return ifStatementEliminatedCount + ternaryExpressionEliminatedCount
35
- + whileStatementEliminatedCount ;
40
+ + whileStatementEliminatedCount + assignmentExpressionEliminatedCount ;
36
41
}
37
42
38
43
@ Override
@@ -48,6 +53,9 @@ public String summaryInfo() {
48
53
if (whileStatementEliminatedCount > 0 ) {
49
54
sb .append ("\n Eliminated WhileStatement: " ).append (whileStatementEliminatedCount );
50
55
}
56
+ if (whileStatementEliminatedCount > 0 ) {
57
+ sb .append ("\n Eliminated AssignmentExpression: " ).append (assignmentExpressionEliminatedCount );
58
+ }
51
59
return sb .toString ();
52
60
}
53
61
@@ -104,9 +112,37 @@ public Node visit(AssignmentExpression s, Map<String, VariableInfo> t) {
104
112
switch (info .value .type ()) {
105
113
case Types .NUMBER :
106
114
case Types .STRING :
115
+ assignmentExpressionEliminatedCount ++;
107
116
return new ValueExpression (info .value );
108
117
default :
109
118
return super .visit (s , t );
110
119
}
111
120
}
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
+ }
112
148
}
0 commit comments