fun isClassReachableFromMark()

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
  }