src/Pure/General/position.scala
author paulson <lp15@cam.ac.uk>
Mon, 13 May 2024 22:42:40 +0100
changeset 80177 1478555580af
parent 78021 ce6e3bc34343
permissions -rw-r--r--
More binomial material
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27968
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/position.scala
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     3
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     4
Position properties.
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     5
*/
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     6
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     7
package isabelle
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     8
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
     9
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    10
object Position {
43780
2cb2310d68b6 more uniform Properties in ML and Scala;
wenzelm
parents: 43710
diff changeset
    11
  type T = Properties.T
27968
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
    12
55490
9b0fb0e2c9f5 updated thy_info.dependencies;
wenzelm
parents: 55429
diff changeset
    13
  val none: T = Nil
9b0fb0e2c9f5 updated thy_info.dependencies;
wenzelm
parents: 55429
diff changeset
    14
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    15
  val Line = new Properties.Int(Markup.LINE)
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    16
  val Offset = new Properties.Int(Markup.OFFSET)
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    17
  val End_Offset = new Properties.Int(Markup.END_OFFSET)
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77368
diff changeset
    18
  val Label = new Properties.String(Markup.LABEL)
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    19
  val File = new Properties.String(Markup.FILE)
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    20
  val Id = new Properties.Long(Markup.ID)
59706
bf6ca55aae13 proper command id for inlined errors, which is important for Command.State.accumulate;
wenzelm
parents: 59671
diff changeset
    21
  val Id_String = new Properties.String(Markup.ID)
31705
0c83e3e75fcf replaced java Properties by pure property lists;
wenzelm
parents: 29140
diff changeset
    22
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    23
  val Def_Line = new Properties.Int(Markup.DEF_LINE)
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    24
  val Def_Offset = new Properties.Int(Markup.DEF_OFFSET)
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    25
  val Def_End_Offset = new Properties.Int(Markup.DEF_END_OFFSET)
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77368
diff changeset
    26
  val Def_Label = new Properties.String(Markup.DEF_LABEL)
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    27
  val Def_File = new Properties.String(Markup.DEF_FILE)
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49419
diff changeset
    28
  val Def_Id = new Properties.Long(Markup.DEF_ID)
49419
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    29
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    30
  object Line_File {
56464
555f4be59be6 more precise token positions;
wenzelm
parents: 56462
diff changeset
    31
    def apply(line: Int, file: String): T =
555f4be59be6 more precise token positions;
wenzelm
parents: 56462
diff changeset
    32
      (if (line > 0) Line(line) else Nil) :::
555f4be59be6 more precise token positions;
wenzelm
parents: 56462
diff changeset
    33
      (if (file != "") File(file) else Nil)
555f4be59be6 more precise token positions;
wenzelm
parents: 56462
diff changeset
    34
48920
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    35
    def unapply(pos: T): Option[(Int, String)] =
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    36
      (pos, pos) match {
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    37
        case (Line(i), File(name)) => Some((i, name))
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    38
        case (_, File(name)) => Some((1, name))
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    39
        case _ => None
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    40
      }
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    41
  }
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    42
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    43
  object Def_Line_File {
49419
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    44
    def unapply(pos: T): Option[(Int, String)] =
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    45
      (pos, pos) match {
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    46
        case (Def_Line(i), Def_File(name)) => Some((i, name))
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    47
        case (_, Def_File(name)) => Some((1, name))
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    48
        case _ => None
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    49
      }
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    50
  }
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    51
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    52
  object Range {
57910
a50837b637dc maintain Command_Range position as in ML;
wenzelm
parents: 56746
diff changeset
    53
    def apply(range: Symbol.Range): T = Offset(range.start) ::: End_Offset(range.stop)
55884
f2c0eaedd579 tuned signature -- emphasize symbol positions (prover) vs. decoded text offsets (editor);
wenzelm
parents: 55555
diff changeset
    54
    def unapply(pos: T): Option[Symbol.Range] =
48920
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    55
      (pos, pos) match {
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    56
        case (Offset(start), End_Offset(stop)) if start <= stop => Some(Text.Range(start, stop))
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    57
        case (Offset(start), _) => Some(Text.Range(start, start + 1))
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    58
        case _ => None
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    59
      }
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    60
  }
9f84d872feba tuned signature;
wenzelm
parents: 48548
diff changeset
    61
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    62
  object Def_Range {
74714
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    63
    def apply(range: Symbol.Range): T = Def_Offset(range.start) ::: Def_End_Offset(range.stop)
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    64
    def unapply(pos: T): Option[Symbol.Range] =
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    65
      (pos, pos) match {
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    66
        case (Def_Offset(start), Def_End_Offset(stop)) if start <= stop => Some(Text.Range(start, stop))
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    67
        case (Def_Offset(start), _) => Some(Text.Range(start, start + 1))
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    68
        case _ => None
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    69
      }
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    70
  }
135787601438 clarified signature;
wenzelm
parents: 74692
diff changeset
    71
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    72
  object Item_Id {
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    73
    def unapply(pos: T): Option[(Long, Symbol.Range)] =
57931
wenzelm
parents: 57911
diff changeset
    74
      pos match {
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    75
        case Id(id) =>
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    76
          val offset = Offset.unapply(pos) getOrElse 0
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    77
          val end_offset = End_Offset.unapply(pos) getOrElse (offset + 1)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    78
          Some((id, Text.Range(offset, end_offset)))
38722
ba31936497c2 organized markup properties via apply/unapply patterns;
wenzelm
parents: 38568
diff changeset
    79
        case _ => None
ba31936497c2 organized markup properties via apply/unapply patterns;
wenzelm
parents: 38568
diff changeset
    80
      }
ba31936497c2 organized markup properties via apply/unapply patterns;
wenzelm
parents: 38568
diff changeset
    81
  }
38872
26c505765024 Command.results: ordered by serial number;
wenzelm
parents: 38722
diff changeset
    82
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    83
  object Item_Def_Id {
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    84
    def unapply(pos: T): Option[(Long, Symbol.Range)] =
57931
wenzelm
parents: 57911
diff changeset
    85
      pos match {
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    86
        case Def_Id(id) =>
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    87
          val offset = Def_Offset.unapply(pos) getOrElse 0
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    88
          val end_offset = Def_End_Offset.unapply(pos) getOrElse (offset + 1)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    89
          Some((id, Text.Range(offset, end_offset)))
49419
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    90
        case _ => None
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    91
      }
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    92
  }
e2726211f834 pass base_snapshot to enable hyperlinks into other nodes;
wenzelm
parents: 48992
diff changeset
    93
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
    94
  object Item_File {
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    95
    def unapply(pos: T): Option[(String, Int, Symbol.Range)] =
64662
wenzelm
parents: 59707
diff changeset
    96
      pos match {
wenzelm
parents: 59707
diff changeset
    97
        case Line_File(line, name) =>
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    98
          val offset = Offset.unapply(pos) getOrElse 0
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
    99
          val end_offset = End_Offset.unapply(pos) getOrElse (offset + 1)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
   100
          Some((name, line, Text.Range(offset, end_offset)))
64662
wenzelm
parents: 59707
diff changeset
   101
        case _ => None
wenzelm
parents: 59707
diff changeset
   102
      }
wenzelm
parents: 59707
diff changeset
   103
  }
wenzelm
parents: 59707
diff changeset
   104
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
   105
  object Item_Def_File {
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
   106
    def unapply(pos: T): Option[(String, Int, Symbol.Range)] =
64662
wenzelm
parents: 59707
diff changeset
   107
      pos match {
wenzelm
parents: 59707
diff changeset
   108
        case Def_Line_File(line, name) =>
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
   109
          val offset = Def_Offset.unapply(pos) getOrElse 0
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
   110
          val end_offset = Def_End_Offset.unapply(pos) getOrElse (offset + 1)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64662
diff changeset
   111
          Some((name, line, Text.Range(offset, end_offset)))
64662
wenzelm
parents: 59707
diff changeset
   112
        case _ => None
wenzelm
parents: 59707
diff changeset
   113
      }
wenzelm
parents: 59707
diff changeset
   114
  }
wenzelm
parents: 59707
diff changeset
   115
48370
d0fa3efec93b require explicit initialization of options;
wenzelm
parents: 45666
diff changeset
   116
56532
3da244bc02bd tuned message, to accommodate extra brackets produced by Scala parsers;
wenzelm
parents: 56473
diff changeset
   117
  /* here: user output */
48992
0518bf89c777 renamed Position.str_of to Position.here;
wenzelm
parents: 48920
diff changeset
   118
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
   119
  def here(props: T, delimited: Boolean = true): String = {
72708
0cc96d337e8f tuned signature;
wenzelm
parents: 72692
diff changeset
   120
    val pos = props.filter(Markup.position_property)
77368
wenzelm
parents: 75983
diff changeset
   121
    if_proper(pos,
wenzelm
parents: 75983
diff changeset
   122
      {
wenzelm
parents: 75983
diff changeset
   123
        val s0 =
wenzelm
parents: 75983
diff changeset
   124
          (Line.unapply(pos), File.unapply(pos)) match {
wenzelm
parents: 75983
diff changeset
   125
            case (Some(i), None) => "line " + i.toString
wenzelm
parents: 75983
diff changeset
   126
            case (Some(i), Some(name)) => "line " + i.toString + " of " + quote(name)
wenzelm
parents: 75983
diff changeset
   127
            case (None, Some(name)) => "file " + quote(name)
wenzelm
parents: 75983
diff changeset
   128
            case _ => ""
wenzelm
parents: 75983
diff changeset
   129
          }
wenzelm
parents: 75983
diff changeset
   130
        val s = if (s0 == "") s0 else if (delimited) " (" + s0 + ")" else s0
wenzelm
parents: 75983
diff changeset
   131
        Markup(Markup.POSITION, pos).markup(s)
wenzelm
parents: 75983
diff changeset
   132
      })
64728
601866c61ded more precise markup;
wenzelm
parents: 64667
diff changeset
   133
  }
67882
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   134
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   135
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   136
  /* JSON representation */
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   137
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74714
diff changeset
   138
  object JSON {
67882
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   139
    def apply(pos: T): isabelle.JSON.Object.T =
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   140
      isabelle.JSON.Object.empty ++
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   141
        Line.unapply(pos).map(Line.name -> _) ++
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   142
        Offset.unapply(pos).map(Offset.name -> _) ++
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   143
        End_Offset.unapply(pos).map(End_Offset.name -> _) ++
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   144
        File.unapply(pos).map(File.name -> _) ++
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   145
        Id.unapply(pos).map(Id.name -> _)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   146
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   147
    def unapply(json: isabelle.JSON.T): Option[T] =
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   148
      for {
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   149
        line <- isabelle.JSON.int_default(json, Line.name)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   150
        offset <- isabelle.JSON.int_default(json, Offset.name)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   151
        end_offset <- isabelle.JSON.int_default(json, End_Offset.name)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   152
        file <- isabelle.JSON.string_default(json, File.name)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   153
        id <- isabelle.JSON.long_default(json, Id.name)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   154
      }
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   155
      yield {
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   156
        def defined(name: String): Boolean = isabelle.JSON.value(json, name).isDefined
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   157
        (if (defined(Line.name)) Line(line) else Nil) :::
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   158
        (if (defined(Offset.name)) Offset(offset) else Nil) :::
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   159
        (if (defined(End_Offset.name)) End_Offset(end_offset) else Nil) :::
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   160
        (if (defined(File.name)) File(file) else Nil) :::
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   161
        (if (defined(Id.name)) Id(id) else Nil)
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   162
      }
7eb4c966e156 JSON representation for Position.T;
wenzelm
parents: 65402
diff changeset
   163
  }
27968
85b5f024d94b Position properties.
wenzelm
parents:
diff changeset
   164
}