// TODO(jannewger): this method doesn't seem to be correct: the list of references isn't cloned
  // so the clone as well as the original COperandTreeNode refer to the same list of references.
  // Also, it is a mutable field which means that changes in the original instance are reflected to
  // the clone, and vice versa. The same holds true for TypeSubstitutions: we should discuss whether
  // this is desired behavior. It clearly breaks the strict "clone contract".
  public COperandTreeNode cloneNode() {
    final COperandTreeNode clonedNode =
        new COperandTreeNode(
            id,
            expressionType,
            expressionValue,
            replacement == null ? null : replacement.cloneReplacement(),
            references,
            provider);

    for (final COperandTreeNode child : children) {
      COperandTreeNode.link(clonedNode, child.cloneNode());
    }

    return clonedNode;
  }
 /**
  * Links two operand tree nodes.
  *
  * @param parent The parent node.
  * @param child The child node that is added to the parent.
  */
 public static void link(final COperandTreeNode parent, final COperandTreeNode child) {
   Preconditions.checkNotNull(child, "IE00218: Child argument can not be null");
   Preconditions.checkNotNull(parent, "IE00217: Parent argument can not be null");
   parent.children.add(child);
   child.parent = parent;
 }