java-commons/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/string/Concatenate.java

54 lines
2.1 KiB
Java

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);
}
}