src/Pure/PIDE/session.scala
changeset 70664 2bd9e30183b1
parent 70661 9c4809ec28ef
child 70665 94442fce40a5
--- a/src/Pure/PIDE/session.scala	Fri Sep 06 17:10:23 2019 +0200
+++ b/src/Pure/PIDE/session.scala	Fri Sep 06 18:59:24 2019 +0200
@@ -9,6 +9,7 @@
 
 
 import scala.collection.immutable.Queue
+import scala.collection.mutable
 import scala.annotation.tailrec
 
 
@@ -420,28 +421,33 @@
     {
       require(prover.defined)
 
-      def id_command(command: Command)
+      // define commands
       {
-        for {
-          (name, digest) <- command.blobs_defined
-          if !global_state.value.defined_blob(digest)
-        } {
-          change.version.nodes(name).get_blob match {
-            case Some(blob) =>
-              global_state.change(_.define_blob(digest))
-              prover.get.define_blob(digest, blob.bytes)
-            case None =>
-              Output.error_message("Missing blob " + quote(name.toString))
+        val id_commands = new mutable.ListBuffer[Command]
+        def id_command(command: Command)
+        {
+          for {
+            (name, digest) <- command.blobs_defined
+            if !global_state.value.defined_blob(digest)
+          } {
+            change.version.nodes(name).get_blob match {
+              case Some(blob) =>
+                global_state.change(_.define_blob(digest))
+                prover.get.define_blob(digest, blob.bytes)
+              case None =>
+                Output.error_message("Missing blob " + quote(name.toString))
+            }
+          }
+
+          if (!global_state.value.defined_command(command.id)) {
+            global_state.change(_.define_command(command))
+            id_commands += command
           }
         }
-
-        if (!global_state.value.defined_command(command.id)) {
-          global_state.change(_.define_command(command))
-          prover.get.define_command(command)
+        for { (_, edit) <- change.doc_edits } {
+          edit.foreach({ case (c1, c2) => c1.foreach(id_command); c2.foreach(id_command) })
         }
-      }
-      for { (_, edit) <- change.doc_edits } {
-        edit.foreach({ case (c1, c2) => c1.foreach(id_command); c2.foreach(id_command) })
+        if (id_commands.nonEmpty) prover.get.define_commands_bulk(id_commands.toList)
       }
 
       val assignment = global_state.value.the_assignment(change.previous).check_finished