src/Tools/jEdit/src/proofdocument/state.scala
author wenzelm
Wed, 30 Dec 2009 20:26:08 +0100
changeset 34817 b4efd0ef2f3e
parent 34813 f0107bc96961
child 34859 f986d84dd44b
permissions -rw-r--r--
tuned signature of isabelle.Position;
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
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
     8
package isabelle.proofdocument
34675
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,
34813
f0107bc96961 more explicit modeling of Command and Command_State as Session.Entity;
wenzelm
parents: 34777
diff changeset
    14
  val rev_results: List[XML.Tree],
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    15
  val markup_root: Markup_Text)
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) =
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    18
    this(command, Command.Status.UNPROCESSED, Nil, command.empty_markup)
34697
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
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    29
  private def add_markup(node: Markup_Tree): State =
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    30
    new State(command, status, rev_results, markup_root + node)
34697
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
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    37
  lazy val highlight: Markup_Text =
34688
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 {
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    40
      case Command.HighlightInfo(_) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    41
      case _ => false
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    42
    })
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    43
  }
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    44
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    45
  private lazy val types: List[Markup_Node] =
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
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    48
      case _ => false }).flatten
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    49
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    50
  def type_at(pos: Int): Option[String] =
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    51
  {
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    52
    types.find(t => t.start <= pos && pos < t.stop) match {
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    53
      case Some(t) =>
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    54
        t.info match {
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    55
          case Command.TypeInfo(ty) => Some(command.content(t.start, t.stop) + ": " + ty)
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    56
          case _ => None
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    57
        }
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    58
      case None => None
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    59
    }
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    60
  }
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    61
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    62
  private lazy val refs: List[Markup_Node] =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    63
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    64
      case Command.RefInfo(_, _, _, _) => true
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    65
      case _ => false }).flatten
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    66
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    67
  def ref_at(pos: Int): Option[Markup_Node] =
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    68
    refs.find(t => t.start <= pos && pos < t.stop)
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    69
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    70
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    71
  /* message dispatch */
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    72
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    73
  def + (session: Session, message: XML.Tree): State =
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    74
  {
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    75
    val changed: State =
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    76
      message match {
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    77
        case XML.Elem(Markup.MESSAGE, (Markup.CLASS, Markup.STATUS) :: _, elems) =>
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    78
          (this /: elems)((state, elem) =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    79
            elem match {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    80
              case XML.Elem(Markup.UNPROCESSED, _, _) => state.set_status(Command.Status.UNPROCESSED)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    81
              case XML.Elem(Markup.FINISHED, _, _) => state.set_status(Command.Status.FINISHED)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    82
              case XML.Elem(Markup.FAILED, _, _) => state.set_status(Command.Status.FAILED)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    83
              case XML.Elem(kind, atts, body) =>
34817
b4efd0ef2f3e tuned signature of isabelle.Position;
wenzelm
parents: 34813
diff changeset
    84
                val (begin, end) = Position.get_offsets(atts)
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    85
                if (begin.isEmpty || end.isEmpty) state
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    86
                else if (kind == Markup.ML_TYPING) {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    87
                  val info = body.first.asInstanceOf[XML.Text].content   // FIXME proper match!?
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    88
                  state.add_markup(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    89
                    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
    90
                }
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    91
                else if (kind == Markup.ML_REF) {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    92
                  body match {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    93
                    case List(XML.Elem(Markup.ML_DEF, atts, _)) =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    94
                      state.add_markup(command.markup_node(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    95
                        begin.get - 1, end.get - 1,
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
    96
                        Command.RefInfo(
34817
b4efd0ef2f3e tuned signature of isabelle.Position;
wenzelm
parents: 34813
diff changeset
    97
                          Position.get_file(atts),
b4efd0ef2f3e tuned signature of isabelle.Position;
wenzelm
parents: 34813
diff changeset
    98
                          Position.get_line(atts),
b4efd0ef2f3e tuned signature of isabelle.Position;
wenzelm
parents: 34813
diff changeset
    99
                          Position.get_id(atts),
b4efd0ef2f3e tuned signature of isabelle.Position;
wenzelm
parents: 34813
diff changeset
   100
                          Position.get_offset(atts))))
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   101
                    case _ => state
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   102
                  }
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
   103
                }
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   104
                else {
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   105
                  state.add_markup(
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   106
                    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
   107
                }
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   108
              case _ =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   109
                System.err.println("ignored status report: " + elem)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   110
                state
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   111
            })
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   112
        case _ => add_result(message)
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   113
      }
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
   114
    if (!(this eq changed)) session.command_change.event(command)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   115
    changed
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   116
  }
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   117
}