mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Исправлен OptimizationVisitor на паттерн матчинге
This commit is contained in:
parent
bc93f73eab
commit
0921d8cb17
@ -1,6 +1,8 @@
|
|||||||
package com.annimon.ownlang.parser.optimization;
|
package com.annimon.ownlang.parser.optimization;
|
||||||
|
|
||||||
|
import com.annimon.ownlang.lib.Value;
|
||||||
import com.annimon.ownlang.parser.ast.*;
|
import com.annimon.ownlang.parser.ast.*;
|
||||||
|
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -246,11 +248,37 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
|
|||||||
boolean changed = expression != s.expression;
|
boolean changed = expression != s.expression;
|
||||||
final List<MatchExpression.Pattern> patterns = new ArrayList<>(s.patterns.size());
|
final List<MatchExpression.Pattern> patterns = new ArrayList<>(s.patterns.size());
|
||||||
for (MatchExpression.Pattern pattern : s.patterns) {
|
for (MatchExpression.Pattern pattern : s.patterns) {
|
||||||
|
if (pattern instanceof MatchExpression.VariablePattern) {
|
||||||
|
final String variable = ((MatchExpression.VariablePattern) pattern).variable;
|
||||||
|
final VariableExpression expr = new VariableExpression(variable);
|
||||||
|
final Node node = expr.accept(this, t);
|
||||||
|
if (node != expr) {
|
||||||
|
if (isValue(node)) {
|
||||||
|
changed = true;
|
||||||
|
final Value value = ((ValueExpression) node).value;
|
||||||
|
final Expression optCondition = pattern.optCondition;
|
||||||
|
final Statement result = pattern.result;
|
||||||
|
pattern = new MatchExpression.ConstantPattern(value);
|
||||||
|
pattern.optCondition = optCondition;
|
||||||
|
pattern.result = result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final Node patternResult = pattern.result.accept(this, t);
|
final Node patternResult = pattern.result.accept(this, t);
|
||||||
if (patternResult != pattern.result) {
|
if (patternResult != pattern.result) {
|
||||||
changed = true;
|
changed = true;
|
||||||
pattern.result = consumeStatement(patternResult);
|
pattern.result = consumeStatement(patternResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pattern.optCondition != null) {
|
||||||
|
Node optCond = pattern.optCondition.accept(this, t);
|
||||||
|
if (optCond != pattern.optCondition) {
|
||||||
|
changed = true;
|
||||||
|
pattern.optCondition = (Expression) optCond;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
patterns.add(pattern);
|
patterns.add(pattern);
|
||||||
}
|
}
|
||||||
if (changed) {
|
if (changed) {
|
||||||
|
Loading…
Reference in New Issue
Block a user