inline errors as "bad" markup;
authorwenzelm
Mon, 30 Jun 2025 12:42:21 +0200
changeset 82798 16e2ce15df90
parent 82797 09904d5ef1f0
child 82799 fc4a579585cd
inline errors as "bad" markup; reload_theory: proper node2;
src/Pure/PIDE/command.scala
src/Pure/Thy/thy_syntax.scala
--- a/src/Pure/PIDE/command.scala	Mon Jun 30 11:28:04 2025 +0200
+++ b/src/Pure/PIDE/command.scala	Mon Jun 30 12:42:21 2025 +0200
@@ -133,6 +133,8 @@
     def apply(index: Markup_Index): Markup_Tree =
       rep.getOrElse(index, Markup_Tree.empty)
 
+    def add(markup: Text.Markup): Markups = add(Markup_Index.markup, markup)
+
     def add(index: Markup_Index, markup: Text.Markup): Markups =
       new Markups(rep + (index -> (this(index) + markup)))
 
--- a/src/Pure/Thy/thy_syntax.scala	Mon Jun 30 11:28:04 2025 +0200
+++ b/src/Pure/Thy/thy_syntax.scala	Mon Jun 30 12:42:21 2025 +0200
@@ -154,29 +154,44 @@
   def reload_theory(
     session: Session,
     doc_blobs: Document.Blobs,
-    theory_name: String,
-    theory_node: Document.Node,
+    node_name: Document.Node.Name,
+    node: Document.Node,
   ): Document.Node = {
-    Exn.capture(session.read_theory(theory_name)) match {
+    require(node_name.is_theory)
+    val theory = node_name.theory
+
+    Exn.capture(session.read_theory(theory)) match {
       case Exn.Res(command) =>
-        val thy_ok = command.source == theory_node.source
+        val thy_changed =
+          if (node.source.isEmpty || node.source == command.source) Nil
+          else List(node_name.node)
         val blobs_changed =
           for {
             case Exn.Res(blob) <- command.blobs
             (digest, _) <- blob.content
             doc_blob <- doc_blobs.get(blob.name)
             if digest != doc_blob.bytes.sha1_digest
-          } yield blob.name
+          } yield blob.name.node
 
+        val changed = thy_changed ::: blobs_changed
         val command1 =
-          if (thy_ok && blobs_changed.isEmpty) command
-          else command // FIXME errors as markup
+          if (changed.isEmpty) command
+          else {
+            val node_range = Text.Range(0, Symbol.length(node.source))
+            val msg =
+              XML.Elem(Markup.Bad(Document_ID.make()),
+                XML.string("Changed sources for loaded theory " + quote(theory) +
+                  ":\n" + cat_lines(changed.map(a => "  " + quote(a)))))
+            Command.unparsed(node.source, theory = true, id = command.id, node_name = node_name,
+              blobs_info = command.blobs_info,
+              markups = Command.Markups.empty.add(Text.Info(node_range, msg)))
+          }
 
-        theory_node.update_commands(Linear_Set(command1))
+        node.update_commands(Linear_Set(command1))
 
       case Exn.Exn(exn) =>
         session.system_output(Output.error_message_text(Exn.print(exn)))
-        theory_node
+        node
     }
   }
 
@@ -387,7 +402,7 @@
                 text_edit(resources, syntax, get_blob, can_import, reparse_limit, _, _))
             val node3 =
               if (session_base.loaded_theory(name)) {
-                reload_theory(session, doc_blobs, name.theory, node)
+                reload_theory(session, doc_blobs, name, node2)
               }
               else if (reparse_set(name)) {
                 text_edit(resources, syntax, get_blob, can_import, reparse_limit,