src/Pure/Thy/thy_info.scala
changeset 48872 6124e0d1120a
parent 48871 c82720f054c3
child 48873 18b17f15bc62
--- a/src/Pure/Thy/thy_info.scala	Tue Aug 21 13:29:34 2012 +0200
+++ b/src/Pure/Thy/thy_info.scala	Tue Aug 21 14:54:29 2012 +0200
@@ -25,20 +25,47 @@
   /* dependencies */
 
   type Dep = (Document.Node.Name, Document.Node.Header)
-  private sealed case class Required(
-    deps: List[Dep] = Nil,
-    seen: Set[Document.Node.Name] = Set.empty)
+
+  object Dependencies
+  {
+    val empty = new Dependencies(Nil, Set.empty)
+  }
+
+  final class Dependencies private(
+    rev_deps: List[Dep],
+    val seen: Set[Document.Node.Name])
   {
-    def :: (dep: Dep): Required = copy(deps = dep :: deps)
-    def + (name: Document.Node.Name): Required = copy(seen = seen + name)
+    def :: (dep: Dep): Dependencies = new Dependencies(dep :: rev_deps, seen)
+    def + (name: Document.Node.Name): Dependencies = new Dependencies(rev_deps, seen = seen + name)
+
+    def deps: List[Dep] = rev_deps.reverse
+
+    def thy_load_commands: List[String] =
+      (for ((_, h) <- rev_deps; (cmd, Some(((Keyword.THY_LOAD, _), _))) <- h.keywords) yield cmd) :::
+        thy_load.base_syntax.thy_load_commands
+
+    def loaded_theories: Set[String] =
+      (thy_load.loaded_theories /: rev_deps) { case (loaded, (name, _)) => loaded + name.theory }
+
+    def syntax: Outer_Syntax =
+      (thy_load.base_syntax /: rev_deps) { case (syn, (name, h)) =>
+        val syn1 = syn.add_keywords(h)
+        // FIXME avoid hardwired stuff!?
+        // FIXME broken?!
+        if (name.theory == "Pure")
+          syn1 +
+            ("hence", (Keyword.PRF_ASM_GOAL, Nil), "then have") +
+            ("thus", (Keyword.PRF_ASM_GOAL, Nil), "then show")
+        else syn1
+      }
   }
 
   private def require_thys(initiators: List[Document.Node.Name],
-      required: Required, names: List[Document.Node.Name]): Required =
+      required: Dependencies, names: List[Document.Node.Name]): Dependencies =
     (required /: names)(require_thy(initiators, _, _))
 
   private def require_thy(initiators: List[Document.Node.Name],
-      required: Required, name: Document.Node.Name): Required =
+      required: Dependencies, name: Document.Node.Name): Dependencies =
   {
     if (required.seen(name)) required
     else if (thy_load.loaded_theories(name.theory)) required + name
@@ -61,6 +88,6 @@
     }
   }
 
-  def dependencies(names: List[Document.Node.Name]): List[Dep] =
-    require_thys(Nil, Required(), names).deps.reverse
+  def dependencies(names: List[Document.Node.Name]): Dependencies =
+    require_thys(Nil, Dependencies.empty, names)
 }