src/Tools/jEdit/src/prover/State.scala
author wenzelm
Sun, 06 Sep 2009 15:43:02 +0200
changeset 34715 826e476947f9
parent 34709 2f0c18f9b6c7
child 34717 3f32e08bbb6c
permissions -rw-r--r--
treat all messages except status as results; report ignored status reports; invoke command.changed only for actual change; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     1
/*
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     2
 * Accumulating results from prover
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     3
 *
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     4
 * @author Fabian Immler, TU Munich
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
     5
 * @author Makarius
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     6
 */
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     7
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     8
package isabelle.prover
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     9
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    10
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    11
class State(
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    12
  val command: Command,
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    13
  val status: Command.Status.Value,
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    14
  rev_results: List[XML.Tree],
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    15
  val markup_root: MarkupNode)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    16
{
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    17
  def this(command: Command) =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    18
    this(command, Command.Status.UNPROCESSED, Nil, command.empty_root_node)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    19
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    20
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    21
  /* content */
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    22
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    23
  private def set_status(st: Command.Status.Value): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    24
    new State(command, st, rev_results, markup_root)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    25
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    26
  private def add_result(res: XML.Tree): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    27
    new State(command, status, res :: rev_results, markup_root)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    28
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    29
  private def add_markup(markup: MarkupNode): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    30
    new State(command, status, rev_results, markup_root + markup)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    31
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    32
  lazy val results = rev_results.reverse
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    33
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    34
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    35
  /* markup */
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    36
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    37
  lazy val highlight_node: MarkupNode =
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    38
  {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    39
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    40
      case Command.RootInfo | Command.HighlightInfo(_) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    41
      case _ => false
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    42
    }).head
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    43
  }
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    44
34709
2f0c18f9b6c7 minor tuning;
wenzelm
parents: 34707
diff changeset
    45
  private lazy val types =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    46
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    47
      case Command.TypeInfo(_) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    48
      case _ => false }).flatten(_.flatten)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    49
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    50
  def type_at(pos: Int): String =
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    51
  {
34709
2f0c18f9b6c7 minor tuning;
wenzelm
parents: 34707
diff changeset
    52
    types.find(t => t.start <= pos && pos < t.stop).map(t =>
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    53
      t.content + ": " + (t.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    54
        case Command.TypeInfo(i) => i
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    55
        case _ => "" })).
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    56
      getOrElse(null)
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    57
  }
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    58
34709
2f0c18f9b6c7 minor tuning;
wenzelm
parents: 34707
diff changeset
    59
  private lazy val refs =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    60
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    61
      case Command.RefInfo(_, _, _, _) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    62
      case _ => false }).flatten(_.flatten)
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    63
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    64
  def ref_at(pos: Int): Option[MarkupNode] =
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    65
    refs.find(t => t.start <= pos && pos < t.stop)
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    66
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    67
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    68
  /* message dispatch */
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    69
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    70
  def + (message: XML.Tree): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    71
  {
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    72
    val changed: State =
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    73
      message match {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    74
        case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.STATUS) :: _, elems) =>
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    75
          (this /: elems)((state, elem) =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    76
            elem match {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    77
              case XML.Elem(Markup.UNPROCESSED, _, _) => state.set_status(Command.Status.UNPROCESSED)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    78
              case XML.Elem(Markup.FINISHED, _, _) => state.set_status(Command.Status.FINISHED)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    79
              case XML.Elem(Markup.FAILED, _, _) => state.set_status(Command.Status.FAILED)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    80
              case XML.Elem(kind, atts, body) =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    81
                val (begin, end) = Position.offsets_of(atts)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    82
                if (begin.isEmpty || end.isEmpty) state
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    83
                else if (kind == Markup.ML_TYPING) {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    84
                  val info = body.first.asInstanceOf[XML.Text].content   // FIXME proper match!?
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    85
                  state.add_markup(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    86
                    command.markup_node(begin.get - 1, end.get - 1, Command.TypeInfo(info)))
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    87
                }
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    88
                else if (kind == Markup.ML_REF) {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    89
                  body match {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    90
                    case List(XML.Elem(Markup.ML_DEF, atts, _)) =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    91
                      state.add_markup(command.markup_node(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    92
                        begin.get - 1, end.get - 1,
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    93
                        Command.RefInfo(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    94
                          Position.file_of(atts),
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    95
                          Position.line_of(atts),
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    96
                          Position.id_of(atts),
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    97
                          Position.offset_of(atts))))
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    98
                    case _ => state
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    99
                  }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   100
                }
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   101
                else {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   102
                  state.add_markup(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   103
                    command.markup_node(begin.get - 1, end.get - 1, Command.HighlightInfo(kind)))
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   104
                }
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   105
              case _ =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   106
                System.err.println("ignored status report: " + elem)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   107
                state
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   108
            })
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   109
        case _ => add_result(message)
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   110
      }
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   111
    if (!(this eq changed)) command.changed()
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   112
    changed
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   113
  }
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   114
}