src/Pure/General/position.ML
author wenzelm
Sun, 27 Jan 2008 22:21:39 +0100
changeset 25995 21b51f748daf
parent 25954 682e84b60e5c
child 26003 7a8aee8353cf
permissions -rw-r--r--
rename_client_map_tac: avoid ill-defined thm reference;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6118
caa439435666 fixed titles;
wenzelm
parents: 5010
diff changeset
     1
(*  Title:      Pure/General/position.ML
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     4
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
     5
Source positions.
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     6
*)
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     7
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     8
signature POSITION =
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
     9
sig
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    10
  type T
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    11
  val line_of: T -> int option
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    12
  val file_of: T -> string option
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    13
  val inc: T -> T
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    14
  val none: T
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    15
  val line: int -> T
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    16
  val file: string -> T
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    17
  val path: Path.T -> T
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    18
  val of_properties: Markup.property list -> T
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    19
  val properties_of: T -> Markup.property list
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    20
  val thread_data: unit -> T
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    21
  val setmp_thread_data: T -> ('a -> 'b) -> 'a -> 'b
25954
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
    22
  val setmp_thread_data_seq: T -> ('a -> 'b Seq.seq) -> 'a -> 'b Seq.seq
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    23
  val str_of: T -> string
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    24
end;
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    25
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    26
structure Position: POSITION =
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    27
struct
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    28
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    29
(* datatype position *)
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    30
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    31
datatype T = Pos of int option * Markup.property list;
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    32
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    33
fun line_of (Pos (opt_n, _)) = opt_n;
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    34
fun file_of (Pos (_, props)) = AList.lookup (op =) props Markup.fileN ;
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    35
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
    36
fun inc (pos as Pos (NONE, _)) = pos
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    37
  | inc (Pos (SOME n, props)) = Pos (SOME (n + 1), props);
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    38
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    39
val none = Pos (NONE, []);
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    40
fun line n = Pos (SOME n, []);
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    41
fun file s = Pos (SOME 1, [(Markup.fileN, s)]);
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    42
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    43
val path = file o Path.implode o Path.expand;
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    44
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    45
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    46
(* markup properties *)
22158
ff4fc4ee9eb0 Add line_of, name_of destructors.
aspinall
parents: 15531
diff changeset
    47
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    48
fun of_properties props =
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    49
  let
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    50
    val opt_n =
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    51
      (case AList.lookup (op =) props Markup.lineN of
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    52
        SOME s => Int.fromString s
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    53
      | NONE => NONE);
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    54
    fun get name = the_list (find_first (fn (x: string, _) => x = name) props);
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    55
  in (Pos (opt_n, get Markup.fileN @ get Markup.idN)) end;
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    56
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    57
fun properties_of (Pos (opt_n, props)) =
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    58
  (case opt_n of SOME n => [(Markup.lineN, string_of_int n)] | NONE => []) @ props;
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    59
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    60
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    61
(* thread data *)
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    62
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    63
local val tag = Universal.tag () : T Universal.tag in
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    64
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    65
fun thread_data () = the_default none (Multithreading.get_data tag);
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    66
fun setmp_thread_data pos = Library.setmp_thread_data tag (thread_data ()) pos;
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    67
25954
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
    68
fun setmp_thread_data_seq pos f seq =
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
    69
  setmp_thread_data pos f seq |> Seq.wrap (fn pull => setmp_thread_data pos pull ());
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
    70
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    71
end;
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    72
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    73
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    74
(* str_of *)
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    75
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    76
fun print (SOME n, NONE) = "(line " ^ string_of_int n ^ ")"
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    77
  | print (NONE, SOME s) = "(" ^ s ^ ")"
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    78
  | print (SOME n, SOME s) = "(line " ^ string_of_int n ^ " of " ^ quote s ^ ")";
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    79
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    80
fun str_of pos =
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    81
  (case (line_of pos, file_of pos) of
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    82
    (NONE, NONE) => ""
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    83
  | res => " " ^ Markup.markup (Markup.properties (properties_of pos) Markup.position) (print res));
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    84
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    85
end;