package io.gitlab.jfronny.muscript.ast.math; 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.Expr; import io.gitlab.jfronny.muscript.ast.NumberExpr; import io.gitlab.jfronny.muscript.ast.literal.NumberLiteral; import java.io.IOException; public class Multiply extends NumberExpr { public final NumberExpr multiplier; public final NumberExpr multiplicand; public Multiply(int chStart, int chEnd, NumberExpr multiplier, NumberExpr multiplicand) { super(Order.Factor, chStart, chEnd); this.multiplier = multiplier; this.multiplicand = multiplicand; } @Override public Double get(Scope dataRoot) { return multiplier.get(dataRoot) * multiplicand.get(dataRoot); } @Override public NumberExpr optimize() { NumberExpr multiplier = this.multiplier.optimize(); NumberExpr multiplicand = this.multiplicand.optimize(); if (multiplier instanceof NumberLiteral litEr && multiplicand instanceof NumberLiteral litAnd) return Expr.literal(chStart, chEnd, litEr.value * litAnd.value); return new Multiply(chStart, chEnd, multiplier, multiplicand); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(multiplier, writer, false); writer.append(" * "); parenthesize(multiplicand, writer, true); } @Override public boolean equals(Object obj) { return obj instanceof Multiply multiply && multiplier.equals(multiply.multiplier) && multiplicand.equals(multiply.multiplicand); } }