9 |
9 |
10 signature BINDING = |
10 signature BINDING = |
11 sig |
11 sig |
12 type binding |
12 type binding |
13 val dest: binding -> (string * bool) list * bstring |
13 val dest: binding -> (string * bool) list * bstring |
14 val verbose: bool ref |
|
15 val str_of: binding -> string |
14 val str_of: binding -> string |
16 val make: bstring * Position.T -> binding |
15 val make: bstring * Position.T -> binding |
17 val pos_of: binding -> Position.T |
16 val pos_of: binding -> Position.T |
18 val name: bstring -> binding |
17 val name: bstring -> binding |
19 val name_of: binding -> string |
18 val name_of: binding -> string |
21 val empty: binding |
20 val empty: binding |
22 val is_empty: binding -> bool |
21 val is_empty: binding -> bool |
23 val qualify: bool -> string -> binding -> binding |
22 val qualify: bool -> string -> binding -> binding |
24 val prefix_of: binding -> (string * bool) list |
23 val prefix_of: binding -> (string * bool) list |
25 val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding |
24 val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding |
26 val add_prefix: bool -> string -> binding -> binding |
25 val prefix: bool -> string -> binding -> binding |
27 end; |
26 end; |
28 |
27 |
29 structure Binding: BINDING = |
28 structure Binding: BINDING = |
30 struct |
29 struct |
31 |
30 |
45 fun map_binding f (Binding {prefix, qualifier, name, pos}) = |
44 fun map_binding f (Binding {prefix, qualifier, name, pos}) = |
46 make_binding (f (prefix, qualifier, name, pos)); |
45 make_binding (f (prefix, qualifier, name, pos)); |
47 |
46 |
48 fun dest (Binding {prefix, qualifier, name, ...}) = (prefix @ qualifier, name); |
47 fun dest (Binding {prefix, qualifier, name, ...}) = (prefix @ qualifier, name); |
49 |
48 |
50 |
|
51 (* diagnostic output *) |
|
52 |
|
53 val verbose = ref false; |
|
54 |
|
55 val str_of_components = implode o map (fn (s, true) => s ^ "!" | (s, false) => s ^ "?"); |
|
56 |
|
57 fun str_of (Binding {prefix, qualifier, name, pos}) = |
49 fun str_of (Binding {prefix, qualifier, name, pos}) = |
58 let |
50 let |
59 val text = |
51 val text = space_implode "." (map #1 qualifier @ [name]); |
60 if ! verbose then |
|
61 (if null prefix then "" else enclose "(" ")" (str_of_components prefix)) ^ |
|
62 str_of_components qualifier ^ name |
|
63 else name; |
|
64 val props = Position.properties_of pos; |
52 val props = Position.properties_of pos; |
65 in Markup.markup (Markup.properties props (Markup.binding name)) text end; |
53 in Markup.markup (Markup.properties props (Markup.binding name)) text end; |
66 |
54 |
67 |
55 |
68 |
56 |
83 |
71 |
84 |
72 |
85 (* user qualifier *) |
73 (* user qualifier *) |
86 |
74 |
87 fun qualify _ "" = I |
75 fun qualify _ "" = I |
88 | qualify mandatory qual = map_binding (fn (prefix, qualifier, name, pos) => |
76 | qualify strict qual = map_binding (fn (prefix, qualifier, name, pos) => |
89 (prefix, (qual, mandatory) :: qualifier, name, pos)); |
77 (prefix, (qual, strict) :: qualifier, name, pos)); |
90 |
78 |
91 |
79 |
92 (* system prefix *) |
80 (* system prefix *) |
93 |
81 |
94 fun prefix_of (Binding {prefix, ...}) = prefix; |
82 fun prefix_of (Binding {prefix, ...}) = prefix; |
95 |
83 |
96 fun map_prefix f = map_binding (fn (prefix, qualifier, name, pos) => |
84 fun map_prefix f = map_binding (fn (prefix, qualifier, name, pos) => |
97 (f prefix, qualifier, name, pos)); |
85 (f prefix, qualifier, name, pos)); |
98 |
86 |
99 fun add_prefix _ "" = I |
87 fun prefix _ "" = I |
100 | add_prefix mandatory prfx = map_prefix (cons (prfx, mandatory)); |
88 | prefix strict prfx = map_prefix (cons (prfx, strict)); |
101 |
89 |
102 end; |
90 end; |
103 |
91 |
104 type binding = Binding.binding; |
92 type binding = Binding.binding; |
105 |
93 |