320 fun err_bad binding = error (Binding.bad binding); |
320 fun err_bad binding = error (Binding.bad binding); |
321 |
321 |
322 fun transform_binding (Naming {conceal = true, ...}) = Binding.conceal |
322 fun transform_binding (Naming {conceal = true, ...}) = Binding.conceal |
323 | transform_binding _ = I; |
323 | transform_binding _ = I; |
324 |
324 |
|
325 val bad_specs = ["", "??", "__"]; |
|
326 |
325 fun name_spec (naming as Naming {path, ...}) raw_binding = |
327 fun name_spec (naming as Naming {path, ...}) raw_binding = |
326 let |
328 let |
327 val binding = transform_binding naming raw_binding; |
329 val binding = transform_binding naming raw_binding; |
328 val (concealed, prefix, name) = Binding.dest binding; |
330 val (concealed, prefix, name) = Binding.dest binding; |
329 val _ = Long_Name.is_qualified name andalso err_bad binding; |
331 val _ = Long_Name.is_qualified name andalso err_bad binding; |
330 |
332 |
331 val spec1 = maps (fn (a, b) => map (rpair b) (Long_Name.explode a)) (path @ prefix); |
333 val spec1 = maps (fn (a, b) => map (rpair b) (Long_Name.explode a)) (path @ prefix); |
332 val spec2 = if name = "" then [] else [(name, true)]; |
334 val spec2 = if name = "" then [] else [(name, true)]; |
333 val spec = spec1 @ spec2; |
335 val spec = spec1 @ spec2; |
334 val _ = |
336 val _ = |
335 exists (fn (a, _) => a = "" orelse a = "??" orelse exists_string (fn s => s = "\"") a) spec |
337 exists (fn (a, _) => member (op =) bad_specs a orelse exists_string (fn s => s = "\"") a) spec |
336 andalso err_bad binding; |
338 andalso err_bad binding; |
337 in (concealed, if null spec2 then [] else spec) end; |
339 in (concealed, if null spec2 then [] else spec) end; |
338 |
340 |
339 fun full_name naming = |
341 fun full_name naming = |
340 name_spec naming #> #2 #> map #1 #> Long_Name.implode; |
342 name_spec naming #> #2 #> map #1 #> Long_Name.implode; |