code: private static void addAfter(Node originalLvalue, Node newLvalue, Node newRvalue) {
      Node parent = originalLvalue.getParent();
      if (parent.isAssign()) {
        // create `(<originalLvalue = ...>, <newLvalue = newRvalue>)`
        Node newAssign = IR.assign(newLvalue, newRvalue).srcref(parent);
        Node newComma = new Node(Token.COMMA, newAssign);
        parent.replaceWith(newComma);
        newComma.addChildToFront(parent);
        return;
      }
      // This must have been in a var/let/const.
      if (newLvalue.isDestructuringPattern()) {
        newLvalue = new Node(Token.DESTRUCTURING_LHS, newLvalue, newRvalue).srcref(parent);
      } else {
        newLvalue.addChildToBack(newRvalue);
      }
      Node declaration = parent.isDestructuringLhs() ? originalLvalue.getGrandparent() : parent;
      checkState(NodeUtil.isNameDeclaration(declaration), declaration);
      if (NodeUtil.isStatementParent(declaration.getParent())) {
        // `const {} = originalRvalue; const newLvalue = newRvalue;`
        // create an entirely new statement
        Node newDeclaration = new Node(declaration.getToken()).srcref(declaration);
        newDeclaration.addChildToBack(newLvalue);
        declaration.getParent().addChildAfter(newDeclaration, declaration);
      } else {
        // `const {} = originalRvalue, newLvalue = newRvalue;`
        // The Normalize pass tries to ensure name declarations are always in statement blocks, but
        // currently has not implemented normalization for `for (let x = 0; ...`
        // so we can't add a new statement
        declaration.addChildToBack(newLvalue);
      }
    }
docs: Adds the new assign or name declaration after the original assign or name declaration