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;
}