package io.gitlab.jfronny.muscript.ast.string; 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.StringExpr; import io.gitlab.jfronny.muscript.ast.literal.StringLiteral; import java.io.IOException; public class Concatenate extends StringExpr { private final StringExpr left; private final StringExpr right; public Concatenate(int chStart, int chEnd, StringExpr left, StringExpr right) { super(Order.Concat, chStart, chEnd); this.left = left; this.right = right; } @Override public String get(Scope dataRoot) { return left.get(dataRoot) + right.get(dataRoot); } @Override public StringExpr optimize() { StringExpr left = this.left.optimize(); StringExpr right = this.right.optimize(); if (left instanceof StringLiteral litL && right instanceof StringLiteral litR) return Expr.literal(chStart, chEnd, litL.value + litR.value); if (right instanceof StringLiteral litR && left instanceof Concatenate concatenate && concatenate.right instanceof StringLiteral litL) { return new Concatenate(chStart, chEnd, concatenate.left, Expr.literal(concatenate.chStart, concatenate.chEnd, litL.value + litR.value)); } if (left instanceof StringLiteral litL && right instanceof Concatenate concatenate && concatenate.left instanceof StringLiteral litR) { return new Concatenate(chStart, chEnd, Expr.literal(concatenate.chStart, concatenate.chEnd, litL.value + litR.value), concatenate.right); } return new Concatenate(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 Concatenate concatenate && left.equals(concatenate.left) && right.equals(concatenate.right); } }