Исправлен подсчёт модификаций переменных при унарных операциях

This commit is contained in:
Victor 2016-07-22 22:44:46 +03:00
parent 839f571b2c
commit a484df12e3

View File

@ -1,11 +1,16 @@
package com.annimon.ownlang.parser.optimization; package com.annimon.ownlang.parser.optimization;
import com.annimon.ownlang.parser.ast.Accessible;
import com.annimon.ownlang.parser.ast.Argument; import com.annimon.ownlang.parser.ast.Argument;
import com.annimon.ownlang.parser.ast.AssignmentExpression; import com.annimon.ownlang.parser.ast.AssignmentExpression;
import com.annimon.ownlang.parser.ast.ContainerAccessExpression;
import com.annimon.ownlang.parser.ast.DestructuringAssignmentStatement; import com.annimon.ownlang.parser.ast.DestructuringAssignmentStatement;
import com.annimon.ownlang.parser.ast.ForeachArrayStatement;
import com.annimon.ownlang.parser.ast.ForeachMapStatement;
import com.annimon.ownlang.parser.ast.FunctionDefineStatement; import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
import com.annimon.ownlang.parser.ast.MatchExpression; import com.annimon.ownlang.parser.ast.MatchExpression;
import com.annimon.ownlang.parser.ast.Node; import com.annimon.ownlang.parser.ast.Node;
import com.annimon.ownlang.parser.ast.UnaryExpression;
import com.annimon.ownlang.parser.ast.ValueExpression; import com.annimon.ownlang.parser.ast.ValueExpression;
import com.annimon.ownlang.parser.ast.VariableExpression; import com.annimon.ownlang.parser.ast.VariableExpression;
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue; import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
@ -46,6 +51,19 @@ public class VariablesGrabber extends OptimizationVisitor<Map<String, VariableIn
return super.visit(s, t); return super.visit(s, t);
} }
@Override
public Node visit(ForeachArrayStatement s, Map<String, VariableInfo> t) {
t.put(s.variable, variableInfo(t, s.variable));
return super.visit(s, t);
}
@Override
public Node visit(ForeachMapStatement s, Map<String, VariableInfo> t) {
t.put(s.key, variableInfo(t, s.key));
t.put(s.value, variableInfo(t, s.value));
return super.visit(s, t);
}
@Override @Override
public Node visit(FunctionDefineStatement s, Map<String, VariableInfo> t) { public Node visit(FunctionDefineStatement s, Map<String, VariableInfo> t) {
for (Argument argument : s.arguments) { for (Argument argument : s.arguments) {
@ -57,9 +75,31 @@ public class VariablesGrabber extends OptimizationVisitor<Map<String, VariableIn
@Override @Override
public Node visit(MatchExpression s, Map<String, VariableInfo> t) { public Node visit(MatchExpression s, Map<String, VariableInfo> t) {
// no visit match expression for (MatchExpression.Pattern pattern : s.patterns) {
return s; if (pattern instanceof MatchExpression.VariablePattern) {
final String variableName = ((MatchExpression.VariablePattern) pattern).variable;
t.put(variableName, variableInfo(t, variableName));
} }
}
return super.visit(s, t);
}
@Override
public Node visit(UnaryExpression s, Map<String, VariableInfo> t) {
if (s.expr1 instanceof Accessible) {
if (s.expr1 instanceof VariableExpression) {
final String variableName = ((VariableExpression) s.expr1).name;
t.put(variableName, variableInfo(t, variableName));
}
if (s.expr1 instanceof ContainerAccessExpression) {
final String variableName = ((ContainerAccessExpression) s.expr1).variable;
t.put(variableName, variableInfo(t, variableName));
}
}
return super.visit(s, t);
}
private VariableInfo variableInfo(Map<String, VariableInfo> t, final String variableName) { private VariableInfo variableInfo(Map<String, VariableInfo> t, final String variableName) {
final VariableInfo var; final VariableInfo var;