static Set reachableFrom()

in core/src/main/java/com/spotify/missinglink/ConflictChecker.java [245:291]


  static Set<TypeDescriptor> reachableFrom(
      Collection<DeclaredClass> values, Map<ClassTypeDescriptor, DeclaredClass> knownClasses) {

    Queue<DeclaredClass> toCheck = new LinkedList<>(values);

    Set<TypeDescriptor> reachable = new HashSet<>();

    while (!toCheck.isEmpty()) {
      DeclaredClass current = toCheck.remove();

      if (!reachable.add(current.className())) {
        continue;
      }

      toCheck.addAll(
          current.parents().stream()
              .map(knownClasses::get)
              .filter(declaredClass -> declaredClass != null)
              .collect(toList()));

      toCheck.addAll(
          current.loadedClasses().stream()
              .map(knownClasses::get)
              .filter(declaredClass -> declaredClass != null)
              .collect(toList()));

      toCheck.addAll(
          current.methods().values().stream()
              .flatMap(declaredMethod -> declaredMethod.methodCalls().stream())
              .map(CalledMethod::owner)
              .filter(typeDescriptor -> !reachable.contains(typeDescriptor))
              .map(knownClasses::get)
              .filter(declaredClass -> declaredClass != null)
              .collect(toList()));

      toCheck.addAll(
          current.methods().values().stream()
              .flatMap(declaredMethod -> declaredMethod.fieldAccesses().stream())
              .map(AccessedField::owner)
              .filter(typeDescriptor -> !reachable.contains(typeDescriptor))
              .map(knownClasses::get)
              .filter(declaredClass -> declaredClass != null)
              .collect(toList()));
    }

    return reachable;
  }