clarified signature: more explicit subtypes of Session, with corresponding subtypes of Resources;
--- 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