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

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;
import com.annimon.ownlang.parser.ast.Accessible;
import com.annimon.ownlang.parser.ast.Argument;
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.ForeachArrayStatement;
import com.annimon.ownlang.parser.ast.ForeachMapStatement;
import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
import com.annimon.ownlang.parser.ast.MatchExpression;
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.VariableExpression;
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);
}
@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
public Node visit(FunctionDefineStatement s, Map<String, VariableInfo> t) {
for (Argument argument : s.arguments) {
@ -57,9 +75,31 @@ public class VariablesGrabber extends OptimizationVisitor<Map<String, VariableIn
@Override
public Node visit(MatchExpression s, Map<String, VariableInfo> t) {
// no visit match expression
return s;
for (MatchExpression.Pattern pattern : s.patterns) {
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) {
final VariableInfo var;