update XML cache for slightly modified messages;
authorwenzelm
Sun, 11 Mar 2018 20:47:17 +0100
changeset 67825 f9c071cc958b
parent 67824 661cd25304ae
child 67826 5ea76b219668
update XML cache for slightly modified messages;
src/Pure/PIDE/command.scala
src/Pure/PIDE/document.scala
src/Pure/PIDE/session.scala
--- a/src/Pure/PIDE/command.scala	Sun Mar 11 20:31:25 2018 +0100
+++ b/src/Pure/PIDE/command.scala	Sun Mar 11 20:47:17 2018 +0100
@@ -264,7 +264,8 @@
     def accumulate(
         self_id: Document_ID.Generic => Boolean,
         other_id: Document_ID.Generic => Option[(Symbol.Text_Chunk.Id, Symbol.Text_Chunk)],
-        message: XML.Elem): State =
+        message: XML.Elem,
+        xml_cache: XML.Cache): State =
       message match {
         case XML.Elem(Markup(Markup.STATUS, _), msgs) =>
           (this /: msgs)((state, msg) =>
@@ -297,8 +298,8 @@
                       target_chunk.incorporate(symbol_range) match {
                         case Some(range) =>
                           val props = Position.purge(atts)
-                          val info = Text.Info(range, XML.Elem(Markup(name, props), args))
-                          state.add_markup(false, target_name, info)
+                          val elem = xml_cache.elem(XML.Elem(Markup(name, props), args))
+                          state.add_markup(false, target_name, Text.Info(range, elem))
                         case None => bad(); state
                       }
                     case _ =>
@@ -310,8 +311,8 @@
                 if !atts.exists({ case (a, _) => Markup.POSITION_PROPERTIES(a) }) =>
                   val range = command.proper_range
                   val props = Position.purge(atts)
-                  val info: Text.Markup = Text.Info(range, XML.Elem(Markup(name, props), args))
-                  state.add_markup(false, Symbol.Text_Chunk.Default, info)
+                  val elem = xml_cache.elem(XML.Elem(Markup(name, props), args))
+                  state.add_markup(false, Symbol.Text_Chunk.Default, Text.Info(range, elem))
 
                 case _ => bad(); state
               }
@@ -319,8 +320,10 @@
         case XML.Elem(Markup(name, props), body) =>
           props match {
             case Markup.Serial(i) =>
-              val markup_message = XML.Elem(Markup(Markup.message(name), props), body)
-              val message_markup = XML.elem(Markup(name, props.filter(p => p._1 == Markup.SERIAL)))
+              val markup_message =
+                xml_cache.elem(XML.Elem(Markup(Markup.message(name), props), body))
+              val message_markup =
+                xml_cache.elem(XML.elem(Markup(name, props.filter(p => p._1 == Markup.SERIAL))))
 
               var st = copy(results = results + (i -> markup_message))
               if (Protocol.is_inlined(message)) {
--- a/src/Pure/PIDE/document.scala	Sun Mar 11 20:31:25 2018 +0100
+++ b/src/Pure/PIDE/document.scala	Sun Mar 11 20:47:17 2018 +0100
@@ -660,17 +660,18 @@
       (commands_redirection /: st.markups.redirection_iterator)({ case (graph, id) =>
         graph.default_node(id, ()).default_node(st.command.id, ()).add_edge(id, st.command.id) })
 
-    def accumulate(id: Document_ID.Generic, message: XML.Elem): (Command.State, State) =
+    def accumulate(id: Document_ID.Generic, message: XML.Elem, xml_cache: XML.Cache)
+      : (Command.State, State) =
     {
       execs.get(id) match {
         case Some(st) =>
-          val new_st = st.accumulate(self_id(st), other_id _, message)
+          val new_st = st.accumulate(self_id(st), other_id _, message, xml_cache)
           val execs1 = execs + (id -> new_st)
           (new_st, copy(execs = execs1, commands_redirection = redirection(new_st)))
         case None =>
           commands.get(id) match {
             case Some(st) =>
-              val new_st = st.accumulate(self_id(st), other_id _, message)
+              val new_st = st.accumulate(self_id(st), other_id _, message, xml_cache)
               val commands1 = commands + (id -> new_st)
               (new_st, copy(commands = commands1, commands_redirection = redirection(new_st)))
             case None => fail
--- a/src/Pure/PIDE/session.scala	Sun Mar 11 20:31:25 2018 +0100
+++ b/src/Pure/PIDE/session.scala	Sun Mar 11 20:47:17 2018 +0100
@@ -412,7 +412,7 @@
       def accumulate(state_id: Document_ID.Generic, message: XML.Elem)
       {
         try {
-          val st = global_state.change_result(_.accumulate(state_id, message))
+          val st = global_state.change_result(_.accumulate(state_id, message, xml_cache))
           change_buffer.invoke(false, List(st.command))
         }
         catch {