src/Tools/jEdit/src/prover/State.scala
author wenzelm
Sat, 05 Sep 2009 00:35:37 +0200
changeset 34707 cc5d388fcbf2
parent 34703 ff037c17332a
child 34709 2f0c18f9b6c7
permissions -rw-r--r--
eliminated MarkupInfo, moved particular variants into object Command;
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
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     5
 */
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     6
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     7
package isabelle.prover
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     8
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
     9
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    10
class State(
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    11
  val command: Command,
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    12
  val status: Command.Status.Value,
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    13
  rev_results: List[XML.Tree],
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    14
  val markup_root: MarkupNode)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    15
{
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    16
  def this(command: Command) =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    17
    this(command, Command.Status.UNPROCESSED, Nil, command.empty_root_node)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    18
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    19
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    20
  /* content */
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    21
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    22
  private def set_status(st: Command.Status.Value): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    23
    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
    24
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    25
  private def add_result(res: XML.Tree): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    26
    new State(command, status, res :: rev_results, markup_root)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    27
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    28
  private def add_markup(markup: MarkupNode): State =
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    29
    new State(command, status, rev_results, markup_root + markup)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    30
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    31
  lazy val results = rev_results.reverse
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    32
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    33
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    34
  /* markup */
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    35
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    36
  lazy val highlight_node: MarkupNode =
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    37
  {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    38
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    39
      case Command.RootInfo | Command.HighlightInfo(_) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    40
      case _ => false
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    41
    }).head
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    42
  }
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    43
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    44
  lazy private val types =
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    45
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    46
      case Command.TypeInfo(_) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    47
      case _ => false }).flatten(_.flatten)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    48
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    49
  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
    50
  {
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    51
    types.find(t => t.start <= pos && t.stop > pos).map(t =>
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    52
      t.content + ": " + (t.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    53
        case Command.TypeInfo(i) => i
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    54
        case _ => "" })).
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    55
      getOrElse(null)
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    56
  }
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    57
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    58
  lazy private val refs =
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    59
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    60
      case Command.RefInfo(_, _, _, _) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    61
      case _ => false }).flatten(_.flatten)
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    62
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    63
  def ref_at(pos: Int): Option[MarkupNode] =
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    64
    refs.find(t => t.start <= pos && pos < t.stop)
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    65
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    66
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
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.WRITELN) :: _, _)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    75
          | XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.PRIORITY) :: _, _)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    76
          | XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.WARNING) :: _, _) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    77
          add_result(message)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    78
        case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.ERROR) :: _, _) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    79
          set_status(Command.Status.FAILED).add_result(message)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    80
        case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.STATUS) :: _, elems) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    81
          (this /: elems) ((st, e) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    82
            e match {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    83
              // command status
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    84
              case XML.Elem(Markup.UNPROCESSED, _, _) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    85
                st.set_status(Command.Status.UNPROCESSED)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    86
              case XML.Elem(Markup.FINISHED, _, _) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    87
                st.set_status(Command.Status.FINISHED)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    88
              case XML.Elem(Markup.FAILED, _, _) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    89
                st.set_status(Command.Status.FAILED)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    90
              case XML.Elem(kind, attr, body) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    91
                val (begin, end) = Position.offsets_of(attr)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    92
                if (begin.isDefined && end.isDefined) {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    93
                  if (kind == Markup.ML_TYPING) {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    94
                    val info = body.first.asInstanceOf[XML.Text].content
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    95
                    st.add_markup(
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    96
                      command.markup_node(begin.get - 1, end.get - 1, Command.TypeInfo(info)))
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    97
                  }
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    98
                  else if (kind == Markup.ML_REF) {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    99
                    body match {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   100
                      case List(XML.Elem(Markup.ML_DEF, attr, _)) =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   101
                        st.add_markup(command.markup_node(
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   102
                          begin.get - 1, end.get - 1,
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
   103
                          Command.RefInfo(
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   104
                            Position.file_of(attr),
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   105
                            Position.line_of(attr),
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   106
                            Position.id_of(attr),
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   107
                            Position.offset_of(attr))))
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   108
                      case _ => st
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   109
                    }
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   110
                  }
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   111
                  else {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
   112
                    st.add_markup(
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
   113
                      command.markup_node(begin.get - 1, end.get - 1, Command.HighlightInfo(kind)))
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   114
                  }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   115
                }
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   116
                else st
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   117
              case _ => st
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   118
            })
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   119
        case _ =>
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   120
          System.err.println("ignored: " + message)
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   121
          this
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   122
      }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   123
    command.changed()
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   124
    changed
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   125
  }
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   126
}