docs: public ClassInfoList intersect(final ClassInfoList... others) {
          // Put the first ClassInfoList that is not being sorted by name at the head of the list,
          // so that its order is preserved in the intersection (#238)
          final ArrayDeque<ClassInfoList> intersectionOrder = new ArrayDeque<>();
          intersectionOrder.add(this);
          boolean foundFirst = false;
          for (final ClassInfoList other : others) {
              if (other.sortByName) {
                  intersectionOrder.add(other);
              } else if (!foundFirst) {
                  foundFirst = true;
                  intersectionOrder.push(other);
              } else {
                  intersectionOrder.add(other);
              }
          }
          final ClassInfoList first = intersectionOrder.remove();
          final Set<ClassInfo> reachableClassesIntersection = new LinkedHashSet<>(first);
          while (!intersectionOrder.isEmpty()) {
              reachableClassesIntersection.retainAll(intersectionOrder.remove());
          }
          final Set<ClassInfo> directlyRelatedClassesIntersection = new LinkedHashSet<>(directlyRelatedClasses);
          for (final ClassInfoList other : others) {
              directlyRelatedClassesIntersection.retainAll(other.directlyRelatedClasses);
          }
          return new ClassInfoList(reachableClassesIntersection, directlyRelatedClassesIntersection,
                  first.sortByName);
      }