package com.drawbridge.jsengine.ast;
import java.util.LinkedList;
import com.drawbridge.jsengine.JsEngine;
import com.drawbridge.jsengine.Scope;
import com.drawbridge.jsengine.SymbolTableEntry;
import com.drawbridge.jsengine.jsobjects.JSFunction;
import com.drawbridge.jsengine.jsobjects.JSType;
import com.drawbridge.vl.blocks.Block;
import com.drawbridge.vl.blocks.BlockFunctionDefinition;
import com.google.caja.parser.js.FunctionConstructor;
import com.google.caja.parser.js.FunctionDeclaration;
public class FunctionDeclarationEvaluator extends Evaluator
{
FunctionConstructor fc;
//As far as we know, this just consists of a FunctionConstructor
public FunctionDeclarationEvaluator(Evaluator parent, Scope scope, FunctionDeclaration functionDeclaration) {
super(parent, scope, functionDeclaration.getFilePosition());
fc = (FunctionConstructor) functionDeclaration.children().get(1);
this.mChildren.add(Evaluator.getEvaluator(this, scope, fc));
}
@Override
public JSType evaluate() throws EvaluatorException
{
mScope.declareVariable(null, fc.getIdentifierName(),
new SymbolTableEntry(new JSFunction((FunctionConstructorEvaluator) Evaluator.getEvaluator(this, new Scope(JsEngine.getInstance(), mScope), fc))));
return null;
}
@Override
public LinkedList<com.drawbridge.vl.blocks.Block> getBlocks()
{
LinkedList<Block> result = new LinkedList<Block>();
result.add(new BlockFunctionDefinition(fc.getFilePosition(), this, fc.getIdentifierName()));
LinkedList<Block> subresults = mChildren.get(0).getBlocks();
if(subresults != null)
result.addAll(subresults);
return result;
}
}