mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Исправлен подсчёт модификаций переменных при унарных операциях
This commit is contained in:
parent
839f571b2c
commit
a484df12e3
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user