src/Tools/jEdit/src/prover/Prover.scala
author wenzelm
Wed, 17 Jun 2009 00:25:34 +0200
changeset 34608 44f9edc5801b
parent 34601 f37cd618f582
child 34610 14e4d83f1000
permissions -rw-r--r--
basic keyword completions via isabelle.Scan.Lexicon;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34407
aad6834ba380 added some headers and comments;
wenzelm
parents: 34404
diff changeset
     1
/*
34501
01021d160be7 beginnings of global document state;
wenzelm
parents: 34499
diff changeset
     2
 * Higher-level prover communication: interactive document model
34407
aad6834ba380 added some headers and comments;
wenzelm
parents: 34404
diff changeset
     3
 *
aad6834ba380 added some headers and comments;
wenzelm
parents: 34404
diff changeset
     4
 * @author Johannes Hölzl, TU Munich
aad6834ba380 added some headers and comments;
wenzelm
parents: 34404
diff changeset
     5
 * @author Fabian Immler, TU Munich
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
     6
 * @author Makarius
34407
aad6834ba380 added some headers and comments;
wenzelm
parents: 34404
diff changeset
     7
 */
aad6834ba380 added some headers and comments;
wenzelm
parents: 34404
diff changeset
     8
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
     9
package isabelle.prover
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
    10
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
    11
34497
184fda8cce04 more explicit indication of mutable collections;
wenzelm
parents: 34494
diff changeset
    12
import scala.collection.mutable
34475
f963335dbc6b implemented IsabelleSideKickParser.complete
immler@in.tum.de
parents: 34471
diff changeset
    13
import scala.collection.immutable.{TreeSet}
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
    14
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    15
import scala.actors.Actor
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    16
import scala.actors.Actor._
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    17
34456
14367c0715e8 replaced EventSource by EventBus;
wenzelm
parents: 34454
diff changeset
    18
import org.gjt.sp.util.Log
14367c0715e8 replaced EventSource by EventBus;
wenzelm
parents: 34454
diff changeset
    19
34501
01021d160be7 beginnings of global document state;
wenzelm
parents: 34499
diff changeset
    20
import isabelle.jedit.Isabelle
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    21
import isabelle.proofdocument.{StructureChange, ProofDocument, Text, Token}
34489
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    22
import isabelle.IsarDocument
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
    23
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    24
object ProverEvents {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    25
  case class Activate
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    26
  case class SetEventBus(bus: EventBus[StructureChange])
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    27
  case class SetIsCommandKeyword(is_command_keyword: String => Boolean)
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    28
}
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
    29
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    30
class Prover(isabelle_system: IsabelleSystem, logic: String) extends Actor
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
    31
{
34504
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    32
  /* prover process */
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    33
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    34
  private val process =
34504
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    35
  {
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    36
    val results = new EventBus[IsabelleProcess.Result] + handle_result
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    37
    results.logger = Log.log(Log.ERROR, null, _)
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    38
    new IsabelleProcess(isabelle_system, results, "-m", "xsymbols", logic) with IsarDocument
34504
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    39
  }
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    40
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    41
  def stop() { process.kill }
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    42
4bd676662792 eliminated Prover.start -- part of main constructor;
wenzelm
parents: 34503
diff changeset
    43
  
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    44
  /* document state information */
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    45
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    46
  private val states = new mutable.HashMap[IsarDocument.State_ID, Command] with
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    47
    mutable.SynchronizedMap[IsarDocument.State_ID, Command]
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    48
  private val commands = new mutable.HashMap[IsarDocument.Command_ID, Command] with
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    49
    mutable.SynchronizedMap[IsarDocument.Command_ID, Command]
34544
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
    50
  private var document_versions = List(ProofDocument.empty)
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
    51
  private val document_id0 = ProofDocument.empty.id
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    52
34568
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents: 34564
diff changeset
    53
  def command(id: IsarDocument.Command_ID): Option[Command] = commands.get(id)
34544
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
    54
  def document = document_versions.head
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    55
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    56
  private var initialized = false
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    57
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    58
  
34485
6475bfb4ff99 joined Document with ProofDocument;
wenzelm
parents: 34483
diff changeset
    59
  /* outer syntax keywords */
6475bfb4ff99 joined Document with ProofDocument;
wenzelm
parents: 34483
diff changeset
    60
34465
ccadbf63e320 added EventBus for new command- or keyword-declarations
immler@in.tum.de
parents: 34462
diff changeset
    61
  val decl_info = new EventBus[(String, String)]
34489
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    62
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    63
  private val keyword_decls =
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    64
    new mutable.HashSet[String] with mutable.SynchronizedSet[String] {
34489
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    65
    override def +=(name: String) = {
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    66
      decl_info.event(name, OuterKeyword.MINOR)
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    67
      super.+=(name)
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    68
    }
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    69
  }
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    70
  private val command_decls =
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
    71
    new mutable.HashMap[String, String] with mutable.SynchronizedMap[String, String] {
34471
1dac47492863 decl_info: cover both commands and keywords, with kind;
wenzelm
parents: 34466
diff changeset
    72
    override def +=(entry: (String, String)) = {
1dac47492863 decl_info: cover both commands and keywords, with kind;
wenzelm
parents: 34466
diff changeset
    73
      decl_info.event(entry)
1dac47492863 decl_info: cover both commands and keywords, with kind;
wenzelm
parents: 34466
diff changeset
    74
      super.+=(entry)
34465
ccadbf63e320 added EventBus for new command- or keyword-declarations
immler@in.tum.de
parents: 34462
diff changeset
    75
    }
ccadbf63e320 added EventBus for new command- or keyword-declarations
immler@in.tum.de
parents: 34462
diff changeset
    76
  }
34485
6475bfb4ff99 joined Document with ProofDocument;
wenzelm
parents: 34483
diff changeset
    77
6475bfb4ff99 joined Document with ProofDocument;
wenzelm
parents: 34483
diff changeset
    78
34608
44f9edc5801b basic keyword completions via isabelle.Scan.Lexicon;
wenzelm
parents: 34601
diff changeset
    79
  /* completions */  // FIXME add symbols, symbol names, symbol abbrevs
34489
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    80
34608
44f9edc5801b basic keyword completions via isabelle.Scan.Lexicon;
wenzelm
parents: 34601
diff changeset
    81
  var _completions = Scan.Lexicon()
44f9edc5801b basic keyword completions via isabelle.Scan.Lexicon;
wenzelm
parents: 34601
diff changeset
    82
  def completions(word: CharSequence) = _completions.completions(word)
34582
5d5d253c7c29 superficial tuning;
wenzelm
parents: 34579
diff changeset
    83
  decl_info += (p => _completions += p._1)
34489
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    84
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    85
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    86
  /* event handling */
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    87
34456
14367c0715e8 replaced EventSource by EventBus;
wenzelm
parents: 34454
diff changeset
    88
  val activated = new EventBus[Unit]
14367c0715e8 replaced EventSource by EventBus;
wenzelm
parents: 34454
diff changeset
    89
  val output_info = new EventBus[String]
34582
5d5d253c7c29 superficial tuning;
wenzelm
parents: 34579
diff changeset
    90
  var change_receiver: Actor = null
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
    91
  
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
    92
  private def handle_result(result: IsabelleProcess.Result)
34489
7b7ccf0ff629 replaced java.util.Property by plain association list;
wenzelm
parents: 34485
diff changeset
    93
  {
34555
7c001369956a included information on ML status messages in Sidekick's status-window
immler@in.tum.de
parents: 34554
diff changeset
    94
    // helper-function (move to XML?)
34601
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
    95
    def get_attr(attrs: List[(String, String)], name: String): Option[String] =
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
    96
      attrs.find(p => p._1 == name).map(_._2)
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
    97
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
    98
    def get_offsets(attrs: List[(String, String)]): (Option[Int], Option[Int]) =
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
    99
    {
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
   100
      val begin = get_attr(attrs, Markup.OFFSET).map(_.toInt - 1)
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
   101
      val end = get_attr(attrs, Markup.END_OFFSET).map(_.toInt - 1)
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
   102
      (begin, if (end.isDefined) end else begin.map(_ + 1))
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
   103
    }
34555
7c001369956a included information on ML status messages in Sidekick's status-window
immler@in.tum.de
parents: 34554
diff changeset
   104
34539
5d88e0681d44 merged; resolved conflicts (kept own versions)
immler@in.tum.de
parents: 34538 34533
diff changeset
   105
    def command_change(c: Command) = this ! c
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   106
    val (running, command) =
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   107
      result.props.find(p => p._1 == Markup.ID) match {
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   108
        case None => (false, null)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   109
        case Some((_, id)) =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   110
          if (commands.contains(id)) (false, commands(id))
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   111
          else if (states.contains(id)) (true, states(id))
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   112
          else (false, null)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   113
      }
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   114
34589
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   115
    if (result.kind == IsabelleProcess.Kind.STDOUT ||
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   116
        result.kind == IsabelleProcess.Kind.STDIN)
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   117
      output_info.event(result.toString)
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   118
    else {
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   119
      result.kind match {
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   120
34589
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   121
        case IsabelleProcess.Kind.WRITELN
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   122
        | IsabelleProcess.Kind.PRIORITY
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   123
        | IsabelleProcess.Kind.WARNING
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   124
        | IsabelleProcess.Kind.ERROR =>
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   125
          if (command != null) {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   126
            if (result.kind == IsabelleProcess.Kind.ERROR)
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   127
              command.status = Command.Status.FAILED
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   128
            command.add_result(running, process.parse_message(result))
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   129
            command_change(command)
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   130
          } else {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   131
            output_info.event(result.toString)
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   132
          }
34404
98155c35d252 delayed repainting new phase in buffer and overview;
immler@in.tum.de
parents: 34401
diff changeset
   133
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   134
        case IsabelleProcess.Kind.STATUS =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   135
          //{{{ handle all kinds of status messages here
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   136
          process.parse_message(result) match {
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   137
            case XML.Elem(Markup.MESSAGE, _, elems) =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   138
              for (elem <- elems) {
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   139
                elem match {
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   140
                  //{{{
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   141
                  // command and keyword declarations
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   142
                  case XML.Elem(Markup.COMMAND_DECL,
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   143
                      (Markup.NAME, name) :: (Markup.KIND, kind) :: _, _) =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   144
                    command_decls += (name -> kind)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   145
                  case XML.Elem(Markup.KEYWORD_DECL, (Markup.NAME, name) :: _, _) =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   146
                    keyword_decls += name
34404
98155c35d252 delayed repainting new phase in buffer and overview;
immler@in.tum.de
parents: 34401
diff changeset
   147
34589
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   148
                  // process ready (after initialization)
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   149
                  case XML.Elem(Markup.READY, _, _)
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   150
                  if !initialized =>
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   151
                    initialized = true
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   152
                    Swing.now { this ! ProverEvents.Activate }
d461e5506d02 handle_result: activate via explicit status "ready" (cf. http://isabelle.in.tum.de/repos/isabelle/rev/ce169bd37fc0);
wenzelm
parents: 34582
diff changeset
   153
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   154
                  // document edits
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   155
                  case XML.Elem(Markup.EDITS, (Markup.ID, doc_id) :: _, edits)
34582
5d5d253c7c29 superficial tuning;
wenzelm
parents: 34579
diff changeset
   156
                  if document_versions.exists(_.id == doc_id) =>
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   157
                    output_info.event(result.toString)
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   158
                    for {
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   159
                      XML.Elem(Markup.EDIT, (Markup.ID, cmd_id) :: (Markup.STATE, state_id) :: _, _)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   160
                        <- edits
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   161
                    } {
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   162
                      if (commands.contains(cmd_id)) {
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   163
                        val cmd = commands(cmd_id)
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   164
                        if (cmd.state_id != null) states -= cmd.state_id
34540
immler@in.tum.de
parents: 34539
diff changeset
   165
                        states(state_id) = cmd
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   166
                        cmd.state_id = state_id
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   167
                        cmd.status = Command.Status.UNPROCESSED
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   168
                        command_change(cmd)
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   169
                      }
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   170
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   171
                    }
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   172
                  // command status
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   173
                  case XML.Elem(Markup.UNPROCESSED, _, _)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   174
                  if command != null =>
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   175
                    output_info.event(result.toString)
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   176
                    command.status = Command.Status.UNPROCESSED
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   177
                    command_change(command)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   178
                  case XML.Elem(Markup.FINISHED, _, _)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   179
                  if command != null =>
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   180
                    output_info.event(result.toString)
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   181
                    command.status = Command.Status.FINISHED
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   182
                    command_change(command)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   183
                  case XML.Elem(Markup.FAILED, _, _)
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   184
                  if command != null =>
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   185
                    output_info.event(result.toString)
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   186
                    command.status = Command.Status.FAILED
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   187
                    command_change(command)
34570
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   188
                  case XML.Elem(kind, attr, body)
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   189
                  if command != null =>
34601
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
   190
                    val (begin, end) = get_offsets(attr)
34576
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   191
                    if (begin.isDefined && end.isDefined) {
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   192
                      if (kind == Markup.ML_TYPING) {
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   193
                        val info = body.first.asInstanceOf[XML.Text].content
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   194
                        command.markup_root += command.markup_node(begin.get, end.get, TypeInfo(info))
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   195
                      } else if (kind == Markup.ML_REF) {
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   196
                        body match {
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   197
                          case List(XML.Elem(Markup.ML_DEF, attr, _)) =>
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   198
                            command.markup_root += command.markup_node(begin.get, end.get,
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   199
                              RefInfo(get_attr(attr, Markup.FILE),
34582
5d5d253c7c29 superficial tuning;
wenzelm
parents: 34579
diff changeset
   200
                                      get_attr(attr, Markup.LINE).map(_.toInt),
34576
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   201
                                      get_attr(attr, Markup.ID),
34582
5d5d253c7c29 superficial tuning;
wenzelm
parents: 34579
diff changeset
   202
                                      get_attr(attr, Markup.OFFSET).map(_.toInt)))
34576
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   203
                          case _ =>
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   204
                        }
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   205
                      } else {
b86c54be2fe0 check presence of begin, end in attributes
immler@in.tum.de
parents: 34570
diff changeset
   206
                        command.markup_root += command.markup_node(begin.get, end.get, HighlightInfo(kind))
34570
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   207
                      }
34557
647a2430d1cd immutable markup-nodes;
immler@in.tum.de
parents: 34556
diff changeset
   208
                    }
34555
7c001369956a included information on ML status messages in Sidekick's status-window
immler@in.tum.de
parents: 34554
diff changeset
   209
                    command_change(command)
34570
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   210
                  case XML.Elem(kind, attr, body)
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   211
                  if command == null =>
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   212
                    // TODO: This is mostly irrelevant information on removed commands, but it can
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   213
                    // also be outer-syntax-markup since there is no id in props (fix that?)
34601
f37cd618f582 more robust get_offsets;
wenzelm
parents: 34589
diff changeset
   214
                    val (begin, end) = get_offsets(attr)
34570
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   215
                    val markup_id = get_attr(attr, Markup.ID)
34579
f5c3ad245539 outer syntax could clash with status on removed commands
immler@in.tum.de
parents: 34578
diff changeset
   216
                    val outer = isabelle.jedit.DynamicTokenMarker.is_outer(kind)
f5c3ad245539 outer syntax could clash with status on removed commands
immler@in.tum.de
parents: 34578
diff changeset
   217
                    if (outer && !running && begin.isDefined && end.isDefined && markup_id.isDefined)
34570
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   218
                      commands.get(markup_id.get).map (cmd => {
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   219
                        cmd.markup_root += cmd.markup_node(begin.get, end.get, OuterInfo(kind))
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   220
                        command_change(cmd)
c3bdaea2dd6a improved handling of markup-information with command=null
immler@in.tum.de
parents: 34568
diff changeset
   221
                      })
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   222
                  case _ =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   223
                  //}}}
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   224
                }
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   225
              }
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   226
            case _ =>
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   227
          }
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   228
          //}}}
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   229
34509
839d1f0b2dd1 eliminated Command.Status.REMOVE/REMOVED;
wenzelm
parents: 34505
diff changeset
   230
        case _ =>
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
   231
      }
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
   232
    }
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
   233
  }
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   234
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   235
  def act() {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   236
    import ProverEvents._
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   237
    loop {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   238
      react {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   239
        case Activate => {
34544
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   240
            val old = document
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   241
            val (doc, structure_change) = old.activate
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   242
            document_versions ::= doc
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   243
            edit_document(old.id, doc.id, structure_change)
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   244
        }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   245
        case SetIsCommandKeyword(f) => {
34544
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   246
            val old = document
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   247
            val doc = old.set_command_keyword(f)
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   248
            document_versions ::= doc
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   249
            edit_document(old.id, doc.id, StructureChange(None, Nil, Nil))
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   250
        }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   251
        case change: Text.Change => {
34544
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   252
            val old = document
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   253
            val (doc, structure_change) = old.text_changed(change)
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   254
            document_versions ::= doc
56217d219e27 proofdocument-versions get id from changes
immler@in.tum.de
parents: 34540
diff changeset
   255
            edit_document(old.id, doc.id, structure_change)
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   256
        }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   257
        case command: Command => {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   258
            //state of command has changed
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   259
            change_receiver ! command
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   260
        }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   261
      }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   262
    }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   263
  }
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   264
  
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   265
  def set_document(change_receiver: Actor, path: String) {
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   266
    this.change_receiver = change_receiver
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   267
    this ! ProverEvents.SetIsCommandKeyword(command_decls.contains)
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   268
    process.begin_document(document_id0, path)
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
   269
  }
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   270
34538
20bfcca24658 Prover as actor managing ProofDocument-versions (removed EventBus structural_changes);
immler@in.tum.de
parents: 34532
diff changeset
   271
  private def edit_document(old_id: String, document_id: String, changes: StructureChange) = Swing.now
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   272
  {
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   273
    val removes =
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   274
      for (cmd <- changes.removed_commands) yield {
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   275
        commands -= cmd.id
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   276
        if (cmd.state_id != null) states -= cmd.state_id
34554
7dc6c231da40 abs. stops, markup nodes depend on doc-version;
immler@in.tum.de
parents: 34544
diff changeset
   277
        changes.before_change.map(_.id).getOrElse(document_id0) -> None
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   278
      }
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   279
    val inserts =
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   280
      for (cmd <- changes.added_commands) yield {
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   281
        commands += (cmd.id -> cmd)
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   282
        process.define_command(cmd.id, isabelle_system.symbols.encode(cmd.content))
34539
5d88e0681d44 merged; resolved conflicts (kept own versions)
immler@in.tum.de
parents: 34538 34533
diff changeset
   283
        (document.commands.prev(cmd).map(_.id).getOrElse(document_id0)) -> Some(cmd.id)
34533
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   284
      }
35308320713a preliminary/failed attempt to use the new IsarDocument access model to the prover;
wenzelm
parents: 34509
diff changeset
   285
    process.edit_document(old_id, document_id, removes.reverse ++ inserts)
34318
c13e168a8ae6 original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
wenzelm
parents:
diff changeset
   286
  }
34453
dfa99a91951b eliminated hardwired string constants;
wenzelm
parents: 34452
diff changeset
   287
}