clarified signature: more explicit subtypes of Session, with corresponding subtypes of Resources;
authorwenzelm
Tue, 24 Jun 2025 20:52:09 +0200
changeset 82744 0ca8b1861fa3
parent 82743 b00337cda5b9
child 82745 ef9075e41a67
clarified signature: more explicit subtypes of Session, with corresponding subtypes of Resources;
etc/build.props
src/Pure/Build/build.scala
src/Pure/Build/build_job.scala
src/Pure/PIDE/headless.scala
src/Pure/PIDE/session.scala
src/Tools/Find_Facts/src/find_facts.scala
src/Tools/VSCode/src/language_server.scala
src/Tools/VSCode/src/vscode_model.scala
src/Tools/VSCode/src/vscode_rendering.scala
src/Tools/VSCode/src/vscode_resources.scala
src/Tools/VSCode/src/vscode_session.scala
src/Tools/jEdit/src/jedit_session.scala
src/Tools/jEdit/src/main_plugin.scala
--- a/etc/build.props	Mon Jun 23 14:44:59 2025 +0200
+++ b/etc/build.props	Tue Jun 24 20:52:09 2025 +0200
@@ -288,6 +288,7 @@
   src/Tools/VSCode/src/vscode_model.scala \
   src/Tools/VSCode/src/vscode_rendering.scala \
   src/Tools/VSCode/src/vscode_resources.scala \
+  src/Tools/VSCode/src/vscode_session.scala \
   src/Tools/VSCode/src/vscode_spell_checker.scala \
   src/Tools/jEdit/src/active.scala \
   src/Tools/jEdit/src/base_plugin.scala \
@@ -318,6 +319,7 @@
   src/Tools/jEdit/src/jedit_plugins.scala \
   src/Tools/jEdit/src/jedit_rendering.scala \
   src/Tools/jEdit/src/jedit_resources.scala \
+  src/Tools/jEdit/src/jedit_session.scala \
   src/Tools/jEdit/src/jedit_sessions.scala \
   src/Tools/jEdit/src/jedit_spell_checker.scala \
   src/Tools/jEdit/src/keymap_merge.scala \
--- a/src/Pure/Build/build.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Pure/Build/build.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -787,7 +787,7 @@
     unicode_symbols: Boolean = false
   ): Unit = {
     val store = Store(options)
-    val session = new Session(options, Resources.bootstrap)
+    val session = new Session(options)
 
     def check(filter: List[Regex], make_string: => String): Boolean =
       filter.isEmpty || {
--- a/src/Pure/Build/build_job.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Pure/Build/build_job.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -170,13 +170,14 @@
 
           /* session */
 
-          val resources =
-            new Resources(session_background, log = log,
-              command_timings =
-                Properties.uncompress(session_context.old_command_timings_blob, cache = store.cache))
+          val session =
+            new Session(options) {
+              override val resources: Resources =
+                new Resources(session_background, log = log,
+                  command_timings =
+                    Properties.uncompress(
+                      session_context.old_command_timings_blob, cache = store.cache))
 
-          val session =
-            new Session(options, resources) {
               override val cache: Rich_Text.Cache = store.cache
 
               override def build_blobs_info(node_name: Document.Node.Name): Command.Blobs_Info =
@@ -321,7 +322,7 @@
           session.all_messages += Session.Consumer[Any]("build_session_output") {
             case msg: Prover.Output =>
               val message = msg.message
-              if (msg.is_system) resources.log(Protocol.message_text(message))
+              if (msg.is_system) session.resources.log(Protocol.message_text(message))
 
               if (msg.is_stdout) {
                 stdout ++= Symbol.encode(XML.content(message))
@@ -360,7 +361,7 @@
             Isabelle_Thread.interrupt_handler(_ => process.terminate()) {
               Exn.capture { process.await_startup() } match {
                 case Exn.Res(_) =>
-                  val resources_xml = resources.init_session_xml
+                  val resources_xml = session.resources.init_session_xml
                   val encode_options: XML.Encode.T[Options] =
                     options => session.prover_options(options).encode
                   val args_xml =
--- a/src/Pure/PIDE/headless.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Pure/PIDE/headless.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -46,10 +46,11 @@
   class Session private[Headless](
     session_name: String,
     _session_options: => Options,
-    override val resources: Resources)
-  extends isabelle.Session(_session_options, resources) {
+    _resources: Headless.Resources)
+  extends isabelle.Session(_session_options) {
     session =>
 
+    override def resources: Headless.Resources = _resources
 
     private def loaded_theory(name: Document.Node.Name): Boolean =
       resources.session_base.loaded_theory(name.theory)
@@ -619,6 +620,7 @@
     ): Session = {
       val session_name = session_background.session_name
       val session = new Session(session_name, options, resources)
+
       val session_heaps = ML_Process.session_heaps(store, session_background, logic = session_name)
 
       progress.echo("Starting session " + session_name + " ...")
--- a/src/Pure/PIDE/session.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Pure/PIDE/session.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -121,9 +121,11 @@
 }
 
 
-class Session(_session_options: => Options, val resources: Resources) extends Document.Session {
+class Session(_session_options: => Options) extends Document.Session {
   session =>
 
+  def resources: Resources = Resources.bootstrap
+
   val init_time: Time = Time.now()
   def print_now(): String = (Time.now() - init_time).toString
 
--- a/src/Tools/Find_Facts/src/find_facts.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Tools/Find_Facts/src/find_facts.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -628,7 +628,7 @@
     val store = Store(options)
     val solr = Solr.init(solr_data_dir)
     val database = options.string("find_facts_database_name")
-    val session = Session(options, Resources.bootstrap)
+    val session = Session(options)
 
     val selection = Sessions.Selection(sessions = sessions)
     val sessions_structure =
--- a/src/Tools/VSCode/src/language_server.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Tools/VSCode/src/language_server.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -114,9 +114,9 @@
 
   /* prover session */
 
-  private val session_ = Synchronized(None: Option[Session])
-  def session: Session = session_.value getOrElse error("Server inactive")
-  def resources: VSCode_Resources = session.resources.asInstanceOf[VSCode_Resources]
+  private val session_ = Synchronized(None: Option[VSCode_Session])
+  def session: VSCode_Session = session_.value getOrElse error("Server inactive")
+  def resources: VSCode_Resources = session.resources
 
   def rendering_offset(node_pos: Line.Node_Position): Option[(VSCode_Rendering, Text.Offset)] =
     for {
@@ -285,7 +285,7 @@
           }
 
         val session_options = options.bool.update("editor_output_state", true)
-        val session = new Session(session_options, resources)
+        val session = new VSCode_Session(session_options, resources)
 
         Some((session_background, session))
       }
@@ -562,7 +562,7 @@
   object editor extends Language_Server.Editor {
     /* PIDE session and document model */
 
-    override def session: Session = server.session
+    override def session: VSCode_Session = server.session
     override def flush(): Unit = resources.flush_input(session, channel)
     override def invoke(): Unit = delay_input.invoke()
 
--- a/src/Tools/VSCode/src/vscode_model.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Tools/VSCode/src/vscode_model.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -48,7 +48,7 @@
   }
 
   def init(
-    session: Session,
+    session: VSCode_Session,
     editor: Language_Server.Editor,
     node_name: Document.Node.Name
   ): VSCode_Model = {
@@ -59,7 +59,7 @@
 }
 
 sealed case class VSCode_Model(
-  session: Session,
+  session: VSCode_Session,
   editor: Language_Server.Editor,
   content: VSCode_Model.Content,
   version: Option[Long] = None,
@@ -92,8 +92,8 @@
   /* header */
 
   def node_header: Document.Node.Header =
-    resources.special_header(node_name) getOrElse
-      resources.check_thy(node_name, Scan.char_reader(content.text))
+    session.resources.special_header(node_name) getOrElse
+      session.resources.check_thy(node_name, Scan.char_reader(content.text))
 
 
   /* perspective */
@@ -103,11 +103,11 @@
     caret: Option[Line.Position]
   ): (Boolean, Document.Node.Perspective_Text.T) = {
     if (is_theory) {
-      val snapshot = resources.snapshot(model)
+      val snapshot = session.resources.snapshot(model)
 
       val required = node_required || editor.document_node_required(node_name)
 
-      val caret_perspective = resources.options.int("vscode_caret_perspective") max 0
+      val caret_perspective = session.resources.options.int("vscode_caret_perspective") max 0
       val caret_range =
         if (caret_perspective != 0) {
           caret match {
@@ -123,7 +123,7 @@
         else Text.Range.offside
 
       val text_perspective =
-        if (snapshot.commands_loading_ranges(resources.visible_node(_)).nonEmpty)
+        if (snapshot.commands_loading_ranges(session.resources.visible_node(_)).nonEmpty)
           Text.Perspective.full
         else
           content.text_range.try_restrict(caret_range) match {
@@ -195,7 +195,7 @@
     rendering: VSCode_Rendering
   ): (Option[List[Text.Info[Command.Results]]], Option[List[VSCode_Model.Decoration]], VSCode_Model) = {
     val (diagnostics, decorations, model) = publish_full(rendering)
-    
+
     val changed_diagnostics =
       if (diagnostics == published_diagnostics) None else Some(diagnostics)
     val changed_decorations =
@@ -221,8 +221,6 @@
 
   /* prover session */
 
-  def resources: VSCode_Resources = session.resources.asInstanceOf[VSCode_Resources]
-
   def is_stable: Boolean = pending_edits.isEmpty
 
 
--- a/src/Tools/VSCode/src/vscode_rendering.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Tools/VSCode/src/vscode_rendering.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -67,10 +67,10 @@
 }
 
 class VSCode_Rendering(snapshot: Document.Snapshot, val model: VSCode_Model)
-extends Rendering(snapshot, model.resources.options, model.session) {
+extends Rendering(snapshot, model.session.resources.options, model.session) {
   rendering =>
 
-  def resources: VSCode_Resources = model.resources
+  def resources: VSCode_Resources = model.session.resources
 
   override def get_text(range: Text.Range): Option[String] = model.get_text(range)
 
@@ -264,7 +264,7 @@
     range: Symbol.Range
   ): Option[Line.Node_Range] = {
     for {
-      platform_path <- resources.source_file(model.resources.ml_settings, source_name)
+      platform_path <- resources.source_file(model.session.resources.ml_settings, source_name)
       file <-
         (try { Some(File.absolute(new JFile(platform_path))) }
          catch { case ERROR(_) => None })
--- a/src/Tools/VSCode/src/vscode_resources.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Tools/VSCode/src/vscode_resources.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -185,7 +185,7 @@
     }
 
   def change_model(
-    session: Session,
+    session: VSCode_Session,
     editor: Language_Server.Editor,
     file: JFile,
     version: Long,
@@ -235,7 +235,7 @@
   /* resolve dependencies */
 
   def resolve_dependencies(
-    session: Session,
+    session: VSCode_Session,
     editor: Language_Server.Editor,
     file_watcher: File_Watcher
   ): (Boolean, Boolean) = {
@@ -270,7 +270,7 @@
 
   /* pending input */
 
-  def flush_input(session: Session, channel: Channel): Unit = {
+  def flush_input(session: VSCode_Session, channel: Channel): Unit = {
     state.change { st =>
       val changed_models =
         (for {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/VSCode/src/vscode_session.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -0,0 +1,18 @@
+/*  Title:      Tools/VSCode/src/vscode_session.scala
+    Author:     Makarius
+
+PIDE editor session for Isabelle/VSCode.
+*/
+
+package isabelle.vscode
+
+
+import isabelle._
+
+
+class VSCode_Session(
+  _session_options: => Options,
+  _resources: VSCode_Resources
+) extends Session(_session_options) {
+  override def resources: VSCode_Resources = _resources
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/src/jedit_session.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -0,0 +1,15 @@
+/*  Title:      Tools/jEdit/src/jedit_session.scala
+    Author:     Makarius
+
+PIDE editor session for Isabelle/jEdit.
+*/
+
+package isabelle.jedit
+
+
+import isabelle._
+
+
+class JEdit_Session(_session_options: => Options) extends Session(_session_options) {
+  override val resources: JEdit_Resources = JEdit_Resources(_session_options)
+}
--- a/src/Tools/jEdit/src/main_plugin.scala	Mon Jun 23 14:44:59 2025 +0200
+++ b/src/Tools/jEdit/src/main_plugin.scala	Tue Jun 24 20:52:09 2025 +0200
@@ -50,8 +50,8 @@
     else _plugin
 
   def options: JEdit_Options = plugin.options
-  def resources: JEdit_Resources = plugin.resources
-  def session: Session = plugin.session
+  def session: JEdit_Session = plugin.session
+  def resources: JEdit_Resources = session.resources
   def cache: Rich_Text.Cache = session.cache.asInstanceOf[Rich_Text.Cache]
 
   def ml_settings: ML_Settings = ML_Settings.system(plugin.startup_options)
@@ -77,18 +77,11 @@
   def options: JEdit_Options = _options
 
 
-  /* resources */
-
-  private var _resources: JEdit_Resources = null
-  private def init_resources(): Unit = _resources = JEdit_Resources(options.value)
-  def resources: JEdit_Resources = _resources
-
-
   /* session */
 
-  private var _session: Session = null
-  private def init_session(): Unit = { _session = new Session(options.value, resources) }
-  def session: Session = _session
+  private var _session: JEdit_Session = null
+  private def init_session(): Unit = { _session = new JEdit_Session(options.value) }
+  def session: JEdit_Session = _session
 
 
   /* misc support */
@@ -125,12 +118,12 @@
       val models = Document_Model.get_models_map()
 
       val thy_files =
-        resources.resolve_dependencies(models.values, PIDE.editor.document_required())
+        session.resources.resolve_dependencies(models.values, PIDE.editor.document_required())
 
       val aux_files =
-        if (resources.auto_resolve) {
+        if (session.resources.auto_resolve) {
           session.stable_tip_version(models.values) match {
-            case Some(version) => resources.undefined_blobs(version)
+            case Some(version) => session.resources.undefined_blobs(version)
             case None => delay_load.invoke(); Nil
           }
         }
@@ -144,7 +137,7 @@
           val loaded_files =
             for {
               name <- required_files
-              text <- resources.read_file_content(name)
+              text <- session.resources.read_file_content(name)
             } yield (name, text)
 
           GUI_Thread.later {
@@ -229,7 +222,7 @@
       } {
         if (buffer.isLoaded) {
           JEdit_Lib.buffer_lock(buffer) {
-            val node_name = resources.node_name(buffer)
+            val node_name = session.resources.node_name(buffer)
             val model = Document_Model.init(session, node_name, buffer)
             for {
               text_area <- JEdit_Lib.jedit_text_areas(buffer)
@@ -303,7 +296,7 @@
         case _: EditorStarted =>
           val view = jEdit.getActiveView
 
-          try { resources.session_background.check_errors }
+          try { session.resources.session_background.check_errors }
           catch {
             case ERROR(msg) =>
               GUI.warning_dialog(view,
@@ -429,7 +422,6 @@
     /* strict initialization */
 
     init_options()
-    init_resources()
     init_session()
     PIDE._plugin = this