private synchronized void doRemove(@NotNull InspectionTreeNode node, @Nullable InspectionTreeNode skip) {
    for (InspectionTreeNode child : getChildren(node)) {
      doRemove(child, skip);
    }
    if (node != skip) {
      InspectionTreeNode parent = getParent(node);
      if (parent != null) {
        InspectionTreeNode.Children parentChildren = parent.myChildren;
        assert parentChildren != null;
        parentChildren.myChildren = ArrayUtil.remove(parentChildren.myChildren, node);
        parentChildren.myUserObject2Node.removeValue(node);
      }
    }
  }
private synchronized void doRemove(@NotNull InspectionTreeNode node, @Nullable InspectionTreeNode skip)