package openmods.calc.parsing; import com.google.common.collect.Lists; import java.util.List; import openmods.calc.Environment; import openmods.calc.ExecutableList; import openmods.calc.Frame; import openmods.calc.IExecutable; import openmods.calc.Value; public class ConstantSymbolStateTransition<E> extends SameStateSymbolTransition<E> { private final String selfSymbol; private final Environment<E> env; public ConstantSymbolStateTransition(ICompilerState<E> parentState, Environment<E> env, String selfSymbol) { super(parentState); this.env = env; this.selfSymbol = selfSymbol; } private class ConstantsNode extends SymbolCallNode<E> { public ConstantsNode(List<IExprNode<E>> constants) { super(selfSymbol, constants); } @Override public void flatten(List<IExecutable<E>> output) { final List<IExecutable<E>> ops = Lists.newArrayList(); for (IExprNode<E> child : getChildren()) child.flatten(ops); final Frame<E> resultFrame = env.executeIsolated(ExecutableList.wrap(ops)); for (E constant : resultFrame.stack()) output.add(Value.create(constant)); } } @Override public IExprNode<E> createRootNode(List<IExprNode<E>> children) { return new ConstantsNode(children); } }