src/Pure/General/position.ML
author wenzelm
Tue, 05 Aug 2008 13:31:38 +0200
changeset 27741 d2523b72ed44
parent 27736 3703dbd0cdea
child 27744 d4c5ddf98869
permissions -rw-r--r--
added report;
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
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    12
  val column_of: T -> int option
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    13
  val file_of: T -> string option
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    14
  val none: T
26882
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    15
  val line_file: int -> string -> T
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    16
  val line: int -> T
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
    17
  val file: string -> T
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    18
  val advance: Symbol.symbol -> T -> T
27426
c0ef698c0904 added get_id/put_id;
wenzelm
parents: 26890
diff changeset
    19
  val get_id: T -> string option
c0ef698c0904 added get_id/put_id;
wenzelm
parents: 26890
diff changeset
    20
  val put_id: string -> T -> T
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    21
  val of_properties: Markup.property list -> T
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    22
  val properties_of: T -> Markup.property list
26052
7d5b3e34a735 added default_properties;
wenzelm
parents: 26003
diff changeset
    23
  val default_properties: T -> Markup.property list -> Markup.property list
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    24
  val str_of: T -> string
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    25
  val thread_data: unit -> T
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    26
  val setmp_thread_data: T -> ('a -> 'b) -> 'a -> 'b
25954
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
    27
  val setmp_thread_data_seq: T -> ('a -> 'b Seq.seq) -> 'a -> 'b Seq.seq
27736
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
    28
  type range = T * T
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
    29
  val encode_range: range -> T
27741
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
    30
  val report: Markup.T -> T -> unit
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    31
end;
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    32
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    33
structure Position: POSITION =
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    34
struct
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    35
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    36
(* datatype position *)
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    37
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    38
datatype T = Pos of (int * int) option * Markup.property list;
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    39
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    40
fun line_of (Pos (SOME (m, _), _)) = SOME m
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    41
  | line_of _ = NONE;
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    42
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    43
fun column_of (Pos (SOME (_, n), _)) = SOME n
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    44
  | column_of _ = NONE;
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    45
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    46
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
    47
26882
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    48
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    49
val none = Pos (NONE, []);
26882
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    50
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    51
fun line_file m name = Pos (SOME (m, 1), if name = "" then [] else [(Markup.fileN, name)]);
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    52
fun line m = line_file m "";
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    53
val file = line_file 1;
9e824d8f4512 renamed Position.path to Path.position;
wenzelm
parents: 26633
diff changeset
    54
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    55
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    56
fun advance "\n" (Pos (SOME (m, _), props)) = Pos (SOME (m + 1, 1), props)
26633
ff317b19e24e advance: do not count utf8 trailer bytes (which happen to be undefined or punctuation in iso-latin);
wenzelm
parents: 26052
diff changeset
    57
  | advance s (pos as Pos (SOME (m, n), props)) =
ff317b19e24e advance: do not count utf8 trailer bytes (which happen to be undefined or punctuation in iso-latin);
wenzelm
parents: 26052
diff changeset
    58
      if Symbol.is_regular s andalso not (Symbol.is_utf8_trailer s)
ff317b19e24e advance: do not count utf8 trailer bytes (which happen to be undefined or punctuation in iso-latin);
wenzelm
parents: 26052
diff changeset
    59
      then Pos (SOME (m, n + 1), props) else pos
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    60
  | advance _ pos = pos;
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
    61
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    62
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    63
(* markup properties *)
22158
ff4fc4ee9eb0 Add line_of, name_of destructors.
aspinall
parents: 15531
diff changeset
    64
27426
c0ef698c0904 added get_id/put_id;
wenzelm
parents: 26890
diff changeset
    65
fun get_id (Pos (_, props)) = AList.lookup (op =) props Markup.idN;
c0ef698c0904 added get_id/put_id;
wenzelm
parents: 26890
diff changeset
    66
fun put_id id (Pos (count, props)) = Pos (count, AList.update (op =) (Markup.idN, id) props);
c0ef698c0904 added get_id/put_id;
wenzelm
parents: 26890
diff changeset
    67
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    68
fun get_int props (name: string) =
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    69
  (case AList.lookup (op =) props name of
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    70
    NONE => NONE
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    71
  | SOME s => Int.fromString s);
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    72
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    73
fun of_properties props =
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
    74
  let
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    75
    val count =
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    76
      (case get_int props Markup.lineN of
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    77
        NONE => NONE
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    78
      | SOME m => SOME (m, the_default 1 (get_int props Markup.columnN)));
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    79
    fun property name = the_list (find_first (fn (x: string, _) => x = name) props);
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    80
  in (Pos (count, property Markup.fileN @ property Markup.idN)) end;
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    81
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    82
fun properties_of (Pos (count, props)) =
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    83
  (case count of
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    84
    NONE => []
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    85
  | SOME (m, n) => [(Markup.lineN, string_of_int m), (Markup.columnN, string_of_int n)]) @ props;
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    86
26052
7d5b3e34a735 added default_properties;
wenzelm
parents: 26003
diff changeset
    87
fun default_properties default props =
7d5b3e34a735 added default_properties;
wenzelm
parents: 26003
diff changeset
    88
  if exists (member (op =) Markup.position_properties o #1) props then props
7d5b3e34a735 added default_properties;
wenzelm
parents: 26003
diff changeset
    89
  else properties_of default @ props;
7d5b3e34a735 added default_properties;
wenzelm
parents: 26003
diff changeset
    90
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
    91
26003
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    92
(* str_of *)
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    93
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    94
fun str_of pos =
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    95
  let
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    96
    val props = properties_of pos;
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    97
    val s =
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    98
      (case (line_of pos, file_of pos) of
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
    99
        (SOME m, NONE) => "(line " ^ string_of_int m ^ ")"
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
   100
      | (SOME m, SOME name) => "(line " ^ string_of_int m ^ " of " ^ quote name ^ ")"
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
   101
      | _ => "");
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
   102
  in
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
   103
    if null props then ""
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
   104
    else (if s = "" then "" else " ") ^ Markup.markup (Markup.properties props Markup.position) s
7a8aee8353cf added column field;
wenzelm
parents: 25954
diff changeset
   105
  end;
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   106
23627
f543538866a2 added property conversions;
wenzelm
parents: 22158
diff changeset
   107
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   108
(* thread data *)
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   109
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   110
local val tag = Universal.tag () : T Universal.tag in
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   111
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   112
fun thread_data () = the_default none (Multithreading.get_data tag);
26890
f9ec18f7c0f6 setmp_thread_data: do nothing if Output.debugging;
wenzelm
parents: 26882
diff changeset
   113
f9ec18f7c0f6 setmp_thread_data: do nothing if Output.debugging;
wenzelm
parents: 26882
diff changeset
   114
fun setmp_thread_data pos f x =
f9ec18f7c0f6 setmp_thread_data: do nothing if Output.debugging;
wenzelm
parents: 26882
diff changeset
   115
  if ! Output.debugging then f x
f9ec18f7c0f6 setmp_thread_data: do nothing if Output.debugging;
wenzelm
parents: 26882
diff changeset
   116
  else Library.setmp_thread_data tag (thread_data ()) pos f x;
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   117
25954
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
   118
fun setmp_thread_data_seq pos f seq =
682e84b60e5c added setmp_thread_data_seq;
wenzelm
parents: 25817
diff changeset
   119
  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
   120
25817
d8e0190917a5 type T: based on properties, added id field;
wenzelm
parents: 25792
diff changeset
   121
end;
23673
67c748e5ae54 replaced name by file (unquoted);
wenzelm
parents: 23627
diff changeset
   122
27736
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   123
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   124
(* range *)
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   125
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   126
type range = T * T;
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   127
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   128
fun encode_range (Pos (count, props), Pos (end_count, _)) =
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   129
  let val props' = props |> fold_rev (AList.update op =)
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   130
    (case end_count of
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   131
      NONE => []
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   132
    | SOME (m, n) => [(Markup.end_lineN, string_of_int m), (Markup.end_columnN, string_of_int n)])
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   133
  in Pos (count, props') end;
3703dbd0cdea added encode_range;
wenzelm
parents: 27661
diff changeset
   134
27741
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   135
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   136
(* report markup *)
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   137
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   138
fun report markup pos =
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   139
  if pos = none then ()
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   140
  else Output.status (Markup.markup (Markup.properties (properties_of pos) markup) "");
d2523b72ed44 added report;
wenzelm
parents: 27736
diff changeset
   141
5010
9101b70b696d moved Thy/position.ML to General/position.ML;
wenzelm
parents:
diff changeset
   142
end;