From 1abcffda5df0e7c3ca51f89f588a85566d73d588 Mon Sep 17 00:00:00 2001 From: aNNiMON Date: Mon, 2 Oct 2023 18:37:11 +0300 Subject: [PATCH] Fix optimization in use statement and match expression with _ matcher --- ownlang-desktop/build.gradle | 12 ++++- .../ownlang/parser/ast/MatchExpression.java | 44 +++++++++---------- .../parser/optimization/ConstantFolding.java | 5 --- .../optimization/OptimizationVisitor.java | 10 +++-- 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/ownlang-desktop/build.gradle b/ownlang-desktop/build.gradle index d13ebda..d1e7740 100644 --- a/ownlang-desktop/build.gradle +++ b/ownlang-desktop/build.gradle @@ -46,4 +46,14 @@ tasks.register('runOptimizing', JavaExec) { classpath = sourceSets.main.runtimeClasspath ignoreExitValue true args '-o 9 -m -a -f ../program.own'.split(' ') -} \ No newline at end of file +} + +tasks.register('runOptimizationDumper', JavaExec) { + group = "application" + description = "Run optmizer and dump results" + dependsOn classes + mainClass = 'com.annimon.ownlang.utils.OptimizationDumper' + classpath = sourceSets.main.runtimeClasspath + args '../program.own' +} +// diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java index 8af6163..824cc7e 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java @@ -74,7 +74,7 @@ public final class MatchExpression extends InterruptableNode implements Expressi final int size = array.size(); for (int i = 0; i < size; i++) { final Expression expr = p.values.get(i); - if ( (expr != TuplePattern.ANY) && (expr.eval().compareTo(array.get(i)) != 0) ) { + if ( (expr != ANY) && (expr.eval().compareTo(array.get(i)) != 0) ) { return false; } } @@ -279,26 +279,26 @@ public final class MatchExpression extends InterruptableNode implements Expressi } return "()".concat(super.toString()); } - - private static final Expression ANY = new Expression() { - @Override - public Value eval() { - return NumberValue.ONE; - } - - @Override - public void accept(Visitor visitor) { - } - - @Override - public R accept(ResultVisitor visitor, T input) { - return null; - } - - @Override - public String toString() { - return "_".concat(super.toString()); - } - }; } + + public static final Expression ANY = new Expression() { + @Override + public Value eval() { + return NumberValue.ONE; + } + + @Override + public void accept(Visitor visitor) { + } + + @Override + public R accept(ResultVisitor visitor, T input) { + return null; + } + + @Override + public String toString() { + return "_"; + } + }; } diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/ConstantFolding.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/ConstantFolding.java index ea25ce5..2982af2 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/ConstantFolding.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/ConstantFolding.java @@ -99,11 +99,6 @@ public class ConstantFolding extends OptimizationVisitor implements Optimi return super.visit(s, t); } - @Override - public Node visit(UseStatement s, Void unused) { - return null; - } - @Override public Node visit(FunctionDefineStatement s, Void t) { if (OPERATORS.contains(s.name)) { diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java index a903fa8..e3b28d8 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java @@ -280,10 +280,12 @@ public abstract class OptimizationVisitor implements ResultVisitor { final List newValues = new ArrayList<>(tuple.values.size()); boolean valuesChanged = false; for (Expression value : tuple.values) { - final Node node = value.accept(this, t); - if (node != value) { - valuesChanged = true; - value = (Expression) node; + if (value != MatchExpression.ANY) { + final Node node = value.accept(this, t); + if (node != value) { + valuesChanged = true; + value = (Expression) node; + } } newValues.add(value); }