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; } }