54 lines
2.1 KiB
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);
|
|
}
|
|
}
|