58 lines
2.2 KiB
Java
58 lines
2.2 KiB
Java
package io.gitlab.jfronny.muscript.ast.dynamic;
|
|
|
|
import io.gitlab.jfronny.muscript.ast.DynamicExpr;
|
|
import io.gitlab.jfronny.muscript.ast.literal.DynamicLiteral;
|
|
import io.gitlab.jfronny.muscript.compiler.*;
|
|
import io.gitlab.jfronny.muscript.data.Scope;
|
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
|
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal;
|
|
|
|
import java.io.IOException;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.Map;
|
|
|
|
public class ObjectLiteral extends DynamicExpr {
|
|
private final Map<String, DynamicExpr> content;
|
|
|
|
public ObjectLiteral(int chStart, int chEnd, Map<String, DynamicExpr> content) {
|
|
super(Order.Primary, chStart, chEnd);
|
|
this.content = content;
|
|
}
|
|
|
|
@Override
|
|
public Dynamic<?> get(Scope dataRoot) {
|
|
Map<String, Dynamic<?>> result = new LinkedHashMap<>();
|
|
this.content.forEach((k, v) -> result.put(k, v.get(dataRoot)));
|
|
return DFinal.of(result);
|
|
}
|
|
|
|
@Override
|
|
public DynamicExpr optimize() {
|
|
Map<String, DynamicExpr> content = new LinkedHashMap<>();
|
|
Map<String, Dynamic<?>> literalContent = new LinkedHashMap<>();
|
|
boolean literal = true;
|
|
for (Map.Entry<String, DynamicExpr> entry : this.content.entrySet()) {
|
|
DynamicExpr de = entry.getValue().optimize();
|
|
if (de instanceof DynamicLiteral<?> dl && literal) literalContent.put(entry.getKey(), dl.value);
|
|
else literal = false;
|
|
content.put(entry.getKey(), de);
|
|
}
|
|
if (literal) return new DynamicLiteral<>(chStart, chEnd, DFinal.of(literalContent));
|
|
return new ObjectLiteral(chStart, chEnd, content);
|
|
}
|
|
|
|
@Override
|
|
public void decompile(ExprWriter writer) throws IOException {
|
|
writer.increaseIndent().append("{\n");
|
|
boolean first = true;
|
|
for (Map.Entry<String, DynamicExpr> entry : content.entrySet()) {
|
|
if (!Lexer.isValidId(entry.getKey())) throw new IllegalStateException("Illegal key: " + entry.getKey());
|
|
if (!first) writer.append(",\n");
|
|
first = false;
|
|
writer.append(entry.getKey()).append(" = ");
|
|
entry.getValue().decompile(writer);
|
|
}
|
|
writer.decreaseIndent().append("\n}");
|
|
}
|
|
}
|