src/Pure/PIDE/state.scala
author wenzelm
Sun, 30 May 2010 18:23:50 +0200
changeset 37197 953fc4983439
parent 37189 2b4e52ecf6fc
child 37199 48a4414eb846
permissions -rw-r--r--
more detailed token markup, including command kind as sub_kind; type-safe access to Command.HighlightInfo;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36676
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 36012
diff changeset
     1
/*  Title:      Pure/PIDE/state.scala
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 36012
diff changeset
     2
    Author:     Fabian Immler, TU Munich
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 36012
diff changeset
     3
    Author:     Makarius
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 36012
diff changeset
     4
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 36012
diff changeset
     5
Accumulating results from prover.
ac7961d42ac3 some rearrangement of Scala sources;
wenzelm
parents: 36012
diff changeset
     6
*/
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
     7
34871
e596a0b71f3c incorporate "proofdocument" part into main Isabelle/Pure.jar -- except for html_panel.scala, which depends on external library (Lobo/Cobra browser);
wenzelm
parents: 34859
diff changeset
     8
package isabelle
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,
37186
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    14
  val forks: Int,
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    15
  val reverse_results: List[XML.Tree],
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    16
  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
    17
{
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    18
  def this(command: Command) =
37186
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    19
    this(command, Command.Status.UNPROCESSED, 0, Nil, command.empty_markup)
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    20
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    21
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    22
  /* content */
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    23
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    24
  private def set_status(st: Command.Status.Value): State =
37186
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    25
    new State(command, st, forks, reverse_results, markup_root)
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    26
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    27
  private def add_forks(i: Int): State =
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    28
    new State(command, status, forks + i, reverse_results, markup_root)
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    29
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    30
  private def add_result(res: XML.Tree): State =
37186
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    31
    new State(command, status, forks, res :: reverse_results, markup_root)
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    32
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    33
  private def add_markup(node: Markup_Tree): State =
37186
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    34
    new State(command, status, forks, reverse_results, markup_root + node)
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    35
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    36
  lazy val results = reverse_results.reverse
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    37
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    38
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    39
  /* markup */
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    40
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    41
  lazy val highlight: Markup_Text =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    42
  {
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    43
    markup_root.filter(_.info match {
37197
953fc4983439 more detailed token markup, including command kind as sub_kind;
wenzelm
parents: 37189
diff changeset
    44
      case Command.HighlightInfo(_, _) => true
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    45
      case _ => false
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    46
    })
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    47
  }
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    48
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    49
  private lazy val types: List[Markup_Node] =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    50
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    51
      case Command.TypeInfo(_) => true
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    52
      case _ => false }).flatten
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    53
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    54
  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
    55
  {
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    56
    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
    57
      case Some(t) =>
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    58
        t.info match {
34859
f986d84dd44b renamed Command.content to source;
wenzelm
parents: 34817
diff changeset
    59
          case Command.TypeInfo(ty) => Some(command.source(t.start, t.stop) + ": " + ty)
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    60
          case _ => None
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    61
        }
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    62
      case None => None
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    63
    }
34676
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    64
  }
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
    65
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    66
  private lazy val refs: List[Markup_Node] =
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    67
    markup_root.filter(_.info match {
34707
cc5d388fcbf2 eliminated MarkupInfo, moved particular variants into object Command;
wenzelm
parents: 34703
diff changeset
    68
      case Command.RefInfo(_, _, _, _) => true
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    69
      case _ => false }).flatten
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    70
34717
3f32e08bbb6c sidekick root data: set buffer length to avoid crash of initial caret move;
wenzelm
parents: 34715
diff changeset
    71
  def ref_at(pos: Int): Option[Markup_Node] =
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
    72
    refs.find(t => t.start <= pos && pos < t.stop)
34688
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    73
1310dc269b4a lazy fields
immler@in.tum.de
parents: 34676
diff changeset
    74
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    75
  /* message dispatch */
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    76
37178
d52f934f8ff6 accumulate only local results -- no proper history support yet;
wenzelm
parents: 37149
diff changeset
    77
  def accumulate(message: XML.Tree): State =
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    78
    message match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    79
      case XML.Elem(Markup.STATUS, _, elems) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    80
        (this /: elems)((state, elem) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    81
          elem match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    82
            case XML.Elem(Markup.UNPROCESSED, _, _) => state.set_status(Command.Status.UNPROCESSED)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    83
            case XML.Elem(Markup.FINISHED, _, _) => state.set_status(Command.Status.FINISHED)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    84
            case XML.Elem(Markup.FAILED, _, _) => state.set_status(Command.Status.FAILED)
37186
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    85
            case XML.Elem(Markup.FORKED, _, _) => state.add_forks(1)
349e9223c685 explicit markup for forked goals, as indicated by Goal.fork;
wenzelm
parents: 37178
diff changeset
    86
            case XML.Elem(Markup.JOINED, _, _) => state.add_forks(-1)
37178
d52f934f8ff6 accumulate only local results -- no proper history support yet;
wenzelm
parents: 37149
diff changeset
    87
            case XML.Elem(kind, atts, body) if Position.get_id(atts) == Some(command.id) =>
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    88
              atts match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    89
                case Position.Range(begin, end) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    90
                  if (kind == Markup.ML_TYPING) {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    91
                    val info = Pretty.string_of(body, margin = 40)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    92
                    state.add_markup(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    93
                      command.markup_node(begin - 1, end - 1, Command.TypeInfo(info)))
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    94
                  }
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    95
                  else if (kind == Markup.ML_REF) {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    96
                    body match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    97
                      case List(XML.Elem(Markup.ML_DEF, atts, _)) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    98
                        state.add_markup(command.markup_node(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    99
                          begin - 1, end - 1,
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   100
                          Command.RefInfo(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   101
                            Position.get_file(atts),
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   102
                            Position.get_line(atts),
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   103
                            Position.get_id(atts),
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   104
                            Position.get_offset(atts))))
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   105
                      case _ => state
36677
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   106
                    }
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   107
                  }
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   108
                  else {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   109
                    state.add_markup(
37197
953fc4983439 more detailed token markup, including command kind as sub_kind;
wenzelm
parents: 37189
diff changeset
   110
                      command.markup_node(begin - 1, end - 1,
953fc4983439 more detailed token markup, including command kind as sub_kind;
wenzelm
parents: 37189
diff changeset
   111
                        Command.HighlightInfo(kind, Markup.get_string(Markup.KIND, atts))))
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   112
                  }
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   113
                case _ => state
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   114
              }
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   115
            case _ =>
37189
2b4e52ecf6fc tuned messages;
wenzelm
parents: 37186
diff changeset
   116
              System.err.println("Ignored status report: " + elem)
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   117
              state
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   118
          })
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   119
      case _ => add_result(message)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   120
    }
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   121
}