in intellij-plugin-verifier/verifier-intellij/src/main/java/com/jetbrains/pluginverifier/analysis/ClassReachabilityAnalysis.kt [59:91]
fun isClassReachableFromMark(className: ClassName, mark: ReachabilityMark): Boolean {
val visitedClasses = hashSetOf<ClassName>()
val stack = LinkedList<ClassName>()
val way = LinkedList<ClassName>()
stack += className
while (stack.isNotEmpty()) {
val currentClass = stack.peekFirst()
if (!visitedClasses.add(currentClass)) {
//Second time visiting the same node => all node's children are visited => poll from the queue.
stack.pollFirst()
way.pollLast()
continue
}
way.addLast(currentClass)
val referencingTypes = graph.getEdgesTo(currentClass)
for (typeName in referencingTypes) {
if (classMarks[typeName]?.contains(mark) == true) {
//Mark all the classes on the way as memoization.
for (name in way) {
markClass(name, mark)
}
return true
}
if (typeName !in visitedClasses) {
stack.addFirst(typeName)
}
}
}
return false
}