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.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.ast.BoolExpr; import io.gitlab.jfronny.muscript.ast.DynamicExpr; import io.gitlab.jfronny.muscript.ast.literal.BoolLiteral; import java.io.IOException; public class DynamicConditional extends DynamicExpr { public final BoolExpr condition; public final DynamicExpr trueExpr; public final DynamicExpr falseExpr; public DynamicConditional(int chStart, int chEnd, BoolExpr condition, DynamicExpr trueExpr, DynamicExpr falseExpr) { super(Order.Conditional, chStart, chEnd); this.condition = condition; this.trueExpr = trueExpr; this.falseExpr = falseExpr; } @Override public Dynamic get(Scope dataRoot) { return condition.get(dataRoot) ? trueExpr.get(dataRoot) : falseExpr.get(dataRoot); } @Override public DynamicExpr optimize() { BoolExpr condition = this.condition.optimize(); DynamicExpr trueExpr = this.trueExpr.optimize(); DynamicExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; return new DynamicConditional(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 DynamicConditional conditional && condition.equals(conditional.condition) && trueExpr.equals(conditional.trueExpr) && falseExpr.equals(conditional.falseExpr); } }