# HG changeset patch # User wenzelm # Date 1263224951 -3600 # Node ID 3e655d0ff93670239078a0dc0b71c96523ac8709 # Parent a1d394600a920ff2e796f90e2332ca356aeaadc6 eliminated strange mutable var commands; removed_commands: refer to old commands; misc tuning; diff -r a1d394600a92 -r 3e655d0ff936 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)) } }