clarified signature selection: SortedSet[String], which fits better to stored json and works properly on Windows (NB: document theories have an authentic session-theory name);
authorwenzelm
Sun, 05 Feb 2023 15:59:18 +0100
changeset 77197 a541da01ba67
parent 77196 3d709d300d0f
child 77198 9b35c1171d9a
clarified signature selection: SortedSet[String], which fits better to stored json and works properly on Windows (NB: document theories have an authentic session-theory name);
src/Pure/PIDE/document.scala
src/Pure/PIDE/document_editor.scala
src/Pure/PIDE/editor.scala
src/Pure/Thy/document_build.scala
src/Tools/jEdit/src/theories_status.scala
--- a/src/Pure/PIDE/document.scala	Sun Feb 05 15:01:49 2023 +0100
+++ b/src/Pure/PIDE/document.scala	Sun Feb 05 15:59:18 2023 +0100
@@ -592,6 +592,12 @@
     def node_consolidated(name: Node.Name): Boolean =
       state.node_consolidated(version, name)
 
+    def theory_consolidated(theory: String): Boolean =
+      version.nodes.theory_name(theory) match {
+        case Some(name) => node_consolidated(name)
+        case None => false
+      }
+
 
     /* pending edits */
 
--- a/src/Pure/PIDE/document_editor.scala	Sun Feb 05 15:01:49 2023 +0100
+++ b/src/Pure/PIDE/document_editor.scala	Sun Feb 05 15:59:18 2023 +0100
@@ -7,6 +7,9 @@
 package isabelle
 
 
+import scala.collection.immutable.SortedSet
+
+
 object Document_Editor {
   /* document output */
 
@@ -26,7 +29,7 @@
           pdf <- JSON.string(json, "pdf")
         } yield {
           Meta_Data(name,
-            selection,
+            SortedSet.from(selection),
             SHA1.fake_digest(sources),
             SHA1.fake_digest(log),
             SHA1.fake_digest(pdf))
@@ -36,13 +39,13 @@
     }
 
     def write(
-      selection: Set[Document.Node.Name],
+      selection: SortedSet[String],
       doc: Document_Build.Document_Output,
       name: String = document_name
     ): Unit = {
       val json =
         JSON.Object(
-          "selection" -> selection.toList.map(_.theory).sorted,
+          "selection" -> selection.toList,
           "sources" -> doc.sources.toString,
           "log" -> SHA1.digest(doc.log).toString,
           "pdf" -> SHA1.digest(doc.pdf).toString)
@@ -52,7 +55,7 @@
 
   sealed case class Meta_Data(
     name: String,
-    selection: List[String],
+    selection: SortedSet[String],
     sources: SHA1.Digest,
     log: SHA1.Digest,
     pdf: SHA1.Digest
@@ -67,7 +70,7 @@
   }
 
   def write_document(
-    selection: Set[Document.Node.Name],
+    selection: SortedSet[String],
     doc: Document_Build.Document_Output,
     name: String = document_name
   ): Unit = {
@@ -87,7 +90,7 @@
 
   sealed case class Session(
     background: Option[Sessions.Background],
-    selection: Set[Document.Node.Name],
+    selection: SortedSet[String],
     snapshot: Option[Document.Snapshot]
   ) {
     def is_vacuous: Boolean = background.isEmpty
@@ -101,7 +104,7 @@
 
   sealed case class State(
     session_background: Option[Sessions.Background] = None,
-    selection: Set[Document.Node.Name] = Set.empty,
+    selection: SortedSet[String] = SortedSet.empty,
     views: Set[AnyRef] = Set.empty,
   ) {
     def is_active: Boolean = session_background.isDefined && views.nonEmpty
@@ -116,15 +119,15 @@
       if (is_active) all_document_theories else Nil
 
     def select(
-      names: Iterable[Document.Node.Name],
+      theories: Iterable[String],
       set: Boolean = false,
       toggle: Boolean = false
     ): State = {
       copy(selection =
-        names.foldLeft(selection) {
-          case (sel, name) =>
-            val b = if (toggle) !selection(name) else set
-            if (b) sel + name else sel - name
+        theories.foldLeft(selection) {
+          case (sel, theory) =>
+            val b = if (toggle) !selection(theory) else set
+            if (b) sel + theory else sel - theory
         })
     }
 
@@ -137,9 +140,9 @@
         if (background.isEmpty) None
         else {
           val snapshot = pide_session.snapshot()
-          def document_ready(name: Document.Node.Name): Boolean =
-            pide_session.resources.session_base.loaded_theory(name) ||
-            snapshot.node_consolidated(name)
+          def document_ready(theory: String): Boolean =
+            pide_session.resources.session_base.loaded_theory(theory) ||
+            snapshot.theory_consolidated(theory)
           if (snapshot.is_outdated || !selection.forall(document_ready)) None
           else Some(snapshot)
         }
--- a/src/Pure/PIDE/editor.scala	Sun Feb 05 15:01:49 2023 +0100
+++ b/src/Pure/PIDE/editor.scala	Sun Feb 05 15:59:18 2023 +0100
@@ -46,7 +46,7 @@
       for {
         a <- st.all_document_theories
         b = session.resources.migrate_name(a)
-        if st.selection(b)
+        if st.selection(b.theory)
       } yield b
     }
     else Nil
@@ -55,29 +55,27 @@
   def document_node_required(name: Document.Node.Name): Boolean = {
     val st = document_state()
     st.is_active &&
-    st.selection.contains(name) &&
-    st.all_document_theories.exists(a => session.resources.migrate_name(a) == name)
+    st.selection.contains(name.theory) &&
+    st.all_document_theories.exists(a => a.theory == name.theory)
   }
 
   def document_theories(): List[Document.Node.Name] =
     document_state().active_document_theories.map(session.resources.migrate_name)
 
-  def document_selection(): Set[Document.Node.Name] = document_state().selection
+  def document_selection(): Set[String] = document_state().selection
 
   def document_setup(background: Option[Sessions.Background]): Unit =
     document_state_change(_.copy(session_background = background))
 
   def document_select(
-    names: Iterable[Document.Node.Name],
+    theories: Iterable[String],
     set: Boolean = false,
     toggle: Boolean = false
-  ): Unit = document_state_change(_.select(names, set = set, toggle = toggle))
+  ): Unit = document_state_change(_.select(theories, set = set, toggle = toggle))
 
   def document_select_all(set: Boolean = false): Unit =
-    document_state_change { st =>
-      val domain = st.active_document_theories.map(session.resources.migrate_name)
-      st.select(domain, set = set)
-    }
+    document_state_change(st =>
+      st.select(st.active_document_theories.map(_.theory), set = set))
 
   def document_init(id: AnyRef): Unit = document_state_change(_.register_view(id))
   def document_exit(id: AnyRef): Unit = document_state_change(_.unregister_view(id))
--- a/src/Pure/Thy/document_build.scala	Sun Feb 05 15:01:49 2023 +0100
+++ b/src/Pure/Thy/document_build.scala	Sun Feb 05 15:59:18 2023 +0100
@@ -159,14 +159,14 @@
   def context(
     session_context: Export.Session_Context,
     document_session: Option[Sessions.Base] = None,
-    document_selection: Document.Node.Name => Boolean = _ => true,
+    document_selection: String => Boolean = _ => true,
     progress: Progress = new Progress
   ): Context = new Context(session_context, document_session, document_selection, progress)
 
   final class Context private[Document_Build](
     val session_context: Export.Session_Context,
     document_session: Option[Sessions.Base],
-    document_selection: Document.Node.Name => Boolean,
+    document_selection: String => Boolean,
     val progress: Progress
   ) {
     context =>
@@ -236,7 +236,7 @@
     lazy val document_latex: List[Document_Latex] =
       for (name <- all_document_theories)
       yield {
-        val selected = document_selection(name)
+        val selected = document_selection(name.theory)
 
         val body =
           if (selected) {
--- a/src/Tools/jEdit/src/theories_status.scala	Sun Feb 05 15:01:49 2023 +0100
+++ b/src/Tools/jEdit/src/theories_status.scala	Sun Feb 05 15:59:18 2023 +0100
@@ -199,7 +199,7 @@
           if (node_renderer.in_required(index_location, point)) {
             if (clicks == 1) {
               val name = listData(index)
-              if (document) PIDE.editor.document_select(Set(name), toggle = true)
+              if (document) PIDE.editor.document_select(Set(name.theory), toggle = true)
               else Document_Model.node_required(name, toggle = true)
             }
           }