src/Pure/General/position.scala
changeset 75393 87ebf5a50283
parent 74714 135787601438
child 75983 34dd96a06c45
equal deleted inserted replaced
75388:b3ca4a6ed74b 75393:87ebf5a50283
     5 */
     5 */
     6 
     6 
     7 package isabelle
     7 package isabelle
     8 
     8 
     9 
     9 
    10 object Position
    10 object Position {
    11 {
       
    12   type T = Properties.T
    11   type T = Properties.T
    13 
    12 
    14   val none: T = Nil
    13   val none: T = Nil
    15 
    14 
    16   val Line = new Properties.Int(Markup.LINE)
    15   val Line = new Properties.Int(Markup.LINE)
    26   val Def_File = new Properties.String(Markup.DEF_FILE)
    25   val Def_File = new Properties.String(Markup.DEF_FILE)
    27   val Def_Id = new Properties.Long(Markup.DEF_ID)
    26   val Def_Id = new Properties.Long(Markup.DEF_ID)
    28 
    27 
    29   val Def_Theory = new Properties.String(Markup.DEF_THEORY)
    28   val Def_Theory = new Properties.String(Markup.DEF_THEORY)
    30 
    29 
    31   object Line_File
    30   object Line_File {
    32   {
       
    33     def apply(line: Int, file: String): T =
    31     def apply(line: Int, file: String): T =
    34       (if (line > 0) Line(line) else Nil) :::
    32       (if (line > 0) Line(line) else Nil) :::
    35       (if (file != "") File(file) else Nil)
    33       (if (file != "") File(file) else Nil)
    36 
    34 
    37     def unapply(pos: T): Option[(Int, String)] =
    35     def unapply(pos: T): Option[(Int, String)] =
    40         case (_, File(name)) => Some((1, name))
    38         case (_, File(name)) => Some((1, name))
    41         case _ => None
    39         case _ => None
    42       }
    40       }
    43   }
    41   }
    44 
    42 
    45   object Def_Line_File
    43   object Def_Line_File {
    46   {
       
    47     def unapply(pos: T): Option[(Int, String)] =
    44     def unapply(pos: T): Option[(Int, String)] =
    48       (pos, pos) match {
    45       (pos, pos) match {
    49         case (Def_Line(i), Def_File(name)) => Some((i, name))
    46         case (Def_Line(i), Def_File(name)) => Some((i, name))
    50         case (_, Def_File(name)) => Some((1, name))
    47         case (_, Def_File(name)) => Some((1, name))
    51         case _ => None
    48         case _ => None
    52       }
    49       }
    53   }
    50   }
    54 
    51 
    55   object Range
    52   object Range {
    56   {
       
    57     def apply(range: Symbol.Range): T = Offset(range.start) ::: End_Offset(range.stop)
    53     def apply(range: Symbol.Range): T = Offset(range.start) ::: End_Offset(range.stop)
    58     def unapply(pos: T): Option[Symbol.Range] =
    54     def unapply(pos: T): Option[Symbol.Range] =
    59       (pos, pos) match {
    55       (pos, pos) match {
    60         case (Offset(start), End_Offset(stop)) if start <= stop => Some(Text.Range(start, stop))
    56         case (Offset(start), End_Offset(stop)) if start <= stop => Some(Text.Range(start, stop))
    61         case (Offset(start), _) => Some(Text.Range(start, start + 1))
    57         case (Offset(start), _) => Some(Text.Range(start, start + 1))
    62         case _ => None
    58         case _ => None
    63       }
    59       }
    64   }
    60   }
    65 
    61 
    66   object Def_Range
    62   object Def_Range {
    67   {
       
    68     def apply(range: Symbol.Range): T = Def_Offset(range.start) ::: Def_End_Offset(range.stop)
    63     def apply(range: Symbol.Range): T = Def_Offset(range.start) ::: Def_End_Offset(range.stop)
    69     def unapply(pos: T): Option[Symbol.Range] =
    64     def unapply(pos: T): Option[Symbol.Range] =
    70       (pos, pos) match {
    65       (pos, pos) match {
    71         case (Def_Offset(start), Def_End_Offset(stop)) if start <= stop => Some(Text.Range(start, stop))
    66         case (Def_Offset(start), Def_End_Offset(stop)) if start <= stop => Some(Text.Range(start, stop))
    72         case (Def_Offset(start), _) => Some(Text.Range(start, start + 1))
    67         case (Def_Offset(start), _) => Some(Text.Range(start, start + 1))
    73         case _ => None
    68         case _ => None
    74       }
    69       }
    75   }
    70   }
    76 
    71 
    77   object Item_Id
    72   object Item_Id {
    78   {
       
    79     def unapply(pos: T): Option[(Long, Symbol.Range)] =
    73     def unapply(pos: T): Option[(Long, Symbol.Range)] =
    80       pos match {
    74       pos match {
    81         case Id(id) =>
    75         case Id(id) =>
    82           val offset = Offset.unapply(pos) getOrElse 0
    76           val offset = Offset.unapply(pos) getOrElse 0
    83           val end_offset = End_Offset.unapply(pos) getOrElse (offset + 1)
    77           val end_offset = End_Offset.unapply(pos) getOrElse (offset + 1)
    84           Some((id, Text.Range(offset, end_offset)))
    78           Some((id, Text.Range(offset, end_offset)))
    85         case _ => None
    79         case _ => None
    86       }
    80       }
    87   }
    81   }
    88 
    82 
    89   object Item_Def_Id
    83   object Item_Def_Id {
    90   {
       
    91     def unapply(pos: T): Option[(Long, Symbol.Range)] =
    84     def unapply(pos: T): Option[(Long, Symbol.Range)] =
    92       pos match {
    85       pos match {
    93         case Def_Id(id) =>
    86         case Def_Id(id) =>
    94           val offset = Def_Offset.unapply(pos) getOrElse 0
    87           val offset = Def_Offset.unapply(pos) getOrElse 0
    95           val end_offset = Def_End_Offset.unapply(pos) getOrElse (offset + 1)
    88           val end_offset = Def_End_Offset.unapply(pos) getOrElse (offset + 1)
    96           Some((id, Text.Range(offset, end_offset)))
    89           Some((id, Text.Range(offset, end_offset)))
    97         case _ => None
    90         case _ => None
    98       }
    91       }
    99   }
    92   }
   100 
    93 
   101   object Item_File
    94   object Item_File {
   102   {
       
   103     def unapply(pos: T): Option[(String, Int, Symbol.Range)] =
    95     def unapply(pos: T): Option[(String, Int, Symbol.Range)] =
   104       pos match {
    96       pos match {
   105         case Line_File(line, name) =>
    97         case Line_File(line, name) =>
   106           val offset = Offset.unapply(pos) getOrElse 0
    98           val offset = Offset.unapply(pos) getOrElse 0
   107           val end_offset = End_Offset.unapply(pos) getOrElse (offset + 1)
    99           val end_offset = End_Offset.unapply(pos) getOrElse (offset + 1)
   108           Some((name, line, Text.Range(offset, end_offset)))
   100           Some((name, line, Text.Range(offset, end_offset)))
   109         case _ => None
   101         case _ => None
   110       }
   102       }
   111   }
   103   }
   112 
   104 
   113   object Item_Def_File
   105   object Item_Def_File {
   114   {
       
   115     def unapply(pos: T): Option[(String, Int, Symbol.Range)] =
   106     def unapply(pos: T): Option[(String, Int, Symbol.Range)] =
   116       pos match {
   107       pos match {
   117         case Def_Line_File(line, name) =>
   108         case Def_Line_File(line, name) =>
   118           val offset = Def_Offset.unapply(pos) getOrElse 0
   109           val offset = Def_Offset.unapply(pos) getOrElse 0
   119           val end_offset = Def_End_Offset.unapply(pos) getOrElse (offset + 1)
   110           val end_offset = Def_End_Offset.unapply(pos) getOrElse (offset + 1)
   123   }
   114   }
   124 
   115 
   125 
   116 
   126   /* here: user output */
   117   /* here: user output */
   127 
   118 
   128   def here(props: T, delimited: Boolean = true): String =
   119   def here(props: T, delimited: Boolean = true): String = {
   129   {
       
   130     val pos = props.filter(Markup.position_property)
   120     val pos = props.filter(Markup.position_property)
   131     if (pos.isEmpty) ""
   121     if (pos.isEmpty) ""
   132     else {
   122     else {
   133       val s0 =
   123       val s0 =
   134         (Line.unapply(pos), File.unapply(pos)) match {
   124         (Line.unapply(pos), File.unapply(pos)) match {
   143   }
   133   }
   144 
   134 
   145 
   135 
   146   /* JSON representation */
   136   /* JSON representation */
   147 
   137 
   148   object JSON
   138   object JSON {
   149   {
       
   150     def apply(pos: T): isabelle.JSON.Object.T =
   139     def apply(pos: T): isabelle.JSON.Object.T =
   151       isabelle.JSON.Object.empty ++
   140       isabelle.JSON.Object.empty ++
   152         Line.unapply(pos).map(Line.name -> _) ++
   141         Line.unapply(pos).map(Line.name -> _) ++
   153         Offset.unapply(pos).map(Offset.name -> _) ++
   142         Offset.unapply(pos).map(Offset.name -> _) ++
   154         End_Offset.unapply(pos).map(End_Offset.name -> _) ++
   143         End_Offset.unapply(pos).map(End_Offset.name -> _) ++