src/Pure/General/position.scala
author wenzelm
Sat, 29 Aug 2009 14:31:39 +0200
changeset 32450 375db037f4d2
parent 31712 0c83e3e75fcf
child 34211 686f828548ef
permissions -rw-r--r--
misc tuning;
wenzelm@27968
     1
/*  Title:      Pure/General/position.scala
wenzelm@27968
     2
    Author:     Makarius
wenzelm@27968
     3
wenzelm@27968
     4
Position properties.
wenzelm@27968
     5
*/
wenzelm@27968
     6
wenzelm@27968
     7
package isabelle
wenzelm@27968
     8
wenzelm@27968
     9
wenzelm@32450
    10
object Position
wenzelm@32450
    11
{
wenzelm@31712
    12
  type T = List[(String, String)]
wenzelm@27968
    13
wenzelm@31712
    14
  private def get_string(name: String, pos: T): Option[String] =
wenzelm@31712
    15
    pos.find(p => p._1 == name).map(_._2)
wenzelm@31712
    16
wenzelm@31712
    17
  private def get_int(name: String, pos: T): Option[Int] =
wenzelm@31712
    18
  {
wenzelm@31712
    19
    get_string(name, pos) match {
wenzelm@27968
    20
      case None => None
wenzelm@27968
    21
      case Some(value) =>
wenzelm@27968
    22
        try { Some(Integer.parseInt(value)) }
wenzelm@27993
    23
        catch { case _: NumberFormatException => None }
wenzelm@27968
    24
    }
wenzelm@27968
    25
  }
wenzelm@27968
    26
wenzelm@31712
    27
  def line_of(pos: T) = get_int(Markup.LINE, pos)
wenzelm@31712
    28
  def column_of(pos: T) = get_int(Markup.COLUMN, pos)
wenzelm@31712
    29
  def offset_of(pos: T) = get_int(Markup.OFFSET, pos)
wenzelm@31712
    30
  def end_line_of(pos: T) = get_int(Markup.END_LINE, pos)
wenzelm@31712
    31
  def end_column_of(pos: T) = get_int(Markup.END_COLUMN, pos)
wenzelm@31712
    32
  def end_offset_of(pos: T) = get_int(Markup.END_OFFSET, pos)
wenzelm@31712
    33
  def file_of(pos: T) = get_string(Markup.FILE, pos)
wenzelm@31712
    34
  def id_of(pos: T) = get_string(Markup.ID, pos)
wenzelm@31712
    35
wenzelm@31712
    36
  def offsets_of(pos: T): (Option[Int], Option[Int]) =
wenzelm@31712
    37
  {
wenzelm@31712
    38
    val begin = offset_of(pos)
wenzelm@31712
    39
    val end = end_offset_of(pos)
wenzelm@31712
    40
    (begin, if (end.isDefined) end else begin.map(_ + 1))
wenzelm@31712
    41
  }
wenzelm@27968
    42
}