Search in sources :

Example 1 with AbstractPostOrderCallback

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];
}
Also used : Node(com.google.javascript.rhino.Node) AbstractPostOrderCallback(com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback)

Example 2 with AbstractPostOrderCallback

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;
}
Also used : Node(com.google.javascript.rhino.Node) AbstractPostOrderCallback(com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback) HashSet(java.util.HashSet)

Example 3 with AbstractPostOrderCallback

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);
        }
    }
}
Also used : DiGraphNode(com.google.javascript.jscomp.graph.DiGraph.DiGraphNode) Node(com.google.javascript.rhino.Node) AbstractPostOrderCallback(com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback)

Example 4 with AbstractPostOrderCallback

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);
    }
}
Also used : Node(com.google.javascript.rhino.Node) AbstractPostOrderCallback(com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback) HashSet(java.util.HashSet)

Example 5 with AbstractPostOrderCallback

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];
}
Also used : Node(com.google.javascript.rhino.Node) AbstractPostOrderCallback(com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback)

Aggregations

AbstractPostOrderCallback (com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback)8 Node (com.google.javascript.rhino.Node)8 DiGraphNode (com.google.javascript.jscomp.graph.DiGraph.DiGraphNode)2 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 ArrayList (java.util.ArrayList)1 IdentityHashMap (java.util.IdentityHashMap)1 LinkedHashMap (java.util.LinkedHashMap)1