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;
|
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,10 +75,32 @@ 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;
|
||||||
if (t.containsKey(variableName)) {
|
if (t.containsKey(variableName)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user