support for File_Format.Session, e.g. server process accessible via prover options;
authorwenzelm
Thu, 20 Dec 2018 23:05:37 +0100
changeset 69488 b05c0bb47f6d
parent 69487 681760f50723
child 69489 18c58b0da0a9
support for File_Format.Session, e.g. server process accessible via prover options;
src/Pure/PIDE/session.scala
src/Pure/Thy/file_format.scala
--- a/src/Pure/PIDE/session.scala	Thu Dec 20 22:56:36 2018 +0100
+++ b/src/Pure/PIDE/session.scala	Thu Dec 20 23:05:37 2018 +0100
@@ -343,6 +343,12 @@
   }
 
 
+  /* file formats */
+
+  lazy val file_formats: File_Format.Session =
+    resources.file_formats.start_session(session)
+
+
   /* protocol handlers */
 
   private val protocol_handlers = Protocol_Handlers.init(session)
@@ -513,12 +519,13 @@
               change_command(_.accumulate(state_id, output.message, xml_cache))
 
             case _ if output.is_init =>
-              prover.get.options(session_options)
+              prover.get.options(file_formats.prover_options(session_options))
               prover.get.session_base(resources)
               phase = Session.Ready
               debugger.ready()
 
             case Markup.Process_Result(result) if output.is_exit =>
+              file_formats.stop_session
               phase = Session.Terminated(result)
               prover.reset
 
@@ -587,7 +594,7 @@
 
           case Update_Options(options) =>
             if (prover.defined && is_ready) {
-              prover.get.options(options)
+              prover.get.options(file_formats.prover_options(options))
               handle_raw_edits()
             }
             global_options.post(Session.Global_Options(options))
@@ -633,6 +640,7 @@
 
   def start(start_prover: Prover.Receiver => Prover)
   {
+    file_formats
     _phase.change(
       {
         case Session.Inactive =>
--- a/src/Pure/Thy/file_format.scala	Thu Dec 20 22:56:36 2018 +0100
+++ b/src/Pure/Thy/file_format.scala	Thu Dec 20 23:05:37 2018 +0100
@@ -9,6 +9,11 @@
 
 object File_Format
 {
+  sealed case class Theory_Context(name: Document.Node.Name, content: String)
+
+
+  /* environment */
+
   def environment(): Environment =
     new Environment(Isabelle_System.init_classes[File_Format]("ISABELLE_FILE_FORMATS"))
 
@@ -20,9 +25,35 @@
     def get(name: Document.Node.Name): Option[File_Format] = get(name.node)
     def get_theory(name: Document.Node.Name): Option[File_Format] = get(name.theory)
     def is_theory(name: Document.Node.Name): Boolean = get_theory(name).isDefined
+
+    def start_session(session: isabelle.Session): Session =
+      new Session(file_formats.map(_.start(session)))
   }
 
-  sealed case class Theory_Context(name: Document.Node.Name, content: String)
+
+  /* session */
+
+  final class Session private[File_Format](agents: List[Agent])
+  {
+    override def toString: String =
+      agents.mkString("File_Format.Session(", ", ", ")")
+
+    def prover_options(options: Options): Options =
+      (options /: agents)({ case (opts, agent) => agent.prover_options(opts) })
+
+    def stop_session { agents.foreach(_.stop) }
+  }
+
+  trait Agent
+  {
+    def prover_options(options: Options): Options = options
+    def stop {}
+  }
+
+  object Agent extends Agent
+  {
+    override def toString: String = "-"
+  }
 }
 
 trait File_Format
@@ -61,4 +92,9 @@
   }
 
   def make_preview(snapshot: Document.Snapshot): Option[Present.Preview] = None
+
+
+  /* PIDE session */
+
+  def start(session: isabelle.Session): File_Format.Agent = File_Format.Agent
 }