package com.drawbridge.jsengine.ast;
import java.util.LinkedList;
import com.drawbridge.jsengine.Scope;
import com.drawbridge.jsengine.SymbolTable.SymbolTableException;
import com.drawbridge.jsengine.jsobjects.ExecutionException;
import com.drawbridge.jsengine.jsobjects.JSType;
import com.drawbridge.utils.Utils;
import com.drawbridge.vl.blocks.BlockAssignment;
import com.google.caja.parser.js.AssignOperation;
import com.google.caja.parser.js.Reference;
public class AssignOperationEvaluator extends Evaluator
{
public Reference ref;
public AssignOperation mAssignOperation;
public AssignOperationEvaluator(Evaluator parent, Scope scope, AssignOperation assignOperation) {
super(parent, scope, assignOperation.getFilePosition());
mAssignOperation = assignOperation;
if (assignOperation.children().get(0) instanceof Reference)
{
ref = (Reference) assignOperation.children().get(0);
Utils.out.println(assignOperation.children().get(1));
mChildren.add(Evaluator.getEvaluator(this, scope, assignOperation.children().get(1)));
for (int i = 1; i < assignOperation.children().size(); i++)
{
Utils.out.println("Assign Operation: " + assignOperation.children().get(i).getClass().getName());
}
}
}
@Override
public JSType evaluate() throws EvaluatorException, ExecutionException
{
if (mChildren != null && mChildren.size() > 0 && mChildren.get(0) != null)
{
try
{
mScope.getSymbolTable().update(ref.getIdentifierName(), mChildren.get(0).evaluate());
} catch (SymbolTableException e)
{
throw new EvaluatorException("AssignOperationEvaluator exception: " + e.getMessage());
}
}
return null;
}
@Override
public LinkedList<com.drawbridge.vl.blocks.Block> getBlocks()
{
LinkedList<com.drawbridge.vl.blocks.Block> results = new LinkedList<com.drawbridge.vl.blocks.Block>();
if (ref != null)
{
ReferenceEvaluator refEval = (ReferenceEvaluator) Evaluator.getEvaluator(this, mScope, ref);
results.addAll(refEval.getBlocks());
results.add(new BlockAssignment(getFilePosition(), this));
results.addAll(mChildren.get(0).getBlocks());
}
return results;
}
@Override
public boolean compare(Evaluator e)
{
if (!e.getClass().equals(getClass()))
return false;
if (mChildren.size() != e.mChildren.size())
return false;
for (int i = 0; i < mChildren.size(); i++)
{
if (!mChildren.get(i).compare(e.mChildren.get(i)))
return false;
}
if (e.getFilePosition().equals(getFilePosition()))
return true;
else
return false;
}
}