/** * Hoists a node inside {@link #newGeneratorHoistBlock}. * * @see #newGeneratorHoistBlock */ private void hoistNode(Node node) { newGeneratorHoistBlock.addChildBefore(node, newGeneratorHoistBlock.getLastChild()); }
private void createAndInsertObjectsForQualifiedName(Node scriptChild, String namespace) { List<Node> objectsForQualifiedName = createObjectsForQualifiedName(namespace); for (Node n : objectsForQualifiedName) { scriptChild.getParent().addChildBefore(n, scriptChild); } if (!objectsForQualifiedName.isEmpty()) { compiler.reportChangeToEnclosingScope(scriptChild); } }
private void addImportNode(Node n, Node importNode) { importNode.useSourceInfoFromForTree(n); n.getParent().addChildBefore(importNode, n); nodeComments.moveComment(n, importNode); }
/** Adds a field node before the first method node in classMembers */ void addFieldToClassMembers(Node classMembers, Node field) { for (Node n : classMembers.children()) { if (n.isMemberFunctionDef()) { classMembers.addChildBefore(field, n); return; } } classMembers.addChildToBack(field); }
private List<Node> splitMultipleDeclarations(Node var) { checkState(NodeUtil.isNameDeclaration(var)); List<Node> vars = new ArrayList<>(); JSDocInfo info = var.getJSDocInfo(); while (var.getSecondChild() != null) { Node newVar = new Node(var.getToken(), var.removeFirstChild()); if (info != null) { newVar.setJSDocInfo(info.clone()); } newVar.useSourceInfoFrom(var); var.getParent().addChildBefore(newVar, var); vars.add(newVar); } vars.add(var); return vars; } }
private void addNodeBeforeLoop(Node newNode, Node loopNode) { Node insertSpot = loopNode; while (insertSpot.getParent().isLabel()) { insertSpot = insertSpot.getParent(); } insertSpot.getParent().addChildBefore(newNode, insertSpot); compiler.reportChangeToEnclosingScope(newNode); }
/** Replaces `...[1, 2, 3]` with `1, 2, 3` in an array literal. */ private void inlineSpreadInArrayLit(Node spread) { Node parentArray = spread.getParent(); checkArgument(parentArray.isArrayLit(), "This isn't supported for object spread"); Node childArray = spread.getOnlyChild(); // We can't use `child.getNext()` because the child is being moved. for (Node element = childArray.getFirstChild(); element != null; element = childArray.getFirstChild()) { parentArray.addChildBefore(element.detach(), spread); } spread.detach(); reportChangeToEnclosingScope(parentArray); }
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 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); }
/** Inserts a call to $jscomp.initSymbol() before {@code n}. */ private void initSymbolBefore(Node n) { compiler.ensureLibraryInjected("es6/symbol", false); Node statement = NodeUtil.getEnclosingStatement(n); Node initSymbol = IR.exprResult(IR.call(NodeUtil.newQName(compiler, "$jscomp.initSymbol"))); statement.getParent().addChildBefore(initSymbol.useSourceInfoFromForTree(statement), statement); compiler.reportChangeToEnclosingScope(initSymbol); }
/** * Inserts a call to $jscomp.initSymbol() before {@code n}. */ private void initSymbolBefore(Node n) { compiler.ensureLibraryInjected("es6_runtime", false); Node statement = NodeUtil.getEnclosingStatement(n); Node initSymbol = IR.exprResult(IR.call(NodeUtil.newQName(compiler, "$jscomp.initSymbol"))); statement.getParent().addChildBefore(initSymbol.useSourceInfoFromForTree(statement), statement); compiler.reportCodeChange(); }
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 void visitNamespaceDeclaration(NodeTraversal t, Node n, Node parent) { popNamespace(n, parent); for (Node name = NodeUtil.getRootOfQualifiedName(n.getFirstChild()); name != n; name = name.getParent()) { String fullName = maybePrependCurrNamespace(name.getQualifiedName()); if (!convertedNamespaces.contains(fullName)) { JSDocInfoBuilder doc = JSDocInfoBuilder.maybeCopyFrom(n.getJSDocInfo()); doc.recordConstancy(); Node namespaceDec = NodeUtil.newQNameDeclaration( compiler, fullName, IR.objectlit(), doc.build()).useSourceInfoFromForTree(n); parent.addChildBefore(namespaceDec, n); convertedNamespaces.add(fullName); } } replaceWithNodes(t, n, n.getLastChild().children()); }
@Override public void visit(Node n) { if (n.isReturn() && n.hasOneChild()) { Node result = n.getFirstChild(); boolean keepValue = !isRemovableValue(result); result.detach(); if (keepValue) { n.getParent().addChildBefore(IR.exprResult(result).srcref(result), n); } else { NodeUtil.markFunctionsDeleted(result, compiler); } compiler.reportChangeToEnclosingScope(body); } } },
private void visitNamespaceDeclaration(Node n, Node parent) { popNamespace(n, parent); for (Node name = NodeUtil.getRootOfQualifiedName(n.getFirstChild()); name != n; name = name.getParent()) { String fullName = maybePrependCurrNamespace(name.getQualifiedName()); if (!convertedNamespaces.contains(fullName)) { JSDocInfoBuilder doc = JSDocInfoBuilder.maybeCopyFrom(n.getJSDocInfo()); doc.recordConstancy(); Node namespaceDec = NodeUtil.newQNameDeclaration( compiler, fullName, IR.objectlit(), doc.build()).useSourceInfoFromForTree(n); parent.addChildBefore(namespaceDec, n); convertedNamespaces.add(fullName); } } replaceWithNodes(n, n.getLastChild().children()); }
private void visitGetprop(NodeTraversal t, Node n) { if (!n.matchesQualifiedName("Symbol.iterator")) { return; } if (isGlobalSymbol(t, n.getFirstChild())) { compiler.ensureLibraryInjected("es6_runtime", false); Node statement = NodeUtil.getEnclosingStatement(n); Node init = IR.exprResult(IR.call(NodeUtil.newQName(compiler, "$jscomp.initSymbolIterator"))); statement.getParent().addChildBefore(init.useSourceInfoFromForTree(statement), statement); compiler.reportCodeChange(); } }
private void addInstrumentationBefore(Node node) { Node parent = node.getParent(); if (parent.isVanillaFor()) { } else if (parent.isGetterDef()) { } else if (parent.isSetterDef()) { } else if (parent.isGetProp()) { } else if (parent.isMemberFunctionDef()) { } else if (parent.isExport()) { } else if (parent.isImport()) { } else if (parent.isImportStar()) { } else if (parent.isComputedProp()) { } else { parent.addChildBefore(buildInstrumentationStatement(node.getLineno()), node); } }
private void addInstrumentationBefore(Node node) { Node parent = node.getParent(); if (parent.isVanillaFor()) { } else if (parent.isGetterDef()) { } else if (parent.isSetterDef()) { } else if (parent.isGetProp()) { } else if (parent.isMemberFunctionDef()) { } else if (parent.isExport()) { } else if (parent.isImport()) { } else if (parent.isImportStar()) { } else if (parent.isComputedProp()) { } else { parent.addChildBefore(buildInstrumentationStatement(node.getLineno()), node); } }
private void visitExportFrom(NodeTraversal t, Node export, Node parent) { // export {x, y as z} from 'moduleIdentifier'; Node moduleIdentifier = export.getLastChild(); Node importNode = IR.importNode(IR.empty(), IR.empty(), moduleIdentifier.cloneNode()); importNode.useSourceInfoFrom(export); parent.addChildBefore(importNode, export); visit(t, importNode, parent); String moduleName = getVarNameOfImport(moduleIdentifier.getString()); for (Node exportSpec : export.getFirstChild().children()) { exportedNameToLocalQName.put( exportSpec.getLastChild().getString(), new LocalQName(moduleName + "." + exportSpec.getFirstChild().getString(), exportSpec)); } parent.removeChild(export); t.reportCodeChange(); }
private void extractExtends(NodeTraversal t, Node classNode) { String name = ModuleNames.fileToJsIdentifier(classNode.getStaticSourceFile().getName()) + CLASS_EXTENDS_VAR + classExtendsVarCounter++; Node statement = NodeUtil.getEnclosingStatement(classNode); Node originalExtends = classNode.getSecondChild(); originalExtends.replaceWith(IR.name(name).useSourceInfoFrom(originalExtends)); Node extendsAlias = IR.constNode(IR.name(name), originalExtends) .useSourceInfoIfMissingFromForTree(originalExtends); statement.getParent().addChildBefore(extendsAlias, statement); NodeUtil.addFeatureToScript(NodeUtil.getEnclosingScript(classNode), Feature.CONST_DECLARATIONS); t.reportCodeChange(classNode); }