muScript: optimize ternary on not

This commit is contained in:
Johannes Frohnmeyer 2023-03-13 14:04:20 +01:00
parent ca3c897693
commit c9eb4bf8d3
Signed by: Johannes
GPG Key ID: E76429612C2929F4
6 changed files with 11 additions and 1 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}