package io.gitlab.jfronny.muscript.ast.dynamic; import io.gitlab.jfronny.muscript.ast.DynamicExpr; 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.error.LocationalException; import java.io.IOException; public class Assign extends DynamicExpr { private final String name; private final DynamicExpr value; public Assign(int chStart, int chEnd, String name, DynamicExpr value) { super(Order.Primary, chStart, chEnd); if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'"); this.name = name; this.value = value; } @Override public Dynamic get(Scope dataRoot) { Dynamic data = value.get(dataRoot); dataRoot.set(name, data); return data; } @Override public DynamicExpr optimize() { return new Assign(chStart, chEnd, name, value.optimize()); } @Override public void decompile(ExprWriter writer) throws IOException { if (!Lexer.isValidId(name)) throw new IllegalArgumentException("Not a valid variable name: " + name); writer.append(name).append(" = "); value.decompile(writer); } @Override public boolean equals(Object obj) { return obj instanceof Assign assign && name.equals(assign.name) && value.equals(assign.value); } }