2023-01-20 18:52:57 +01:00
|
|
|
package io.gitlab.jfronny.muscript.ast.string;
|
2022-06-03 19:54:31 +02:00
|
|
|
|
2023-03-12 15:28:44 +01:00
|
|
|
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
|
|
|
|
import io.gitlab.jfronny.muscript.compiler.Order;
|
2023-01-20 21:05:04 +01:00
|
|
|
import io.gitlab.jfronny.muscript.data.Scope;
|
2023-01-20 18:52:57 +01:00
|
|
|
import io.gitlab.jfronny.muscript.ast.Expr;
|
|
|
|
import io.gitlab.jfronny.muscript.ast.StringExpr;
|
|
|
|
import io.gitlab.jfronny.muscript.ast.literal.StringLiteral;
|
2022-06-03 19:54:31 +02:00
|
|
|
|
2023-03-12 15:28:44 +01:00
|
|
|
import java.io.IOException;
|
|
|
|
|
2022-06-07 13:36:48 +02:00
|
|
|
public class Concatenate extends StringExpr {
|
2022-06-03 19:54:31 +02:00
|
|
|
private final StringExpr left;
|
|
|
|
private final StringExpr right;
|
|
|
|
|
2023-01-20 17:47:41 +01:00
|
|
|
public Concatenate(int chStart, int chEnd, StringExpr left, StringExpr right) {
|
2023-03-12 15:28:44 +01:00
|
|
|
super(Order.Concat, chStart, chEnd);
|
2022-06-03 19:54:31 +02:00
|
|
|
this.left = left;
|
|
|
|
this.right = right;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2023-01-20 21:05:04 +01:00
|
|
|
public String get(Scope dataRoot) {
|
2022-06-13 13:31:54 +02:00
|
|
|
return left.get(dataRoot) + right.get(dataRoot);
|
2022-06-03 19:54:31 +02:00
|
|
|
}
|
2022-06-29 17:38:05 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public StringExpr optimize() {
|
|
|
|
StringExpr left = this.left.optimize();
|
|
|
|
StringExpr right = this.right.optimize();
|
2022-11-24 19:05:51 +01:00
|
|
|
if (left instanceof StringLiteral litL && right instanceof StringLiteral litR)
|
2023-01-20 17:47:41 +01:00
|
|
|
return Expr.literal(chStart, chEnd, litL.value + litR.value);
|
2022-06-29 17:38:05 +02:00
|
|
|
if (right instanceof StringLiteral litR && left instanceof Concatenate concatenate && concatenate.right instanceof StringLiteral litL) {
|
2023-01-20 17:47:41 +01:00
|
|
|
return new Concatenate(chStart, chEnd, concatenate.left, Expr.literal(concatenate.chStart, concatenate.chEnd, litL.value + litR.value));
|
2022-06-29 17:38:05 +02:00
|
|
|
}
|
|
|
|
if (left instanceof StringLiteral litL && right instanceof Concatenate concatenate && concatenate.left instanceof StringLiteral litR) {
|
2023-01-20 17:47:41 +01:00
|
|
|
return new Concatenate(chStart, chEnd, Expr.literal(concatenate.chStart, concatenate.chEnd, litL.value + litR.value), concatenate.right);
|
2022-06-29 17:38:05 +02:00
|
|
|
}
|
2023-01-20 17:47:41 +01:00
|
|
|
return new Concatenate(chStart, chEnd, left, right);
|
2022-06-29 17:38:05 +02:00
|
|
|
}
|
|
|
|
|
2023-03-12 15:28:44 +01:00
|
|
|
@Override
|
|
|
|
public void decompile(ExprWriter writer) throws IOException {
|
|
|
|
parenthesize(left, writer, false);
|
|
|
|
writer.append(" || ");
|
|
|
|
parenthesize(right, writer, true);
|
|
|
|
}
|
|
|
|
|
2022-06-29 17:38:05 +02:00
|
|
|
@Override
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
return obj instanceof Concatenate concatenate && left.equals(concatenate.left) && right.equals(concatenate.right);
|
|
|
|
}
|
2022-06-03 19:54:31 +02:00
|
|
|
}
|