package io.gitlab.jfronny.muscript.ast.compare; import io.gitlab.jfronny.muscript.ast.BoolExpr; import io.gitlab.jfronny.muscript.ast.Expr; 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 java.io.IOException; import java.util.Objects; public class Equal extends BoolExpr { public final Expr left; public final Expr right; public Equal(int chStart, int chEnd, Expr left, Expr right) { super(Order.Equality, chStart, chEnd); this.left = left; this.right = right; } @Override public Boolean get(Scope dataRoot) { return Objects.equals(unwrap(left.get(dataRoot)), unwrap(right.get(dataRoot))); } private Object unwrap(Object o) { if (o instanceof Dynamic a) return unwrap(a.getValue()); return o; } @Override public BoolExpr optimize() { Expr left = this.left.optimize(); Expr right = this.right.optimize(); if (left.equals(right)) return Expr.literal(chStart, chEnd, true); return new Equal(chStart, chEnd, left, right); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(left, writer, false); writer.append(" == "); parenthesize(right, writer, true); } @Override public boolean equals(Object obj) { return obj instanceof Equal equal && left.equals(equal.left) && right.equals(equal.right); } }