use of com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback in project closure-compiler by google.
the class VariableVisibilityAnalysisTest method searchForFunction.
/*
* Finds a function node with the given name in the source AST.
*
* Behavior is undefined if there are multiple functions with
* parameterName.
*/
private Node searchForFunction(final String functionName) {
checkArgument(functionName != null);
final Node[] foundNode = new Node[1];
AbstractPostOrderCallback findFunction = new AbstractPostOrderCallback() {
@Override
public void visit(NodeTraversal t, Node n, Node parent) {
if (n.isFunction() && functionName.equals(NodeUtil.getName(n))) {
foundNode[0] = n;
}
}
};
NodeTraversal.traverseEs6(getLastCompiler(), getLastCompiler().jsRoot, findFunction);
return foundNode[0];
}
use of com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback in project closure-compiler by google.
the class NormalizeTest method findNodesWithProperty.
private Set<Node> findNodesWithProperty(Node root, final byte prop) {
final Set<Node> set = new HashSet<>();
NodeTraversal.traverseEs6(getLastCompiler(), root, new AbstractPostOrderCallback() {
@Override
public void visit(NodeTraversal t, Node node, Node parent) {
if (node.getBooleanProp(prop)) {
set.add(node);
}
}
});
return set;
}
use of com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback in project closure-compiler by google.
the class DataFlowAnalysis method computeEscaped.
/**
* Compute set of escaped variables. When a variable is escaped in a dataflow analysis, it can be
* referenced outside of the code that we are analyzing. A variable is escaped if any of the
* following is true:
*
* <p>1. Exported variables as they can be needed after the script terminates. 2. Names of named
* functions because in JavaScript, function foo(){} does not kill foo in the dataflow.
*
* @param jsScope Must be a function scope
*/
static void computeEscaped(final Scope jsScope, final Set<Var> escaped, AbstractCompiler compiler, ScopeCreator scopeCreator, Map<String, Var> allVarsInFn) {
checkArgument(jsScope.isFunctionScope());
AbstractPostOrderCallback finder = new AbstractPostOrderCallback() {
@Override
public void visit(NodeTraversal t, Node n, Node parent) {
Node enclosingBlock = NodeUtil.getEnclosingFunction(n);
if (jsScope.getRootNode() == enclosingBlock || !n.isName() || parent.isFunction()) {
return;
}
String name = n.getString();
Var var = t.getScope().getVar(name);
if (var != null) {
Node enclosingScopeNode = NodeUtil.getEnclosingFunction(var.getNode());
if (enclosingScopeNode == jsScope.getRootNode()) {
escaped.add(var);
}
}
}
};
NodeTraversal.builder().setCompiler(compiler).setCallback(finder).setScopeCreator(scopeCreator).traverseAtScope(jsScope);
// the catch check is causing breakages however
for (Var var : allVarsInFn.values()) {
if (var.getParentNode().isCatch() || compiler.getCodingConvention().isExported(var.getName())) {
escaped.add(var);
}
}
}
use of com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback in project closure-compiler by google.
the class J2clConstantHoisterPass method process.
@Override
public void process(Node externs, Node root) {
if (!J2clSourceFileChecker.shouldRunJ2clPasses(compiler)) {
return;
}
final Multimap<String, Node> fieldAssignments = ArrayListMultimap.create();
final Set<Node> hoistableFunctions = new HashSet<>();
NodeTraversal.traverseEs6(compiler, root, new AbstractPostOrderCallback() {
@Override
public void visit(NodeTraversal t, Node node, Node parent) {
// DefinitionUseSiteFinder instead.
if (parent != null && NodeUtil.isLValue(node)) {
fieldAssignments.put(node.getQualifiedName(), parent);
}
// TODO(stalcup): convert to a persistent index of hoistable functions.
if (isHoistableFunction(t, node)) {
hoistableFunctions.add(node);
}
}
});
for (Collection<Node> assignments : fieldAssignments.asMap().values()) {
maybeHoistClassField(assignments, hoistableFunctions);
}
}
use of com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback in project closure-compiler by google.
the class VariableVisibilityAnalysisTest method searchForParameter.
/*
* Finds a parameter NAME node with the given name in the source AST.
*
* Behavior is undefined if there are multiple parameters with
* parameterName.
*/
private Node searchForParameter(final String parameterName) {
checkArgument(parameterName != null);
final Node[] foundNode = new Node[1];
AbstractPostOrderCallback findParameter = new AbstractPostOrderCallback() {
@Override
public void visit(NodeTraversal t, Node n, Node parent) {
if (n.getParent().isParamList() && parameterName.equals(n.getString())) {
foundNode[0] = n;
}
}
};
NodeTraversal.traverseEs6(getLastCompiler(), getLastCompiler().jsRoot, findParameter);
return foundNode[0];
}
Aggregations