77 |
77 |
78 |
78 |
79 (* datatype T *) |
79 (* datatype T *) |
80 |
80 |
81 datatype T = |
81 datatype T = |
82 NameSpace of |
82 Name_Space of |
83 (string list * string list) Symtab.table * (*internals, hidden internals*) |
83 (string list * string list) Symtab.table * (*internals, hidden internals*) |
84 entry Symtab.table; |
84 entry Symtab.table; |
85 |
85 |
86 val empty = NameSpace (Symtab.empty, Symtab.empty); |
86 val empty = Name_Space (Symtab.empty, Symtab.empty); |
87 |
87 |
88 fun lookup (NameSpace (tab, _)) xname = |
88 fun lookup (Name_Space (tab, _)) xname = |
89 (case Symtab.lookup tab xname of |
89 (case Symtab.lookup tab xname of |
90 NONE => (xname, true) |
90 NONE => (xname, true) |
91 | SOME ([], []) => (xname, true) |
91 | SOME ([], []) => (xname, true) |
92 | SOME ([name], _) => (name, true) |
92 | SOME ([name], _) => (name, true) |
93 | SOME (name :: _, _) => (name, false) |
93 | SOME (name :: _, _) => (name, false) |
94 | SOME ([], name' :: _) => (hidden name', true)); |
94 | SOME ([], name' :: _) => (hidden name', true)); |
95 |
95 |
96 fun get_accesses (NameSpace (_, entries)) name = |
96 fun get_accesses (Name_Space (_, entries)) name = |
97 (case Symtab.lookup entries name of |
97 (case Symtab.lookup entries name of |
98 NONE => [name] |
98 NONE => [name] |
99 | SOME {externals, ...} => externals); |
99 | SOME {externals, ...} => externals); |
100 |
100 |
101 fun valid_accesses (NameSpace (tab, _)) name = |
101 fun valid_accesses (Name_Space (tab, _)) name = |
102 Symtab.fold (fn (xname, (names, _)) => |
102 Symtab.fold (fn (xname, (names, _)) => |
103 if not (null names) andalso hd names = name then cons xname else I) tab []; |
103 if not (null names) andalso hd names = name then cons xname else I) tab []; |
104 |
104 |
105 |
105 |
106 (* intern and extern *) |
106 (* intern and extern *) |
134 |
134 |
135 (* basic operations *) |
135 (* basic operations *) |
136 |
136 |
137 local |
137 local |
138 |
138 |
139 fun map_space f xname (NameSpace (tab, entries)) = |
139 fun map_space f xname (Name_Space (tab, entries)) = |
140 NameSpace (Symtab.map_default (xname, ([], [])) f tab, entries); |
140 Name_Space (Symtab.map_default (xname, ([], [])) f tab, entries); |
141 |
141 |
142 in |
142 in |
143 |
143 |
144 val del_name = map_space o apfst o remove (op =); |
144 val del_name = map_space o apfst o remove (op =); |
145 fun del_name_extra name = map_space (apfst (fn [] => [] | x :: xs => x :: remove (op =) name xs)); |
145 fun del_name_extra name = map_space (apfst (fn [] => [] | x :: xs => x :: remove (op =) name xs)); |
166 end; |
166 end; |
167 |
167 |
168 |
168 |
169 (* merge *) |
169 (* merge *) |
170 |
170 |
171 fun merge (NameSpace (tab1, entries1), NameSpace (tab2, entries2)) = |
171 fun merge (Name_Space (tab1, entries1), Name_Space (tab2, entries2)) = |
172 let |
172 let |
173 val tab' = (tab1, tab2) |> Symtab.join |
173 val tab' = (tab1, tab2) |> Symtab.join |
174 (K (fn ((names1, names1'), (names2, names2')) => |
174 (K (fn ((names1, names1'), (names2, names2')) => |
175 if pointer_eq (names1, names2) andalso pointer_eq (names1', names2') |
175 if pointer_eq (names1, names2) andalso pointer_eq (names1', names2') |
176 then raise Symtab.SAME |
176 then raise Symtab.SAME |
180 if #id entry1 = #id entry2 then raise Symtab.SAME |
180 if #id entry1 = #id entry2 then raise Symtab.SAME |
181 else |
181 else |
182 error ("Duplicate declaration " ^ |
182 error ("Duplicate declaration " ^ |
183 quote (str_of_entry true (name, entry1)) ^ " vs. " ^ |
183 quote (str_of_entry true (name, entry1)) ^ " vs. " ^ |
184 quote (str_of_entry true (name, entry2)))); |
184 quote (str_of_entry true (name, entry2)))); |
185 in NameSpace (tab', entries') end; |
185 in Name_Space (tab', entries') end; |
186 |
186 |
187 |
187 |
188 |
188 |
189 (** naming contexts **) |
189 (** naming contexts **) |
190 |
190 |
243 fun external_names naming = #2 o accesses naming o Binding.qualified_name; |
243 fun external_names naming = #2 o accesses naming o Binding.qualified_name; |
244 |
244 |
245 |
245 |
246 (* declaration *) |
246 (* declaration *) |
247 |
247 |
248 fun new_entry strict entry (NameSpace (tab, entries)) = |
248 fun new_entry strict entry (Name_Space (tab, entries)) = |
249 let |
249 let |
250 val entries' = |
250 val entries' = |
251 (if strict then Symtab.update_new else Symtab.update) entry entries |
251 (if strict then Symtab.update_new else Symtab.update) entry entries |
252 handle Symtab.DUP _ => |
252 handle Symtab.DUP _ => |
253 error ("Duplicate declaration " ^ quote (str_of_entry true entry)); |
253 error ("Duplicate declaration " ^ quote (str_of_entry true entry)); |
254 in NameSpace (tab, entries') end; |
254 in Name_Space (tab, entries') end; |
255 |
255 |
256 fun declare strict naming binding space = |
256 fun declare strict naming binding space = |
257 let |
257 let |
258 val names = full naming binding; |
258 val names = full naming binding; |
259 val name = Long_Name.implode names; |
259 val name = Long_Name.implode names; |