public void visit(NodeTraversal t, Node n, Node parent) { if (n.getType() != Token.FUNCTION) { return; } int id = functionNames.getFunctionId(n); if (id < 0) { // Function node was added during compilation; don't instrument. return; } if (reportFunctionName.length() != 0) { Node body = n.getFirstChild().getNext().getNext(); Node call = new Node( Token.CALL, Node.newString(Token.NAME, reportFunctionName), Node.newNumber(id)); Node expr = new Node(Token.EXPR_RESULT, call); body.addChildToFront(expr); compiler.reportCodeChange(); } if (reportFunctionExitName.length() != 0) { Node body = n.getFirstChild().getNext().getNext(); (new InstrumentReturns(id)).process(body); } if (definedFunctionName.length() != 0) { Node call = new Node( Token.CALL, Node.newString(Token.NAME, definedFunctionName), Node.newNumber(id)); Node expr = NodeUtil.newExpr(call); Node addingRoot = null; if (NodeUtil.isFunctionDeclaration(n)) { JSModule module = t.getModule(); addingRoot = compiler.getNodeForCodeInsertion(module); addingRoot.addChildToFront(expr); } else { Node beforeChild = n; for (Node ancestor : n.getAncestors()) { int type = ancestor.getType(); if (type == Token.BLOCK || type == Token.SCRIPT) { addingRoot = ancestor; break; } beforeChild = ancestor; } addingRoot.addChildBefore(expr, beforeChild); } compiler.reportCodeChange(); } }
private Node createTemplateParameterNode(int index, JSType type) { Preconditions.checkState(index >= 0); Preconditions.checkNotNull(type); Node n = Node.newNumber(index); n.setType(TEMPLATE_TYPE_PARAM); n.setJSType(type); return n; }
/** Applies optimizations to all previously marked nodes. */ public void applyChanges() { for (Node n : toRemove) { n.getParent().removeChild(n); compiler.reportCodeChange(); } for (Node n : toReplaceWithZero) { n.getParent().replaceChild(n, Node.newNumber(0).copyInformationFrom(n)); compiler.reportCodeChange(); } }
@SuppressWarnings("unchecked") public void testParse() { Node a = Node.newString(Token.NAME, "a"); a.addChildToFront(Node.newString(Token.NAME, "b")); List<ParserResult> testCases = ImmutableList.of( new ParserResult("3;", createScript(new Node(Token.EXPR_RESULT, Node.newNumber(3.0)))), new ParserResult("var a = b;", createScript(new Node(Token.VAR, a))), new ParserResult( "\"hell\\\no\\ world\\\n\\\n!\"", createScript( new Node(Token.EXPR_RESULT, Node.newString(Token.STRING, "hello world!"))))); for (ParserResult testCase : testCases) { assertNodeEquality(testCase.node, parse(testCase.code)); } }
private Node createTemplateLocalNameNode(int index) { Preconditions.checkState(index >= 0); Node n = Node.newNumber(index); n.setType(TEMPLATE_LOCAL_NAME); return n; }
/* (non-Javadoc) * @see com.google.javascript.jscomp.fuzzing.AbstractFuzzer#generate(int) */ @Override protected Node generate(int budget, Set<Type> types) { return Node.newNumber(context.random.nextInt(getOwnConfig().get("max").getAsInt())); }
private Node newReportFunctionExitNode() { return new Node( Token.CALL, Node.newString(Token.NAME, reportFunctionExitName), Node.newNumber(functionId)); }