clarified modules;
authorwenzelm
Thu, 27 Aug 2020 12:51:57 +0200
changeset 72214 5924c1da3c45
parent 72213 6157757bb133
child 72215 8f9cffa78112
clarified modules;
src/Pure/System/isabelle_system.scala
src/Pure/library.scala
--- 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)
+  }
 }