| author | wenzelm | 
| Sun, 21 Aug 2022 15:00:14 +0200 | |
| changeset 75952 | 864b10457a7d | 
| parent 71212 | 475510f1a280 | 
| child 77841 | de97fcc2c624 | 
| permissions | -rw-r--r-- | 
| 28941 | 1 | (* Title: Pure/General/binding.ML | 
| 2 | Author: Florian Haftmann, TU Muenchen | |
| 30214 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
changeset | 3 | Author: Makarius | 
| 28941 | 4 | |
| 5 | Structured name bindings. | |
| 6 | *) | |
| 7 | ||
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 8 | type bstring = string; (*primitive names to be bound*) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 9 | |
| 30214 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
changeset | 10 | signature BINDING = | 
| 28941 | 11 | sig | 
| 59886 | 12 | eqtype scope | 
| 13 | val new_scope: unit -> scope | |
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 14 | eqtype binding | 
| 59858 | 15 | val path_of: binding -> (string * bool) list | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 16 | val make: bstring * Position.T -> binding | 
| 30276 | 17 | val pos_of: binding -> Position.T | 
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 18 | val set_pos: Position.T -> binding -> binding | 
| 61950 | 19 | val reset_pos: binding -> binding | 
| 63369 | 20 | val default_pos: binding -> binding | 
| 70494 | 21 | val default_pos_of: binding -> Position.T | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 22 | val name: bstring -> binding | 
| 30464 | 23 | val name_of: binding -> bstring | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 24 | val map_name: (bstring -> bstring) -> binding -> binding | 
| 30338 | 25 | val prefix_name: string -> binding -> binding | 
| 26 | val suffix_name: string -> binding -> binding | |
| 27 | val eq_name: binding * binding -> bool | |
| 29617 | 28 | val empty: binding | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 29 | val is_empty: binding -> bool | 
| 63352 | 30 | val empty_atts: binding * 'a list | 
| 31 | val is_empty_atts: binding * 'a list -> bool | |
| 63006 | 32 | val conglomerate: binding list -> binding | 
| 30410 | 33 | val qualify: bool -> string -> binding -> binding | 
| 63003 | 34 | val qualify_name: bool -> binding -> string -> binding | 
| 30464 | 35 | val qualified_name: string -> binding | 
| 30276 | 36 | val prefix_of: binding -> (string * bool) list | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 37 | val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding | 
| 30335 
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
 wenzelm parents: 
30276diff
changeset | 38 | val prefix: bool -> string -> binding -> binding | 
| 62241 | 39 | val restricted: (bool * scope) option -> binding -> binding | 
| 59859 | 40 | val concealed: binding -> binding | 
| 43547 
f3a8476285c6
clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
 wenzelm parents: 
43546diff
changeset | 41 | val pretty: binding -> Pretty.T | 
| 42381 
309ec68442c6
added Binding.print convenience, which includes quote already;
 wenzelm parents: 
41254diff
changeset | 42 | val print: binding -> string | 
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 43 | val bad: binding -> string | 
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 44 | val check: binding -> unit | 
| 59886 | 45 | val name_spec: scope list -> (string * bool) list -> binding -> | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 46 |     {restriction: bool option, concealed: bool, spec: (string * bool) list}
 | 
| 29617 | 47 | end; | 
| 28941 | 48 | |
| 32590 
95f4f08f950f
replaced opaque signature matching by plain old abstype (again, cf. ac4498f95d1c) -- this recovers pretty printing in SML/NJ and Poly/ML 5.3;
 wenzelm parents: 
30795diff
changeset | 49 | structure Binding: BINDING = | 
| 28941 | 50 | struct | 
| 51 | ||
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 52 | (** representation **) | 
| 29338 | 53 | |
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 54 | (* scope of restricted entries *) | 
| 59886 | 55 | |
| 56 | datatype scope = Scope of serial; | |
| 57 | ||
| 58 | fun new_scope () = Scope (serial ()); | |
| 59 | ||
| 60 | ||
| 61 | (* binding *) | |
| 29338 | 62 | |
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 63 | datatype binding = Binding of | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 64 |  {restricted: (bool * scope) option,  (*entry is private (true) or qualified (false) wrt. scope*)
 | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 65 | concealed: bool, (*entry is for foundational purposes -- please ignore*) | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 66 | prefix: (string * bool) list, (*system prefix*) | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 67 | qualifier: (string * bool) list, (*user qualifier*) | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 68 | name: bstring, (*base name*) | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 69 | pos: Position.T}; (*source position*) | 
| 28941 | 70 | |
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 71 | fun make_binding (restricted, concealed, prefix, qualifier, name, pos) = | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 72 |   Binding {restricted = restricted, concealed = concealed, prefix = prefix,
 | 
| 59858 | 73 | qualifier = qualifier, name = name, pos = pos}; | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 74 | |
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 75 | fun map_binding f (Binding {restricted, concealed, prefix, qualifier, name, pos}) =
 | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 76 | make_binding (f (restricted, concealed, prefix, qualifier, name, pos)); | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 77 | |
| 59874 | 78 | fun path_of (Binding {prefix, qualifier, ...}) = prefix @ qualifier;
 | 
| 30217 
894eb2034f02
renamed Binding.display to Binding.str_of, which is slightly more canonical;
 wenzelm parents: 
30214diff
changeset | 79 | |
| 63369 | 80 | fun make (name, pos) = make_binding (NONE, false, [], [], name, pos); | 
| 81 | ||
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 82 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 83 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 84 | (** basic operations **) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 85 | |
| 63369 | 86 | (* position *) | 
| 28965 | 87 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 88 | fun pos_of (Binding {pos, ...}) = pos;
 | 
| 63369 | 89 | |
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 90 | fun set_pos pos = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 91 | map_binding (fn (restricted, concealed, prefix, qualifier, name, _) => | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 92 | (restricted, concealed, prefix, qualifier, name, pos)); | 
| 63369 | 93 | |
| 61950 | 94 | val reset_pos = set_pos Position.none; | 
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 95 | |
| 63369 | 96 | fun default_pos b = | 
| 97 | if pos_of b = Position.none then set_pos (Position.thread_data ()) b else b; | |
| 98 | ||
| 70494 | 99 | fun default_pos_of b = | 
| 100 | let val pos = pos_of b | |
| 101 | in if pos = Position.none then Position.thread_data () else pos end; | |
| 102 | ||
| 63369 | 103 | |
| 104 | (* name *) | |
| 105 | ||
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 106 | fun name name = make (name, Position.none); | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 107 | fun name_of (Binding {name, ...}) = name;
 | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 108 | |
| 30338 | 109 | fun eq_name (b, b') = name_of b = name_of b'; | 
| 110 | ||
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 111 | fun map_name f = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 112 | map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 113 | (restricted, concealed, prefix, qualifier, f name, pos)); | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 114 | |
| 30338 | 115 | val prefix_name = map_name o prefix; | 
| 116 | val suffix_name = map_name o suffix; | |
| 28941 | 117 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 118 | val empty = name ""; | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 119 | fun is_empty b = name_of b = ""; | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 120 | |
| 63352 | 121 | val empty_atts = (empty, []); | 
| 122 | fun is_empty_atts (b, atts) = is_empty b andalso null atts; | |
| 123 | ||
| 63006 | 124 | fun conglomerate [b] = b | 
| 71212 | 125 | | conglomerate bs = name (space_implode "_" (map name_of (filter_out is_empty bs))); | 
| 63006 | 126 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 127 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 128 | (* user qualifier *) | 
| 28941 | 129 | |
| 30410 | 130 | fun qualify _ "" = I | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 131 | | qualify mandatory qual = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 132 | map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 133 | (restricted, concealed, prefix, (qual, mandatory) :: qualifier, name, pos)); | 
| 30410 | 134 | |
| 63003 | 135 | fun qualify_name mandatory binding name' = | 
| 136 | binding |> map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | |
| 59858 | 137 | let val qualifier' = if name = "" then qualifier else qualifier @ [(name, mandatory)] | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 138 | in (restricted, concealed, prefix, qualifier', name', pos) end); | 
| 35200 
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
 wenzelm parents: 
33157diff
changeset | 139 | |
| 30361 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 140 | fun qualified_name "" = empty | 
| 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 141 | | qualified_name s = | 
| 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 142 | let val (qualifier, name) = split_last (Long_Name.explode s) | 
| 59886 | 143 | in make_binding (NONE, false, [], map (rpair false) qualifier, name, Position.none) end; | 
| 30361 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 144 | |
| 28965 | 145 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 146 | (* system prefix *) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 147 | |
| 30276 | 148 | fun prefix_of (Binding {prefix, ...}) = prefix;
 | 
| 149 | ||
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 150 | fun map_prefix f = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 151 | map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 152 | (restricted, concealed, f prefix, qualifier, name, pos)); | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 153 | |
| 30335 
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
 wenzelm parents: 
30276diff
changeset | 154 | fun prefix _ "" = I | 
| 30410 | 155 | | prefix mandatory prfx = map_prefix (cons (prfx, mandatory)); | 
| 156 | ||
| 157 | ||
| 59858 | 158 | (* visibility flags *) | 
| 159 | ||
| 62241 | 160 | fun restricted default = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 161 | map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | 
| 62241 | 162 | (if is_some restricted then restricted else default, concealed, prefix, qualifier, name, pos)); | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 163 | |
| 59859 | 164 | val concealed = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 165 | map_binding (fn (restricted, _, prefix, qualifier, name, pos) => | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 166 | (restricted, true, prefix, qualifier, name, pos)); | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 167 | |
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 168 | |
| 42381 
309ec68442c6
added Binding.print convenience, which includes quote already;
 wenzelm parents: 
41254diff
changeset | 169 | (* print *) | 
| 30410 | 170 | |
| 43547 
f3a8476285c6
clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
 wenzelm parents: 
43546diff
changeset | 171 | fun pretty (Binding {prefix, qualifier, name, pos, ...}) =
 | 
| 46897 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 172 | if name = "" then Pretty.str "\"\"" | 
| 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 173 | else | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
48992diff
changeset | 174 | Pretty.markup (Position.markup pos Markup.binding) | 
| 46897 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 175 | [Pretty.str (Long_Name.implode (map #1 (prefix @ qualifier) @ [name]))] | 
| 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 176 | |> Pretty.quote; | 
| 28941 | 177 | |
| 61877 
276ad4354069
renamed Pretty.str_of to Pretty.unformatted_string_of to emphasize its meaning;
 wenzelm parents: 
59990diff
changeset | 178 | val print = Pretty.unformatted_string_of o pretty; | 
| 42381 
309ec68442c6
added Binding.print convenience, which includes quote already;
 wenzelm parents: 
41254diff
changeset | 179 | |
| 63335 | 180 | val _ = ML_system_pp (fn _ => fn _ => Pretty.to_polyml o pretty o reset_pos); | 
| 58032 
e92cdae8b3b5
clarified ML toplevel pp: avoid ML output to be attached to inlined binding positions;
 wenzelm parents: 
53380diff
changeset | 181 | |
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 182 | |
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 183 | (* check *) | 
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 184 | |
| 48992 | 185 | fun bad binding = "Bad name binding: " ^ print binding ^ Position.here (pos_of binding); | 
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 186 | |
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 187 | fun check binding = | 
| 50239 | 188 | if Symbol_Pos.is_identifier (name_of binding) then () | 
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 189 | else legacy_feature (bad binding); | 
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 190 | |
| 59874 | 191 | |
| 192 | ||
| 193 | (** resulting name_spec **) | |
| 194 | ||
| 195 | val bad_specs = ["", "??", "__"]; | |
| 196 | ||
| 59886 | 197 | fun name_spec scopes path binding = | 
| 59874 | 198 | let | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 199 |     val Binding {restricted, concealed, prefix, qualifier, name, ...} = binding;
 | 
| 59874 | 200 | val _ = Long_Name.is_qualified name andalso error (bad binding); | 
| 201 | ||
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 202 | val restriction = | 
| 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 203 | (case restricted of | 
| 59939 
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
 wenzelm parents: 
59886diff
changeset | 204 | NONE => NONE | 
| 
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
 wenzelm parents: 
59886diff
changeset | 205 | | SOME (strict, scope) => if member (op =) scopes scope then NONE else SOME strict); | 
| 59886 | 206 | |
| 59874 | 207 | val spec1 = | 
| 208 | maps (fn (a, b) => map (rpair b) (Long_Name.explode a)) (path @ prefix @ qualifier); | |
| 209 | val spec2 = if name = "" then [] else [(name, true)]; | |
| 210 | val spec = spec1 @ spec2; | |
| 211 | val _ = | |
| 212 | exists (fn (a, _) => member (op =) bad_specs a orelse exists_string (fn s => s = "\"") a) spec | |
| 213 | andalso error (bad binding); | |
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 214 |   in {restriction = restriction, concealed = concealed, spec = if null spec2 then [] else spec} end;
 | 
| 59874 | 215 | |
| 62663 | 216 | |
| 28941 | 217 | end; | 
| 218 | ||
| 30214 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
changeset | 219 | type binding = Binding.binding; |