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 |
}
|