src/Pure/PIDE/state.scala
author wenzelm
Fri, 21 May 2010 20:10:45 +0200
changeset 37044 d93b849cbecd
parent 36735 42b7f881f5fc
child 37072 9105c8237c7a
permissions -rw-r--r--
simplified message markup, using plain XML.Elem directly;
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,
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 {
34859
f986d84dd44b renamed Command.content to source;
wenzelm
parents: 34817
diff changeset
    55
          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
    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 {
37044
d93b849cbecd simplified message markup, using plain XML.Elem directly;
wenzelm
parents: 36735
diff changeset
    77
        case XML.Elem(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) =>
36677
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    84
                atts match {
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    85
                  case Position.Range(begin, end) =>
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    86
                    if (kind == Markup.ML_TYPING) {
36735
42b7f881f5fc output symbolic pretty printing markup and format in the front end;
wenzelm
parents: 36677
diff changeset
    87
                      val info = Pretty.string_of(body, margin = 40)
36677
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    88
                      state.add_markup(
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    89
                        command.markup_node(begin - 1, end - 1, Command.TypeInfo(info)))
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    90
                    }
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    91
                    else if (kind == Markup.ML_REF) {
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    92
                      body match {
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    93
                        case List(XML.Elem(Markup.ML_DEF, atts, _)) =>
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    94
                          state.add_markup(command.markup_node(
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    95
                            begin - 1, end - 1,
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    96
                            Command.RefInfo(
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    97
                              Position.get_file(atts),
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    98
                              Position.get_line(atts),
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
    99
                              Position.get_id(atts),
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   100
                              Position.get_offset(atts))))
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   101
                        case _ => state
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   102
                      }
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   103
                    }
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   104
                    else {
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   105
                      state.add_markup(
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   106
                        command.markup_node(begin - 1, end - 1, Command.HighlightInfo(kind)))
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   107
                    }
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   108
                  case _ => state
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   109
                }
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   110
              case _ =>
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   111
                System.err.println("ignored status report: " + elem)
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   112
                state
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   113
            })
34715
826e476947f9 treat all messages except status as results;
wenzelm
parents: 34709
diff changeset
   114
        case _ => add_result(message)
34703
ff037c17332a minor tuning;
wenzelm
parents: 34700
diff changeset
   115
      }
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
   116
    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
   117
    changed
9e725d34df7b Command and Command_State handle results from prover as Accumulator
immler@in.tum.de
parents: 34675
diff changeset
   118
  }
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   119
}