From 0921d8cb179c6a2dbbe26df31fa8aaccd1f83f63 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 22 Jul 2016 19:03:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20OptimizationVisitor=20=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=82=D1=82=D0=B5=D1=80=D0=BD=20=D0=BC=D0=B0=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../optimization/OptimizationVisitor.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java b/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java index 5ac7cab..aac9781 100644 --- a/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java +++ b/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java @@ -1,6 +1,8 @@ package com.annimon.ownlang.parser.optimization; +import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.parser.ast.*; +import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -246,11 +248,37 @@ public abstract class OptimizationVisitor implements ResultVisitor { boolean changed = expression != s.expression; final List patterns = new ArrayList<>(s.patterns.size()); 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); if (patternResult != pattern.result) { changed = true; 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); } if (changed) {