/** * Create and return a new array declaration node. The array name is * generated based on the source filename, and declaration is of the form: * "var arrayNameUsedInFile = [];" */ private Node newArrayDeclarationNode(NodeTraversal traversal) { return IR.var( IR.name(createArrayName(traversal)), IR.arraylit()); }
/** * Create and return a new array declaration node. The array name is * generated based on the source filename, and declaration is of the form: * "var arrayNameUsedInFile = [];" */ private Node newArrayDeclarationNode(NodeTraversal traversal) { return IR.var( IR.name(createArrayName(traversal)), IR.arraylit()); }
private Node newArrayDeclarationNode(NodeTraversal traversal) { return IR.var(IR.name(createArrayName(traversal)), IR.arraylit()); }
/** * Create a VAR node containing the given lhs (name or destructuring pattern) and * initial value expression. */ static Node newVarNode(Node lhs, Node value) { if (lhs.isDestructuringPattern()) { checkNotNull(value); return IR.var(new Node(Token.DESTRUCTURING_LHS, lhs, value).srcref(lhs)).srcref(lhs); } else { checkState(lhs.isName() && !lhs.hasChildren()); if (value != null) { lhs.addChildToBack(value); } return IR.var(lhs).srcref(lhs); } }
/** * Create a VAR node containing the given name and initial value expression. */ static Node newVarNode(String name, Node value) { Node nodeName = IR.name(name); if (value != null) { Preconditions.checkState(value.getNext() == null); nodeName.addChildToBack(value); nodeName.srcref(value); } Node var = IR.var(nodeName).srcref(nodeName); return var; }
@Override public void process(Node externs, Node root) { NodeTraversal.traverseEs6(compiler, root, this); for (Entry<JSModule, List<Node>> entry : Multimaps.asMap(functions).entrySet()) { Node addingRoot = compiler.getNodeForCodeInsertion(entry.getKey()); for (Node n : Lists.reverse(entry.getValue())) { Node nameNode = n.getFirstChild(); String name = nameNode.getString(); nameNode.setString(""); addingRoot.addChildToFront( IR.var(IR.name(name), n).useSourceInfoIfMissingFromForTree(n)); } } }
@Override public void process(Node externs, Node root) { addExternDeclaration(externs, IR.var( IR.name(SimpleDefinitionFinder.EXTERN_OBJECT_PROPERTY_STRING))); NodeTraversal.traverseEs6(compiler, root, new Callback()); }
private void addExternForGlobalSymbolNamespace() { Node varNode = IR.var(IR.name(globalSymbolNamespace)); CompilerInput input = compiler.getSynthesizedExternsInput(); input.getAstRoot(compiler).addChildToBack(varNode); compiler.reportChangeToEnclosingScope(varNode); }
private void addExternForGlobalSymbolNamespace() { Node varNode = IR.var(IR.name(globalSymbolNamespace)); CompilerInput input = compiler.getSynthesizedExternsInput(); input.getAstRoot(compiler).addChildrenToBack(varNode); compiler.reportCodeChange(); }
/** * Replaces reference to <code>arguments</code> with <code>$jscomp$generator$arguments * </code>. */ void visitArguments(Node n) { Node newArguments = context.getScopedName(GENERATOR_ARGUMENTS).useSourceInfoFrom(n); n.replaceWith(newArguments); if (!argumentsReferenceFound) { Node var = IR.var(newArguments.cloneNode(), n).useSourceInfoFrom(newGeneratorHoistBlock); hoistNode(var); argumentsReferenceFound = true; } }
/** Replaces reference to <code>this</code> with <code>$jscomp$generator$this</code>. */ void visitThis(Node n) { Node newThis = withType(context.getScopedName(GENERATOR_THIS), n.getJSType()); n.replaceWith(newThis); if (!thisReferenceFound) { Node var = IR.var(newThis.cloneNode().useSourceInfoFrom(n), n) .useSourceInfoFrom(newGeneratorHoistBlock); hoistNode(var); thisReferenceFound = true; } }
private boolean eliminateParamsAfter(Node fnNode, Node argNode) { if (argNode != null) { // Keep the args in the same order, do the last first. eliminateParamsAfter(fnNode, argNode.getNext()); argNode.detachFromParent(); Node var = IR.var(argNode).useSourceInfoIfMissingFrom(argNode); fnNode.getLastChild().addChildrenToFront(var); compiler.reportCodeChange(); return true; } return false; }
private void maybeSplitMultiVar(Node rhsNode) { Node statementNode = rhsNode.getGrandparent(); if (!statementNode.isVar() || !statementNode.hasMoreThanOneChild()) { return; } Node nameNode = rhsNode.getParent(); nameNode.detach(); rhsNode.detach(); statementNode.getParent().addChildBefore(IR.var(nameNode, rhsNode), statementNode); }
/** * Adds back declarations for variables that do not cross module boundaries. * Must be called after RemoveGlobalVarCallback. */ void declareModuleGlobals() { for (ModuleGlobal global : preDeclarations) { if (global.root.getFirstChild() != null && global.root.getFirstChild().isVar()) { global.root.getFirstChild().addChildToBack(global.name); } else { global.root.addChildToFront(IR.var(global.name).srcref(global.name)); } compiler.reportChangeToEnclosingScope(global.root); } }
private void maybeSplitMultiVar(Node rhsNode) { Node statementNode = rhsNode.getParent().getParent(); if (!statementNode.isVar() || !statementNode.hasMoreThanOneChild()) { return; } Node nameNode = rhsNode.getParent(); nameNode.detachFromParent(); rhsNode.detachFromParent(); statementNode.getParent().addChildBefore(IR.var(nameNode, rhsNode), statementNode); }
private static void handleDeclarationList(Node declarationList, Node parent) { // Normalize: "const i = 0, j = 0;" becomes "/** @const */ var i = 0; /** @const */ var j = 0;" while (declarationList.hasMoreThanOneChild()) { Node name = declarationList.getLastChild(); Node newDeclaration = IR.var(name.detachFromParent()).useSourceInfoFrom(declarationList); maybeAddConstJSDoc(declarationList, parent, name, newDeclaration); parent.addChildAfter(newDeclaration, declarationList); } maybeAddConstJSDoc(declarationList, parent, declarationList.getFirstChild(), declarationList); declarationList.setType(Token.VAR); }
private void handleDeclarationList(Node declarationList, Node parent) { // Normalize: "const i = 0, j = 0;" becomes "/** @const */ var i = 0; /** @const */ var j = 0;" while (declarationList.hasMoreThanOneChild()) { Node name = declarationList.getLastChild(); Node newDeclaration = IR.var(name.detach()).useSourceInfoFrom(declarationList); maybeAddConstJSDoc(declarationList, parent, name, newDeclaration); parent.addChildAfter(newDeclaration, declarationList); compiler.reportChangeToEnclosingScope(parent); } maybeAddConstJSDoc(declarationList, parent, declarationList.getFirstChild(), declarationList); declarationList.setToken(Token.VAR); }
private void addExtern() { Node name = IR.name(PROTECTOR_FN); name.putBooleanProp(Node.IS_CONSTANT_NAME, true); Node var = IR.var(name); JSDocInfoBuilder builder = new JSDocInfoBuilder(false); var.setJSDocInfo(builder.build()); CompilerInput input = compiler.getSynthesizedExternsInput(); Node root = input.getAstRoot(compiler); name.setStaticSourceFileFrom(root); var.setStaticSourceFileFrom(root); root.addChildToBack(var); compiler.reportChangeToEnclosingScope(var); }
private void visitYieldExpr(Node n, Node parent) { Node enclosingStatement = NodeUtil.getEnclosingStatement(n); Node yieldStatement = IR.exprResult(n.hasChildren() ? IR.yield(n.removeFirstChild()) : IR.yield()); Node yieldResult = IR.name(GENERATOR_NEXT_ARG + generatorCounter.get()); Node yieldResultDecl = IR.var(yieldResult.cloneTree(), IR.name(GENERATOR_NEXT_ARG)); parent.replaceChild(n, yieldResult); enclosingStatement.getParent().addChildBefore(yieldStatement, enclosingStatement); enclosingStatement.getParent().addChildBefore(yieldResultDecl, enclosingStatement); visitYieldThrows(yieldStatement, yieldStatement.getParent()); compiler.reportCodeChange(); }
private void addExtern() { Node name = IR.name(PROTECTOR_FN); name.putBooleanProp(Node.IS_CONSTANT_NAME, true); Node var = IR.var(name); // Add "@noalias" so we can strip the method when AliasExternals is enabled. JSDocInfoBuilder builder = new JSDocInfoBuilder(false); builder.recordNoAlias(); var.setJSDocInfo(builder.build()); CompilerInput input = compiler.getSynthesizedExternsInput(); name.setStaticSourceFile(input.getSourceFile()); var.setStaticSourceFile(input.getSourceFile()); input.getAstRoot(compiler).addChildrenToBack(var); compiler.reportCodeChange(); }