docs: public void traverseSupertypes(ClassDescriptor start, InheritanceGraphVisitor visitor) throws ClassNotFoundException {
          LinkedList<SupertypeTraversalPath> workList = new LinkedList<>();
  
          ClassVertex startVertex = resolveClassVertex(start);
          workList.addLast(new SupertypeTraversalPath(startVertex));
  
          while (!workList.isEmpty()) {
              SupertypeTraversalPath cur = workList.removeFirst();
  
              ClassVertex vertex = cur.getNext();
              assert !cur.hasBeenSeen(vertex.getClassDescriptor());
              cur.markSeen(vertex.getClassDescriptor());
  
              if (!visitor.visitClass(vertex.getClassDescriptor(), vertex.getXClass())) {
                  // Visitor doesn't want to continue on this path
                  continue;
              }
  
              if (!vertex.isResolved()) {
                  // Unknown class - so, we don't know its immediate supertypes
                  continue;
              }
  
              // Advance to direct superclass
              ClassDescriptor superclassDescriptor = vertex.getXClass().getSuperclassDescriptor();
              if (superclassDescriptor != null && traverseEdge(vertex, superclassDescriptor, false, visitor)) {
                  addToWorkList(workList, cur, superclassDescriptor);
              }
  
              // Advance to directly-implemented interfaces
              for (ClassDescriptor ifaceDesc : vertex.getXClass().getInterfaceDescriptorList()) {
                  if (traverseEdge(vertex, ifaceDesc, true, visitor)) {
                      addToWorkList(workList, cur, ifaceDesc);
                  }
              }
          }
      }