Skip to content

Commit 156675a

Browse files
committed
Рефакторинг
1 parent 357813e commit 156675a

File tree

3 files changed

+31
-35
lines changed

3 files changed

+31
-35
lines changed

src/com/annimon/ownlang/parser/visitors/ConstantPropagation.java

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,7 @@ public Node visit(AssignmentExpression s, Map<String, VariableInfo> t) {
7676
}
7777

7878
final String variableName = ((VariableExpression) s.target).name;
79-
final VariableInfo var;
80-
if (t.containsKey(variableName)) {
81-
var = t.get(variableName);
82-
var.modifications++;
83-
} else {
84-
var = new VariableInfo();
85-
var.modifications = 1;
86-
}
79+
final VariableInfo var = variableInfo(t, variableName);
8780

8881
if (s.operation == null && isValue(s.expression)) {
8982
var.value = ((ValueExpression) s.expression).value;
@@ -96,16 +89,7 @@ public Node visit(AssignmentExpression s, Map<String, VariableInfo> t) {
9689
public Node visit(DestructuringAssignmentStatement s, Map<String, VariableInfo> t) {
9790
for (String variableName : s.variables) {
9891
if (variableName == null) continue;
99-
100-
final VariableInfo var;
101-
if (t.containsKey(variableName)) {
102-
var = t.get(variableName);
103-
var.modifications++;
104-
} else {
105-
var = new VariableInfo();
106-
var.modifications = 1;
107-
}
108-
t.put(variableName, var);
92+
t.put(variableName, variableInfo(t, variableName));
10993
}
11094
return super.visit(s, t);
11195
}
@@ -114,15 +98,7 @@ public Node visit(DestructuringAssignmentStatement s, Map<String, VariableInfo>
11498
public Node visit(FunctionDefineStatement s, Map<String, VariableInfo> t) {
11599
for (Argument argument : s.arguments) {
116100
final String variableName = argument.getName();
117-
final VariableInfo var;
118-
if (t.containsKey(variableName)) {
119-
var = t.get(variableName);
120-
var.modifications++;
121-
} else {
122-
var = new VariableInfo();
123-
var.modifications = 1;
124-
}
125-
t.put(variableName, var);
101+
t.put(variableName, variableInfo(t, variableName));
126102
}
127103
return super.visit(s, t);
128104
}
@@ -132,6 +108,18 @@ public Node visit(MatchExpression s, Map<String, VariableInfo> t) {
132108
// no visit match expression
133109
return s;
134110
}
111+
112+
private VariableInfo variableInfo(Map<String, VariableInfo> t, final String variableName) {
113+
final VariableInfo var;
114+
if (t.containsKey(variableName)) {
115+
var = t.get(variableName);
116+
var.modifications++;
117+
} else {
118+
var = new VariableInfo();
119+
var.modifications = 1;
120+
}
121+
return var;
122+
}
135123
}
136124

137125
private class VariablesPropagator extends OptimizationVisitor<Map<String, Value>> {

src/com/annimon/ownlang/parser/visitors/DeadCodeElimination.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import com.annimon.ownlang.parser.ast.IfStatement;
66
import com.annimon.ownlang.parser.ast.Node;
77
import com.annimon.ownlang.parser.ast.TernaryExpression;
8-
import com.annimon.ownlang.parser.ast.ValueExpression;
98
import com.annimon.ownlang.parser.ast.WhileStatement;
9+
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
10+
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValueAsInt;
1011

1112
/**
1213
* Performs dead code elimination.
@@ -41,7 +42,7 @@ public String summaryInfo() {
4142

4243
@Override
4344
public Node visit(IfStatement s, Void t) {
44-
if (s.expression instanceof ValueExpression) {
45+
if (isValue(s.expression)) {
4546
ifStatementEliminatedCount++;
4647
// true statement
4748
if (s.expression.eval().asInt() != 0) {
@@ -58,7 +59,7 @@ public Node visit(IfStatement s, Void t) {
5859

5960
@Override
6061
public Node visit(TernaryExpression s, Void t) {
61-
if (s.condition instanceof ValueExpression) {
62+
if (isValue(s.condition)) {
6263
ternaryExpressionEliminatedCount++;
6364
if (s.condition.eval().asInt() != 0) {
6465
return s.trueExpr;
@@ -70,11 +71,9 @@ public Node visit(TernaryExpression s, Void t) {
7071

7172
@Override
7273
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-
}
74+
if (isValueAsInt(s.condition, 0)) {
75+
whileStatementEliminatedCount++;
76+
return new ExprStatement(s.condition);
7877
}
7978
return super.visit(s, t);
8079
}

src/com/annimon/ownlang/parser/visitors/VisitorUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ public static boolean isIntegerValue(Node node, int valueToCheck) {
4747
return false;
4848
}
4949

50+
public static boolean isValueAsInt(Node node, int valueToCheck) {
51+
if (!isValue(node)) return false;
52+
53+
final Value value = ((ValueExpression) node).value;
54+
if (value.type() != Types.NUMBER) return false;
55+
56+
return value.asInt() == valueToCheck;
57+
}
58+
5059
public static boolean isSameVariables(Node n1, Node n2) {
5160
if (isVariable(n1) && isVariable(n2)) {
5261
final VariableExpression v1 = (VariableExpression) n1;

0 commit comments

Comments
 (0)