fork slow part of Thy_Load.body_files only;
authorwenzelm
Fri, 07 Dec 2012 13:56:01 +0100
changeset 50415 0d60de55c58a
parent 50414 e17a1f179bb0
child 50416 2e1b47e22fc6
fork slow part of Thy_Load.body_files only;
src/Pure/Thy/thy_info.scala
src/Pure/Thy/thy_load.scala
--- a/src/Pure/Thy/thy_info.scala	Fri Dec 07 13:38:32 2012 +0100
+++ b/src/Pure/Thy/thy_info.scala	Fri Dec 07 13:56:01 2012 +0100
@@ -84,16 +84,20 @@
         val future_header: JFuture[Exn.Result[Document.Node.Header]] =
           if (files) {
             val string = thy_load.with_thy_text(name, _.toString)
-            default_thread_pool.submit(() =>
-              Exn.capture {
-                try {
-                  val syntax0 = syntax.add_keywords(header0.keywords)
-                  val files = thy_load.theory_body_files(syntax0, string)
-                  header0.copy(uses = header0.uses ::: files.map((_, false)))
+            val syntax0 = syntax.add_keywords(header0.keywords)
+
+            if (thy_load.body_files_test(syntax0, string)) {
+              default_thread_pool.submit(() =>
+                Exn.capture {
+                  try {
+                    val files = thy_load.body_files(syntax0, string)
+                    header0.copy(uses = header0.uses ::: files.map((_, false)))
+                  }
+                  catch { case ERROR(msg) => err(msg) }
                 }
-                catch { case ERROR(msg) => err(msg) }
-              }
-            )
+              )
+            }
+            else Library.future_value(Exn.Res(header0))
           }
           else Library.future_value(Exn.Res(header0))
 
--- a/src/Pure/Thy/thy_load.scala	Fri Dec 07 13:38:32 2012 +0100
+++ b/src/Pure/Thy/thy_load.scala	Fri Dec 07 13:56:01 2012 +0100
@@ -80,27 +80,27 @@
     clean_tokens.reverse.find(_.is_name).map(_.content)
   }
 
-  def theory_body_files(syntax: Outer_Syntax, text: String): List[String] =
+  def body_files_test(syntax: Outer_Syntax, text: String): Boolean =
+    syntax.thy_load_commands.exists({ case (cmd, _) => text.containsSlice(cmd) })
+
+  def body_files(syntax: Outer_Syntax, text: String): List[String] =
   {
     val thy_load_commands = syntax.thy_load_commands
-    if (thy_load_commands.exists({ case (cmd, _) => text.containsSlice(cmd) })) {
-      val spans = Thy_Syntax.parse_spans(syntax.scan(text))
-      spans.iterator.map({
-        case toks @ (tok :: _) if tok.is_command =>
-          thy_load_commands.find({ case (cmd, _) => cmd == tok.content }) match {
-            case Some((_, exts)) =>
-              find_file(toks) match {
-                case Some(file) =>
-                  if (exts.isEmpty) List(file)
-                  else exts.map(ext => file + "." + ext)
-                case None => Nil
-              }
-            case None => Nil
-          }
-        case _ => Nil
-      }).flatten.toList
-    }
-    else Nil
+    val spans = Thy_Syntax.parse_spans(syntax.scan(text))
+    spans.iterator.map({
+      case toks @ (tok :: _) if tok.is_command =>
+        thy_load_commands.find({ case (cmd, _) => cmd == tok.content }) match {
+          case Some((_, exts)) =>
+            find_file(toks) match {
+              case Some(file) =>
+                if (exts.isEmpty) List(file)
+                else exts.map(ext => file + "." + ext)
+              case None => Nil
+            }
+          case None => Nil
+        }
+      case _ => Nil
+    }).flatten.toList
   }
 
   def check_thy_text(name: Document.Node.Name, text: CharSequence): Document.Node.Header =