code: public SortedSet<TypeElement> allSubClasses(TypeElement typeElement, boolean isEnum) {
          // new entries added to the set are searched as well, this is
          // really a work queue.
          List<TypeElement> list = new ArrayList<>(directSubClasses(typeElement, isEnum));
          for (int i = 0; i < list.size(); i++) {
              TypeElement te = list.get(i);
              SortedSet<TypeElement> tset = directSubClasses0(te, isEnum);
              for (TypeElement tte : tset) {
                  if (!list.contains(tte)) {
                      list.add(tte);
                  }
              }
          }
          SortedSet<TypeElement> out = new TreeSet<>(comparator);
          out.addAll(list);
          return out;
      }
docs: Return a set of all direct or indirect, sub-classes and subInterfaces
  of the TypeElement argument.
  
  @param typeElement TypeElement whose sub-classes or sub-interfaces are requested.
  @param isEnum true if the subClasses should be forced to come from the
  enum tree.