eliminated strange mutable var commands;
authorwenzelm
Mon, 11 Jan 2010 16:49:11 +0100
changeset 34863 3e655d0ff936
parent 34862 a1d394600a92
child 34864 fd6801e87944
eliminated strange mutable var commands; removed_commands: refer to old commands; misc tuning;
src/Tools/jEdit/src/proofdocument/document.scala
--- a/src/Tools/jEdit/src/proofdocument/document.scala	Mon Jan 11 13:58:51 2010 +0100
+++ b/src/Tools/jEdit/src/proofdocument/document.scala	Mon Jan 11 16:49:11 2010 +0100
@@ -37,7 +37,6 @@
   var phase1: Linear_Set[Command] = null
   var phase2: Linear_Set[Command] = null
   var phase3: List[Edit] = null
-  var raw_source: String = null
 
 
 
@@ -50,8 +49,6 @@
   {
     require(old_doc.assignment.is_finished)
 
-    phase0 = edits
-
 
     /* unparsed dummy commands */
 
@@ -60,43 +57,36 @@
 
     def is_unparsed(command: Command) = command.id == null
 
-    assert(!old_doc.commands.exists(is_unparsed))
+    assert(!old_doc.commands.exists(is_unparsed))   // FIXME remove
 
 
     /* phase 1: edit individual command source */
 
-    var commands = old_doc.commands
-
-    def edit_text(eds: List[Text_Edit]): Unit =
+    def edit_text(eds: List[Text_Edit], commands: Linear_Set[Command]): Linear_Set[Command] =
     {
       eds match {
         case e :: es =>
           command_starts(commands).find {   // FIXME relative search!
             case (cmd, cmd_start) => e.can_edit(cmd.length, cmd_start)
-          } match {  // FIXME try to append after command
+          } match {
+            // FIXME try to append after command
             case Some((cmd, cmd_start)) =>
               val (rest, source) = e.edit(cmd.source, cmd_start)
-              // FIXME Linear_Set.edit (?)
-              commands = commands.insert_after(Some(cmd), unparsed(source))
-              commands -= cmd
-              edit_text(rest.toList ::: es)
+              val new_commands = commands.insert_after(Some(cmd), unparsed(source)) - cmd
+              edit_text(rest.toList ::: es, new_commands)
 
             case None =>
               require(e.isInstanceOf[Text_Edit.Insert] && e.start == 0)
-              commands = commands.insert_after(None, unparsed(e.text))
-              edit_text(es)
+              edit_text(es, commands.insert_after(None, unparsed(e.text)))
           }
-        case Nil =>
+        case Nil => commands
       }
     }
-    edit_text(edits)
-
-    phase1 = commands
 
 
     /* phase 2: command range edits */
 
-    def edit_commands(): Unit =
+    def edit_commands(commands: Linear_Set[Command]): Linear_Set[Command] =
     {
       // FIXME relative search!
       commands.elements.find(is_unparsed) match {
@@ -105,52 +95,51 @@
           val body = commands.elements(first_unparsed).takeWhile(is_unparsed).toList
           val suffix = commands.next(body.last)
 
-          val source =
-            (prefix.toList ::: body ::: suffix.toList).flatMap(_.span.map(_.source)).mkString
-          assert(source != "")
-          raw_source = source
-          
-          val spans0 = Thy_Syntax.parse_spans(session.current_syntax.scan(source))
+          val sources = (prefix.toList ::: body ::: suffix.toList).flatMap(_.span.map(_.source))
+          val span = Thy_Syntax.parse_spans(session.current_syntax.scan(sources.mkString))
 
           val (before_edit, spans1) =
-            if (!spans0.isEmpty && Some(spans0.first) == prefix.map(_.span))
-              (prefix, spans0.tail)
-            else (if (prefix.isDefined) commands.prev(prefix.get) else None, spans0)
+            if (!span.isEmpty && Some(span.first) == prefix.map(_.span))
+              (prefix, span.tail)
+            else (if (prefix.isDefined) commands.prev(prefix.get) else None, span)
 
           val (after_edit, spans2) =
             if (!spans1.isEmpty && Some(spans1.last) == suffix.map(_.span))
               (suffix, spans1.take(spans1.length - 1))
             else (if (suffix.isDefined) commands.next(suffix.get) else None, spans1)
 
-          val new_commands = spans2.map(span => new Command(session.create_id(), span))
+          val inserted = spans2.map(span => new Command(session.create_id(), span))
+          val new_commands =
+            commands.delete_between(before_edit, after_edit).append_after(before_edit, inserted)
+          edit_commands(new_commands)
 
-          commands = commands.delete_between(before_edit, after_edit)
-          commands = commands.append_after(before_edit, new_commands)
-
-          edit_commands()
-
-        case None =>
+        case None => commands
       }
     }
-    edit_commands()
-    
-    phase2 = commands
 
 
     /* phase 3: resulting document edits */
 
-    val removed_commands = old_doc.commands.elements.filter(!commands.contains(_)).toList
-    val inserted_commands = commands.elements.filter(!old_doc.commands.contains(_)).toList
+    val commands0 = old_doc.commands
+    val commands1 = edit_text(edits, commands0)
+    val commands2 = edit_commands(commands1)
 
-    // FIXME proper order
+    val removed_commands = commands0.elements.filter(!commands2.contains(_)).toList
+    val inserted_commands = commands2.elements.filter(!commands0.contains(_)).toList
+
+    // FIXME tune
     val doc_edits =
-      removed_commands.reverse.map(cmd => (commands.prev(cmd), None)) :::
-      inserted_commands.map(cmd => (commands.prev(cmd), Some(cmd)))
+      removed_commands.reverse.map(cmd => (commands0.prev(cmd), None)) :::
+      inserted_commands.map(cmd => (commands2.prev(cmd), Some(cmd)))
 
     val former_states = old_doc.assignment.join -- removed_commands
 
+    phase0 = edits
+    phase1 = commands1
+    phase2 = commands2
     phase3 = doc_edits
-    (doc_edits, new Document(new_id, commands, former_states))
+
+    (doc_edits, new Document(new_id, commands2, former_states))
   }
 }