src/Tools/jEdit/src/prover/State.scala
author wenzelm
Thu, 03 Sep 2009 17:26:25 +0200
changeset 34700 0e1d098940a7
parent 34697 3d4874198e62
child 34703 ff037c17332a
permissions -rw-r--r--
tuned imports;
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 {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    39
      case RootInfo() | HighlightInfo(_) => true
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 {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    46
      case TypeInfo(_) => true
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 {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    53
        case TypeInfo(i) => i
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 {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    60
      case RefInfo(_, _, _, _) => true
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] =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    64
    refs.find(t => t.start <= pos && t.stop > pos)
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 =
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    73
    message match {
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    74
      case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.WRITELN) :: _, _)
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    75
        | XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.PRIORITY) :: _, _)
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    76
        | XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.WARNING) :: _, _) =>
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    77
        add_result(message)
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    78
      case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.ERROR) :: _, _) =>
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    79
        set_status(Command.Status.FAILED).add_result(message)
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    80
      case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.STATUS) :: _, elems) =>
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    81
        (this /: elems) ((st, e) =>
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    82
          e match {
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    83
            // command status
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    84
            case XML.Elem(Markup.UNPROCESSED, _, _) =>
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    85
              st.set_status(Command.Status.UNPROCESSED)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    86
            case XML.Elem(Markup.FINISHED, _, _) =>
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    87
              st.set_status(Command.Status.FINISHED)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    88
            case XML.Elem(Markup.FAILED, _, _) =>
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    89
              st.set_status(Command.Status.FAILED)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    90
            case XML.Elem(kind, attr, body) =>
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    91
              val (begin, end) = Position.offsets_of(attr)
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    92
              if (begin.isDefined && end.isDefined) {
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    93
                if (kind == Markup.ML_TYPING) {
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    94
                  val info = body.first.asInstanceOf[XML.Text].content
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    95
                  st.add_markup(command.markup_node(begin.get - 1, end.get - 1, TypeInfo(info)))
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    96
                }
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    97
                else if (kind == Markup.ML_REF) {
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    98
                  body match {
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    99
                    case List(XML.Elem(Markup.ML_DEF, attr, _)) =>
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   100
                      st.add_markup(command.markup_node(
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   101
                        begin.get - 1, end.get - 1,
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   102
                        RefInfo(
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   103
                          Position.file_of(attr),
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   104
                          Position.line_of(attr),
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   105
                          Position.id_of(attr),
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   106
                          Position.offset_of(attr))))
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   107
                    case _ => st
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   108
                  }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   109
                }
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   110
                else {
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   111
                  st.add_markup(command.markup_node(begin.get - 1, end.get - 1, HighlightInfo(kind)))
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   112
                }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   113
              }
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   114
              else st
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   115
            case _ => st
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   116
          })
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   117
      case _ =>
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   118
        System.err.println("ignored: " + message)
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   119
        this
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   120
    }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   121
    command.changed()
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   122
    changed
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   123
  }
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   124
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   125
}