--- a/src/Pure/System/isabelle_system.scala Thu Aug 27 12:43:06 2020 +0200
+++ b/src/Pure/System/isabelle_system.scala Thu Aug 27 12:51:57 2020 +0200
@@ -64,18 +64,8 @@
}
def make_services[C](c: Class[C]): List[C] =
- {
- @tailrec def is_subclass(c1: Class[_]): Boolean =
- {
- c1 == c ||
- {
- val c2 = c1.getSuperclass
- c2 != null && is_subclass(c2)
- }
- }
- for { c1 <- services() if is_subclass(c1) }
+ for { c1 <- services() if Library.is_subclass(c1, c) }
yield c1.getDeclaredConstructor().newInstance().asInstanceOf[C]
- }
def init(isabelle_root: String = "", cygwin_root: String = ""): Unit = synchronized
{
--- a/src/Pure/library.scala Thu Aug 27 12:43:06 2020 +0200
+++ b/src/Pure/library.scala Thu Aug 27 12:51:57 2020 +0200
@@ -276,4 +276,20 @@
def proper_list[A](list: List[A]): Option[List[A]] =
if (list == null || list.isEmpty) None else Some(list)
+
+
+ /* reflection */
+
+ def is_subclass[A, B](a: Class[A], b: Class[B]): Boolean =
+ {
+ @tailrec def subclass(c: Class[_]): Boolean =
+ {
+ c == b ||
+ {
+ val d = c.getSuperclass
+ d != null && subclass(d)
+ }
+ }
+ subclass(a)
+ }
}