provide session qualifier via resources;
authorwenzelm
Mon, 03 Apr 2017 16:36:45 +0200
changeset 65359 9ca34f0407a9
parent 65358 e345e9420109
child 65360 3ff88fece1f6
provide session qualifier via resources;
src/Pure/PIDE/command.scala
src/Pure/PIDE/resources.scala
src/Pure/Thy/sessions.scala
src/Pure/Thy/thy_info.scala
src/Pure/Tools/build.scala
src/Tools/VSCode/src/document_model.scala
src/Tools/VSCode/src/vscode_resources.scala
src/Tools/jEdit/src/document_model.scala
src/Tools/jEdit/src/jedit_resources.scala
src/Tools/jEdit/src/plugin.scala
--- a/src/Pure/PIDE/command.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Pure/PIDE/command.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -435,7 +435,7 @@
       // inlined errors
       case Thy_Header.THEORY =>
         val reader = Scan.char_reader(Token.implode(span.content))
-        val header = resources.check_thy_reader("", node_name, reader)
+        val header = resources.check_thy_reader(node_name, reader)
         val errors =
           for ((imp, pos) <- header.imports if !can_import(imp)) yield {
             val msg =
--- a/src/Pure/PIDE/resources.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Pure/PIDE/resources.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -13,25 +13,16 @@
 import java.io.{File => JFile}
 
 
-class Resources(val base: Sessions.Base, val log: Logger = No_Logger)
+class Resources(
+  val session_name: String,
+  val base: Sessions.Base,
+  val log: Logger = No_Logger)
 {
   val thy_info = new Thy_Info(this)
 
   def thy_path(path: Path): Path = path.ext("thy")
 
 
-  /* document node names */
-
-  def node_name(qualifier: String, raw_path: Path): Document.Node.Name =
-  {
-    val path = raw_path.expand
-    val node = path.implode
-    val theory = Long_Name.qualify(qualifier, Thy_Header.thy_name(node).getOrElse(""))
-    val master_dir = if (theory == "") "" else path.dir.implode
-    Document.Node.Name(node, master_dir, theory)
-  }
-
-
   /* file-system operations */
 
   def append(dir: String, source_path: Path): String =
@@ -76,10 +67,20 @@
     }
     else Nil
 
-  def import_name(qualifier: String, master: Document.Node.Name, s: String): Document.Node.Name =
+  def init_name(global: Boolean, raw_path: Path): Document.Node.Name =
+  {
+    val path = raw_path.expand
+    val node = path.implode
+    val qualifier = if (global) "" else session_name
+    val theory = Long_Name.qualify(qualifier, Thy_Header.thy_name(node).getOrElse(""))
+    val master_dir = if (theory == "") "" else path.dir.implode
+    Document.Node.Name(node, master_dir, theory)
+  }
+
+  def import_name(master: Document.Node.Name, s: String): Document.Node.Name =
   {
     val thy1 = Thy_Header.base_name(s)
-    val thy2 = if (Long_Name.is_qualified(thy1)) thy1 else Long_Name.qualify(qualifier, thy1)
+    val thy2 = if (Long_Name.is_qualified(thy1)) thy1 else Long_Name.qualify(session_name, thy1)
     (base.known_theories.get(thy1) orElse
      base.known_theories.get(thy2) orElse
      base.known_theories.get(Long_Name.base_name(thy1))) match {
@@ -92,7 +93,7 @@
         else {
           val node = append(master.master_dir, thy_path(path))
           val master_dir = append(master.master_dir, path.dir)
-          Document.Node.Name(node, master_dir, Long_Name.qualify(qualifier, theory))
+          Document.Node.Name(node, master_dir, Long_Name.qualify(session_name, theory))
         }
     }
   }
@@ -106,9 +107,8 @@
     try { f(reader) } finally { reader.close }
   }
 
-  def check_thy_reader(qualifier: String, node_name: Document.Node.Name,
-      reader: Reader[Char], start: Token.Pos = Token.Pos.command, strict: Boolean = true)
-    : Document.Node.Header =
+  def check_thy_reader(node_name: Document.Node.Name, reader: Reader[Char],
+    start: Token.Pos = Token.Pos.command, strict: Boolean = true): Document.Node.Header =
   {
     if (node_name.is_theory && reader.source.length > 0) {
       try {
@@ -122,7 +122,7 @@
             Completion.report_names(pos, 1, List((base_name, ("theory", base_name)))))
 
         val imports =
-          header.imports.map({ case (s, pos) => (import_name(qualifier, node_name, s), pos) })
+          header.imports.map({ case (s, pos) => (import_name(node_name, s), pos) })
         Document.Node.Header(imports, header.keywords, header.abbrevs)
       }
       catch { case exn: Throwable => Document.Node.bad_header(Exn.message(exn)) }
@@ -130,18 +130,18 @@
     else Document.Node.no_header
   }
 
-  def check_thy(qualifier: String, name: Document.Node.Name,
-      start: Token.Pos = Token.Pos.command, strict: Boolean = true): Document.Node.Header =
-    with_thy_reader(name, check_thy_reader(qualifier, name, _, start, strict))
+  def check_thy(name: Document.Node.Name, start: Token.Pos = Token.Pos.command,
+      strict: Boolean = true): Document.Node.Header =
+    with_thy_reader(name, check_thy_reader(name, _, start, strict))
 
 
   /* special header */
 
   def special_header(name: Document.Node.Name): Option[Document.Node.Header] =
     if (Thy_Header.is_ml_root(name.theory))
-      Some(Document.Node.Header(List((import_name("", name, Thy_Header.ML_BOOTSTRAP), Position.none))))
+      Some(Document.Node.Header(List((import_name(name, Thy_Header.ML_BOOTSTRAP), Position.none))))
     else if (Thy_Header.is_bootstrap(name.theory))
-      Some(Document.Node.Header(List((import_name("", name, Thy_Header.PURE), Position.none))))
+      Some(Document.Node.Header(List((import_name(name, Thy_Header.PURE), Position.none))))
     else None
 
 
--- a/src/Pure/Thy/sessions.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Pure/Thy/sessions.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -71,12 +71,12 @@
           if (progress.stopped) throw Exn.Interrupt()
 
           try {
-            val resources =
-              new Resources(
-                info.parent match {
-                  case None => Base.bootstrap
-                  case Some(parent) => deps(parent)
-                })
+            val parent_base =
+              info.parent match {
+                case None => Base.bootstrap
+                case Some(parent) => deps(parent)
+              }
+            val resources = new Resources(name, parent_base)
 
             if (verbose || list_files) {
               val groups =
@@ -91,10 +91,9 @@
                 info.theories.flatMap({
                   case (global, _, thys) =>
                     thys.map(thy =>
-                      (resources.node_name(
-                        if (global) "" else name, info.dir + resources.thy_path(thy)), info.pos))
+                      (resources.init_name(global, info.dir + resources.thy_path(thy)), info.pos))
                 })
-              val thy_deps = resources.thy_info.dependencies(name, root_theories)
+              val thy_deps = resources.thy_info.dependencies(root_theories)
 
               thy_deps.errors match {
                 case Nil => thy_deps
@@ -103,7 +102,7 @@
             }
 
             val known_theories =
-              (resources.base.known_theories /: thy_deps.deps)({ case (known, dep) =>
+              (parent_base.known_theories /: thy_deps.deps)({ case (known, dep) =>
                 val name = dep.name
                 known.get(name.theory) match {
                   case Some(name1) if name != name1 =>
@@ -142,7 +141,7 @@
 
             val session_graph =
               Present.session_graph(info.parent getOrElse "",
-                resources.base.loaded_theories, thy_deps.deps)
+                parent_base.loaded_theories, thy_deps.deps)
 
             val base =
               Base(loaded_theories, known_theories, keywords, syntax, sources, session_graph)
--- a/src/Pure/Thy/thy_info.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Pure/Thy/thy_info.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -104,12 +104,12 @@
     override def toString: String = deps.toString
   }
 
-  private def require_thys(session: String, initiators: List[Document.Node.Name],
-      required: Dependencies, thys: List[(Document.Node.Name, Position.T)]): Dependencies =
-    (required /: thys)(require_thy(session, initiators, _, _))
+  private def require_thys(initiators: List[Document.Node.Name], required: Dependencies,
+      thys: List[(Document.Node.Name, Position.T)]): Dependencies =
+    (required /: thys)(require_thy(initiators, _, _))
 
-  private def require_thy(session: String, initiators: List[Document.Node.Name],
-      required: Dependencies, thy: (Document.Node.Name, Position.T)): Dependencies =
+  private def require_thy(initiators: List[Document.Node.Name], required: Dependencies,
+    thy: (Document.Node.Name, Position.T)): Dependencies =
   {
     val (name, require_pos) = thy
 
@@ -123,10 +123,9 @@
       try {
         if (initiators.contains(name)) error(cycle_msg(initiators))
         val header =
-          try { resources.check_thy(session, name, Token.Pos.file(name.node)).cat_errors(message) }
+          try { resources.check_thy(name, Token.Pos.file(name.node)).cat_errors(message) }
           catch { case ERROR(msg) => cat_error(msg, message) }
-        Thy_Info.Dep(name, header) ::
-          require_thys(session, name :: initiators, required1, header.imports)
+        Thy_Info.Dep(name, header) :: require_thys(name :: initiators, required1, header.imports)
       }
       catch {
         case e: Throwable =>
@@ -135,6 +134,6 @@
     }
   }
 
-  def dependencies(session: String, thys: List[(Document.Node.Name, Position.T)]): Dependencies =
-    require_thys(session, Nil, Dependencies.empty, thys)
+  def dependencies(thys: List[(Document.Node.Name, Position.T)]): Dependencies =
+    require_thys(Nil, Dependencies.empty, thys)
 }
--- a/src/Pure/Tools/build.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Pure/Tools/build.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -220,7 +220,7 @@
             ML_Syntax.print_string0(File.platform_path(output))
 
         if (pide && !Sessions.pure_name(name)) {
-          val resources = new Resources(deps(parent))
+          val resources = new Resources(name, deps(parent))
           val session = new Session(options, resources)
           val handler = new Handler(progress, session, name)
           session.init_protocol_handler(handler)
--- a/src/Tools/VSCode/src/document_model.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Tools/VSCode/src/document_model.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -73,7 +73,7 @@
 
   def node_header: Document.Node.Header =
     resources.special_header(node_name) getOrElse
-      resources.check_thy_reader("", node_name, Scan.char_reader(content.text))
+      resources.check_thy_reader(node_name, Scan.char_reader(content.text))
 
 
   /* perspective */
--- a/src/Tools/VSCode/src/vscode_resources.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Tools/VSCode/src/vscode_resources.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -42,7 +42,7 @@
 class VSCode_Resources(
   val options: Options,
   base: Sessions.Base,
-  log: Logger = No_Logger) extends Resources(base, log)
+  log: Logger = No_Logger) extends Resources(session_name = "", base, log)
 {
   private val state = Synchronized(VSCode_Resources.State())
 
@@ -165,7 +165,7 @@
           (for ((_, model) <- st.models.iterator if model.is_theory)
            yield (model.node_name, Position.none)).toList
 
-        val thy_files = thy_info.dependencies("", thys).deps.map(_.name)
+        val thy_files = thy_info.dependencies(thys).deps.map(_.name)
 
 
         /* auxiliary files */
--- a/src/Tools/jEdit/src/document_model.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Tools/jEdit/src/document_model.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -235,7 +235,7 @@
               val pending_nodes = for ((node_name, None) <- purged) yield node_name
               (open_nodes ::: touched_nodes ::: pending_nodes).map((_, Position.none))
             }
-            val retain = PIDE.resources.thy_info.dependencies("", imports).deps.map(_.name).toSet
+            val retain = PIDE.resources.thy_info.dependencies(imports).deps.map(_.name).toSet
 
             for ((node_name, Some(edits)) <- purged; if !retain(node_name); edit <- edits)
               yield edit
@@ -331,7 +331,7 @@
 
   def node_header: Document.Node.Header =
     PIDE.resources.special_header(node_name) getOrElse
-      PIDE.resources.check_thy_reader("", node_name, Scan.char_reader(content.text), strict = false)
+      PIDE.resources.check_thy_reader(node_name, Scan.char_reader(content.text), strict = false)
 
 
   /* content */
@@ -396,8 +396,7 @@
 
     PIDE.resources.special_header(node_name) getOrElse
       JEdit_Lib.buffer_lock(buffer) {
-        PIDE.resources.check_thy_reader(
-          "", node_name, JEdit_Lib.buffer_reader(buffer), strict = false)
+        PIDE.resources.check_thy_reader(node_name, JEdit_Lib.buffer_reader(buffer), strict = false)
       }
   }
 
--- a/src/Tools/jEdit/src/jedit_resources.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Tools/jEdit/src/jedit_resources.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -21,7 +21,7 @@
 import org.gjt.sp.jedit.bufferio.BufferIORequest
 
 
-class JEdit_Resources(base: Sessions.Base) extends Resources(base)
+class JEdit_Resources(base: Sessions.Base) extends Resources(session_name = "", base)
 {
   /* document node name */
 
--- a/src/Tools/jEdit/src/plugin.scala	Mon Apr 03 14:29:44 2017 +0200
+++ b/src/Tools/jEdit/src/plugin.scala	Mon Apr 03 16:36:45 2017 +0200
@@ -135,7 +135,7 @@
           val thys =
             (for ((node_name, model) <- models.iterator if model.is_theory)
               yield (node_name, Position.none)).toList
-          val thy_files = resources.thy_info.dependencies("", thys).deps.map(_.name)
+          val thy_files = resources.thy_info.dependencies(thys).deps.map(_.name)
 
           val aux_files =
             if (options.bool("jedit_auto_resolve")) {