--- a/NEWS Tue Apr 07 22:13:22 2020 +0200
+++ b/NEWS Wed Apr 08 13:14:05 2020 +0200
@@ -12,8 +12,14 @@
* The command-line tool "isabelle console" now supports interrupts
properly (on Linux and macOS).
-* The Isabelle/Scala "Progress" interface has changed slightly and
-"No_Progress" discontinued. INCOMPATIBILITY, use "new Progress" instead.
+* The Isabelle/Scala "Progress" interface changed slightly and
+"No_Progress" has been discontinued. INCOMPATIBILITY, use "new Progress"
+instead.
+
+* General support for Isabelle/Scala system services, configured via the
+shell function "isabelle_scala_service" in etc/settings (e.g. of an
+Isabelle component); e.g. see isabelle.Bibtex.File_Format. This
+supersedes former "isabelle_file_format": minor INCOMPATIBILITY.
--- a/etc/settings Tue Apr 07 22:13:22 2020 +0200
+++ b/etc/settings Wed Apr 08 13:14:05 2020 +0200
@@ -23,7 +23,7 @@
isabelle_scala_tools 'isabelle.Tools'
[ -d "$ISABELLE_HOME/Admin" ] && isabelle_scala_tools 'isabelle.Admin_Tools'
-isabelle_file_format 'isabelle.Bibtex$File_Format'
+isabelle_scala_service 'isabelle.Bibtex$File_Format'
#paranoia settings -- avoid intrusion of alien options
unset "_JAVA_OPTIONS"
--- a/lib/scripts/getfunctions Tue Apr 07 22:13:22 2020 +0200
+++ b/lib/scripts/getfunctions Wed Apr 08 13:14:05 2020 +0200
@@ -160,21 +160,21 @@
}
export -f isabelle_fonts_hidden
-#file formats
-function isabelle_file_format ()
+#Isabelle/Scala services
+function isabelle_scala_service ()
{
local X=""
for X in "$@"
do
- if [ -z "$ISABELLE_FILE_FORMATS" ]; then
- ISABELLE_FILE_FORMATS="$X"
+ if [ -z "$ISABELLE_SCALA_SERVICES" ]; then
+ ISABELLE_SCALA_SERVICES="$X"
else
- ISABELLE_FILE_FORMATS="$ISABELLE_FILE_FORMATS:$X"
+ ISABELLE_SCALA_SERVICES="$ISABELLE_SCALA_SERVICES:$X"
fi
done
- export ISABELLE_FILE_FORMATS
+ export ISABELLE_SCALA_SERVICES
}
-export -f isabelle_file_format
+export -f isabelle_scala_service
#administrative build
if [ -e "$ISABELLE_HOME/Admin/build" ]; then
--- a/src/Pure/PIDE/resources.scala Tue Apr 07 22:13:22 2020 +0200
+++ b/src/Pure/PIDE/resources.scala Wed Apr 08 13:14:05 2020 +0200
@@ -23,19 +23,17 @@
/* file formats */
- val file_formats: File_Format.Environment = File_Format.environment()
-
def make_theory_name(name: Document.Node.Name): Option[Document.Node.Name] =
- file_formats.get(name).flatMap(_.make_theory_name(resources, name))
+ File_Format.registry.get(name).flatMap(_.make_theory_name(resources, name))
def make_theory_content(thy_name: Document.Node.Name): Option[String] =
- file_formats.get_theory(thy_name).flatMap(_.make_theory_content(resources, thy_name))
+ File_Format.registry.get_theory(thy_name).flatMap(_.make_theory_content(resources, thy_name))
def make_preview(snapshot: Document.Snapshot): Option[Present.Preview] =
- file_formats.get(snapshot.node_name).flatMap(_.make_preview(snapshot))
+ File_Format.registry.get(snapshot.node_name).flatMap(_.make_preview(snapshot))
def is_hidden(name: Document.Node.Name): Boolean =
- !name.is_theory || name.theory == Sessions.root_name || file_formats.is_theory(name)
+ !name.is_theory || name.theory == Sessions.root_name || File_Format.registry.is_theory(name)
def thy_path(path: Path): Path = path.ext("thy")
--- a/src/Pure/PIDE/session.scala Tue Apr 07 22:13:22 2020 +0200
+++ b/src/Pure/PIDE/session.scala Wed Apr 08 13:14:05 2020 +0200
@@ -354,7 +354,7 @@
/* file formats */
lazy val file_formats: File_Format.Session =
- resources.file_formats.start_session(session)
+ File_Format.registry.start_session(session)
/* protocol handlers */
--- a/src/Pure/System/isabelle_system.scala Tue Apr 07 22:13:22 2020 +0200
+++ b/src/Pure/System/isabelle_system.scala Wed Apr 08 13:14:05 2020 +0200
@@ -54,7 +54,7 @@
_settings.get
}
- def init(isabelle_root: String = "", cygwin_root: String = ""): Unit = synchronized {
+ private def init_settings(isabelle_root: String = "", cygwin_root: String = ""): Unit = synchronized {
if (_settings.isEmpty) {
val isabelle_root1 =
bootstrap_directory(isabelle_root, "ISABELLE_ROOT", "isabelle.root", "Isabelle root")
@@ -127,6 +127,12 @@
}
}
+ def init()
+ {
+ init_settings()
+ services
+ }
+
/* getenv */
@@ -383,6 +389,13 @@
}
+ /* user-defined services */
+
+ abstract class Service
+
+ lazy val services: List[Service] = init_classes[Service]("ISABELLE_SCALA_SERVICES")
+
+
/* default logic */
def default_logic(args: String*): String =
--- a/src/Pure/Thy/file_format.scala Tue Apr 07 22:13:22 2020 +0200
+++ b/src/Pure/Thy/file_format.scala Wed Apr 08 13:14:05 2020 +0200
@@ -12,12 +12,12 @@
sealed case class Theory_Context(name: Document.Node.Name, content: String)
- /* environment */
+ /* registry */
- def environment(): Environment =
- new Environment(Isabelle_System.init_classes[File_Format]("ISABELLE_FILE_FORMATS"))
+ lazy val registry: Registry =
+ new Registry(Isabelle_System.services.collect { case c: File_Format => c })
- final class Environment private [File_Format](file_formats: List[File_Format])
+ final class Registry private [File_Format](file_formats: List[File_Format])
{
override def toString: String = file_formats.mkString("File_Format.Environment(", ",", ")")
@@ -53,7 +53,7 @@
object No_Agent extends Agent
}
-trait File_Format
+trait File_Format extends Isabelle_System.Service
{
def format_name: String
override def toString: String = format_name
--- a/src/Tools/VSCode/src/document_model.scala Tue Apr 07 22:13:22 2020 +0200
+++ b/src/Tools/VSCode/src/document_model.scala Wed Apr 08 13:14:05 2020 +0200
@@ -60,7 +60,7 @@
def init(session: Session, editor: Server.Editor, node_name: Document.Node.Name): Document_Model =
Document_Model(session, editor, node_name, Content.empty,
- node_required = session.resources.file_formats.is_theory(node_name))
+ node_required = File_Format.registry.is_theory(node_name))
}
sealed case class Document_Model(
--- a/src/Tools/jEdit/src/document_model.scala Tue Apr 07 22:13:22 2020 +0200
+++ b/src/Tools/jEdit/src/document_model.scala Wed Apr 08 13:14:05 2020 +0200
@@ -389,7 +389,7 @@
file.foreach(PIDE.plugin.file_watcher.register_parent(_))
val content = Document_Model.File_Content(text)
- val node_required1 = node_required || session.resources.file_formats.is_theory(node_name)
+ val node_required1 = node_required || File_Format.registry.is_theory(node_name)
File_Model(session, node_name, file, content, node_required1, last_perspective, pending_edits)
}
}
@@ -454,7 +454,7 @@
def purge_edits(doc_blobs: Document.Blobs): Option[List[Document.Edit_Text]] =
if (pending_edits.nonEmpty ||
- !session.resources.file_formats.is_theory(node_name) &&
+ !File_Format.registry.is_theory(node_name) &&
(node_required || !Document.Node.is_no_perspective_text(last_perspective))) None
else {
val text_edits = List(Text.Edit.remove(0, content.text))