src/Pure/PIDE/state.scala
author wenzelm
Thu, 27 May 2010 21:36:38 +0200
changeset 37149 edfbd2a8234f
parent 37129 4c83696b340e
child 37178 d52f934f8ff6
permissions -rw-r--r--
slightly odd workaround to ignore markup that is typically displaced;
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,
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    14
  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
    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 =
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    24
    new State(command, st, reverse_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 =
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    27
    new State(command, status, res :: reverse_results, markup_root)
34697
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 =
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    30
    new State(command, status, reverse_results, markup_root + node)
34697
3d4874198e62 State: immutable;
wenzelm
parents: 34688
diff changeset
    31
37072
9105c8237c7a renamed "rev" to "reverse" following usual Scala conventions;
wenzelm
parents: 37044
diff changeset
    32
  lazy val results = reverse_results.reverse
34697
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
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    73
  def + (message: XML.Tree): State =
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    74
    message match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    75
      case XML.Elem(Markup.STATUS, _, elems) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    76
        (this /: elems)((state, elem) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    77
          elem match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    78
            case XML.Elem(Markup.UNPROCESSED, _, _) => state.set_status(Command.Status.UNPROCESSED)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    79
            case XML.Elem(Markup.FINISHED, _, _) => state.set_status(Command.Status.FINISHED)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    80
            case XML.Elem(Markup.FAILED, _, _) => state.set_status(Command.Status.FAILED)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    81
            case XML.Elem(kind, atts, body) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    82
              atts match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    83
                case Position.Range(begin, end) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    84
                  if (kind == Markup.ML_TYPING) {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    85
                    val info = Pretty.string_of(body, margin = 40)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    86
                    state.add_markup(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    87
                      command.markup_node(begin - 1, end - 1, Command.TypeInfo(info)))
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    88
                  }
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    89
                  else if (kind == Markup.ML_REF) {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    90
                    body match {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    91
                      case List(XML.Elem(Markup.ML_DEF, atts, _)) =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    92
                        state.add_markup(command.markup_node(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    93
                          begin - 1, end - 1,
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    94
                          Command.RefInfo(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    95
                            Position.get_file(atts),
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    96
                            Position.get_line(atts),
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    97
                            Position.get_id(atts),
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    98
                            Position.get_offset(atts))))
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
    99
                      case _ => state
36677
1225dd15827d simplified via Position extractors;
wenzelm
parents: 36676
diff changeset
   100
                    }
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   101
                  }
37149
edfbd2a8234f slightly odd workaround to ignore markup that is typically displaced;
wenzelm
parents: 37129
diff changeset
   102
                  else if (kind == Markup.FACT_DECL || kind == Markup.LOCAL_FACT_DECL ||
edfbd2a8234f slightly odd workaround to ignore markup that is typically displaced;
wenzelm
parents: 37129
diff changeset
   103
                      kind == Markup.ATTRIBUTE || kind == Markup.FIXED_DECL) {
edfbd2a8234f slightly odd workaround to ignore markup that is typically displaced;
wenzelm
parents: 37129
diff changeset
   104
                    // FIXME usually displaced due to lack of full history support
edfbd2a8234f slightly odd workaround to ignore markup that is typically displaced;
wenzelm
parents: 37129
diff changeset
   105
                    state
edfbd2a8234f slightly odd workaround to ignore markup that is typically displaced;
wenzelm
parents: 37129
diff changeset
   106
                  }
37129
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   107
                  else {
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   108
                    state.add_markup(
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   109
                      command.markup_node(begin - 1, end - 1, Command.HighlightInfo(kind)))
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   110
                  }
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   111
                case _ => state
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 _ =>
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   114
              System.err.println("ignored status report: " + elem)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   115
              state
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   116
          })
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   117
      case _ => add_result(message)
4c83696b340e Command.toString: include id for debugging;
wenzelm
parents: 37072
diff changeset
   118
    }
34675
5427df0f6bcb trait Accumulator;
immler@in.tum.de
parents:
diff changeset
   119
}