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