/**
 * 
 */
package codemining.js.codeutils;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.eclipse.wst.jsdt.core.dom.ASTNode;
import org.eclipse.wst.jsdt.core.dom.ASTVisitor;
import org.eclipse.wst.jsdt.core.dom.FunctionDeclaration;
import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;

import com.google.common.collect.Maps;

/**
 * A utility class that retrieves the methods (as AST Nodes) of a file.
 * 
 * @author Miltos Allamanis
 * 
 */
public final class FunctionRetriever extends ASTVisitor {

	public static Map<String, FunctionDeclaration> getFunctionNodes(
			final File file) throws IOException {
		final JavascriptASTExtractor astExtractor = new JavascriptASTExtractor(
				false);
		final FunctionRetriever m = new FunctionRetriever();
		final JavaScriptUnit cu = astExtractor.getAST(file);
		cu.accept(m);
		return m.functions;
	}

	public static Map<String, FunctionDeclaration> getFunctionNodes(
			final String file) throws Exception {
		final JavascriptASTExtractor astExtractor = new JavascriptASTExtractor(
				false);
		final FunctionRetriever m = new FunctionRetriever();
		final ASTNode cu = astExtractor.getCompilationUnitAstNode(file);
		cu.accept(m);
		return m.functions;
	}

	private final Map<String, FunctionDeclaration> functions = Maps
			.newTreeMap();

	private FunctionRetriever() {

	}

	@Override
	public boolean visit(final FunctionDeclaration node) {
		functions.put(node.getName().toString(), node);
		return super.visit(node);
	}

}