From c9eb4bf8d30c27c0f475eb2949d21d3f1f20334f Mon Sep 17 00:00:00 2001 From: JFronny Date: Mon, 13 Mar 2023 14:04:20 +0100 Subject: [PATCH] muScript: optimize ternary on not --- .../src/main/java/io/gitlab/jfronny/muscript/ast/bool/Not.java | 2 +- .../jfronny/muscript/ast/conditional/BoolConditional.java | 2 ++ .../jfronny/muscript/ast/conditional/DynamicConditional.java | 2 ++ .../jfronny/muscript/ast/conditional/NumberConditional.java | 2 ++ .../jfronny/muscript/ast/conditional/StringConditional.java | 2 ++ .../jfronny/muscript/ast/conditional/UnresolvedConditional.java | 2 ++ 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/bool/Not.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/bool/Not.java index b89e166..fcfa63b 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/bool/Not.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/bool/Not.java @@ -13,7 +13,7 @@ import io.gitlab.jfronny.muscript.ast.literal.BoolLiteral; import java.io.IOException; public class Not extends BoolExpr { - private final BoolExpr inner; + public final BoolExpr inner; public Not(int chStart, int chEnd, BoolExpr inner) { super(Order.Unary, chStart, chEnd); diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/BoolConditional.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/BoolConditional.java index c9bb2a6..2012022 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/BoolConditional.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/BoolConditional.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.muscript.ast.conditional; +import io.gitlab.jfronny.muscript.ast.bool.Not; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; import io.gitlab.jfronny.muscript.data.Scope; @@ -32,6 +33,7 @@ public class BoolConditional extends BoolExpr { BoolExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; + if (condition instanceof Not not) return new BoolConditional(chStart, chEnd, not.inner, falseExpr, trueExpr); return new BoolConditional(chStart, chEnd, condition, trueExpr, falseExpr); } diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/DynamicConditional.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/DynamicConditional.java index 1740dad..ae57490 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/DynamicConditional.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/DynamicConditional.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.muscript.ast.conditional; +import io.gitlab.jfronny.muscript.ast.bool.Not; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; import io.gitlab.jfronny.muscript.data.Scope; @@ -34,6 +35,7 @@ public class DynamicConditional extends DynamicExpr { DynamicExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; + if (condition instanceof Not not) return new DynamicConditional(chStart, chEnd, not.inner, falseExpr, trueExpr); return new DynamicConditional(chStart, chEnd, condition, trueExpr, falseExpr); } diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/NumberConditional.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/NumberConditional.java index d0b87b0..cab3636 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/NumberConditional.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/NumberConditional.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.muscript.ast.conditional; +import io.gitlab.jfronny.muscript.ast.bool.Not; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; import io.gitlab.jfronny.muscript.data.Scope; @@ -33,6 +34,7 @@ public class NumberConditional extends NumberExpr { NumberExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; + if (condition instanceof Not not) return new NumberConditional(chStart, chEnd, not.inner, falseExpr, trueExpr); return new NumberConditional(chStart, chEnd, condition, trueExpr, falseExpr); } diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/StringConditional.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/StringConditional.java index 5c8ec35..94f057d 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/StringConditional.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/StringConditional.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.muscript.ast.conditional; +import io.gitlab.jfronny.muscript.ast.bool.Not; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; import io.gitlab.jfronny.muscript.data.Scope; @@ -33,6 +34,7 @@ public class StringConditional extends StringExpr { StringExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; + if (condition instanceof Not not) return new StringConditional(chStart, chEnd, not.inner, falseExpr, trueExpr); return new StringConditional(chStart, chEnd, condition, trueExpr, falseExpr); } diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/UnresolvedConditional.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/UnresolvedConditional.java index f882abd..295d148 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/UnresolvedConditional.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/conditional/UnresolvedConditional.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.muscript.ast.conditional; +import io.gitlab.jfronny.muscript.ast.bool.Not; import io.gitlab.jfronny.muscript.compiler.*; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.data.dynamic.DNull; @@ -35,6 +36,7 @@ public class UnresolvedConditional extends DynamicExpr { Expr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr.asDynamicExpr() : falseExpr.asDynamicExpr(); if (trueExpr.equals(falseExpr)) return trueExpr.asDynamicExpr(); + if (condition instanceof Not not) return new UnresolvedConditional(chStart, chEnd, not.inner, falseExpr, trueExpr); return new UnresolvedConditional(chStart, chEnd, condition, trueExpr, falseExpr); }