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 content; public ObjectLiteral(int chStart, int chEnd, Map content) { super(Order.Primary, chStart, chEnd); this.content = content; } @Override public Dynamic get(Scope dataRoot) { Map> result = new LinkedHashMap<>(); this.content.forEach((k, v) -> result.put(k, v.get(dataRoot))); return DFinal.of(result); } @Override public DynamicExpr optimize() { Map content = new LinkedHashMap<>(); Map> literalContent = new LinkedHashMap<>(); boolean literal = true; for (Map.Entry 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 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}"); } }