package io.gitlab.jfronny.muscript.ast.conditional; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.ast.BoolExpr; import io.gitlab.jfronny.muscript.ast.literal.BoolLiteral; import java.io.IOException; public class BoolConditional extends BoolExpr { public final BoolExpr condition; public final BoolExpr trueExpr; public final BoolExpr falseExpr; public BoolConditional(int chStart, int chEnd, BoolExpr condition, BoolExpr trueExpr, BoolExpr falseExpr) { super(Order.Conditional, chStart, chEnd); this.condition = condition; this.trueExpr = trueExpr; this.falseExpr = falseExpr; } @Override public Boolean get(Scope dataRoot) { return condition.get(dataRoot) ? trueExpr.get(dataRoot) : falseExpr.get(dataRoot); } @Override public BoolExpr optimize() { BoolExpr condition = this.condition.optimize(); BoolExpr trueExpr = this.trueExpr.optimize(); BoolExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; return new BoolConditional(chStart, chEnd, condition, trueExpr, falseExpr); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(condition, writer, true); writer.append(" ? "); trueExpr.decompile(writer); writer.append(" : "); falseExpr.decompile(writer); } @Override public boolean equals(Object obj) { return obj instanceof BoolConditional conditional && condition.equals(conditional.condition) && trueExpr.equals(conditional.trueExpr) && falseExpr.equals(conditional.falseExpr); } }