private def concreteSubclasses()

in plugins/src/main/scala/org/apache/toree/plugins/PluginSearcher.scala [102:126]


  private def concreteSubclasses(
    ancestor: String,
    classes: Map[String, ClassInfo],
    extraClasses: Map[String, ClassInfo]
  ): Iterator[ClassInfo] = {
    @tailrec def classMatches(
      classesToCheck: Seq[ClassInfo]
    ): Boolean = {
      if (classesToCheck.isEmpty) false
      else if (classesToCheck.exists(_.name == ancestor)) true
      else if (classesToCheck.exists(_.superClassName == ancestor)) true
      else if (classesToCheck.exists(_ implements ancestor)) true
      else {
        val superClasses = classesToCheck.map(_.superClassName)
          .flatMap(n => classes.get(n).orElse(extraClasses.get(n)))
        val interfaces = classesToCheck.flatMap(_.interfaces)
          .flatMap(i => classes.get(i).orElse(extraClasses.get(i)))
        classMatches(superClasses ++ interfaces)
      }
    }

    classes.values.toIterator
      .filter(_.isConcrete)
      .filter(c => classMatches(Seq(c)))
  }