59 lines
2.2 KiB
Java
59 lines
2.2 KiB
Java
package io.gitlab.jfronny.muscript.ast.string;
|
|
|
|
import io.gitlab.jfronny.muscript.compiler.*;
|
|
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;
|
|
import java.util.stream.Stream;
|
|
|
|
public class Concatenate extends StringExpr {
|
|
public final StringExpr left;
|
|
public final StringExpr right;
|
|
|
|
public Concatenate(CodeLocation location, StringExpr left, StringExpr right) {
|
|
super(Order.Concat, location);
|
|
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 literal(location, litL.value + litR.value);
|
|
if (right instanceof StringLiteral litR && left instanceof Concatenate concatenate && concatenate.right instanceof StringLiteral litL) {
|
|
return new Concatenate(location, concatenate.left, literal(concatenate.location, litL.value + litR.value));
|
|
}
|
|
if (left instanceof StringLiteral litL && right instanceof Concatenate concatenate && concatenate.left instanceof StringLiteral litR) {
|
|
return new Concatenate(location, literal(concatenate.location, litL.value + litR.value), concatenate.right);
|
|
}
|
|
return new Concatenate(location, left, right);
|
|
}
|
|
|
|
@Override
|
|
public Stream<Expr<?>> extractSideEffects() {
|
|
return Stream.concat(left.extractSideEffects(), right.extractSideEffects());
|
|
}
|
|
|
|
@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);
|
|
}
|
|
}
|