| author | wenzelm | 
| Sun, 06 Mar 2016 13:19:19 +0100 | |
| changeset 62528 | c8c532b22947 | 
| parent 62241 | a4a1f282bcd5 | 
| child 62663 | bea354f6ff21 | 
| 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 | 
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 20 | val name: bstring -> binding | 
| 30464 | 21 | 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 | 22 | val map_name: (bstring -> bstring) -> binding -> binding | 
| 30338 | 23 | val prefix_name: string -> binding -> binding | 
| 24 | val suffix_name: string -> binding -> binding | |
| 25 | val eq_name: binding * binding -> bool | |
| 29617 | 26 | 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 | 27 | val is_empty: binding -> bool | 
| 30410 | 28 | val qualify: bool -> string -> binding -> binding | 
| 35200 
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
 wenzelm parents: 
33157diff
changeset | 29 | val qualified: bool -> string -> binding -> binding | 
| 30464 | 30 | val qualified_name: string -> binding | 
| 30276 | 31 | 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 | 32 | 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 | 33 | val prefix: bool -> string -> binding -> binding | 
| 62241 | 34 | val restricted: (bool * scope) option -> binding -> binding | 
| 59859 | 35 | val concealed: binding -> binding | 
| 43547 
f3a8476285c6
clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
 wenzelm parents: 
43546diff
changeset | 36 | val pretty: binding -> Pretty.T | 
| 42381 
309ec68442c6
added Binding.print convenience, which includes quote already;
 wenzelm parents: 
41254diff
changeset | 37 | val print: binding -> string | 
| 58032 
e92cdae8b3b5
clarified ML toplevel pp: avoid ML output to be attached to inlined binding positions;
 wenzelm parents: 
53380diff
changeset | 38 | val pp: binding -> Pretty.T | 
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 39 | val bad: binding -> string | 
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 40 | val check: binding -> unit | 
| 59886 | 41 | 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 | 42 |     {restriction: bool option, concealed: bool, spec: (string * bool) list}
 | 
| 29617 | 43 | end; | 
| 28941 | 44 | |
| 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 | 45 | structure Binding: BINDING = | 
| 28941 | 46 | struct | 
| 47 | ||
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 48 | (** representation **) | 
| 29338 | 49 | |
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 50 | (* scope of restricted entries *) | 
| 59886 | 51 | |
| 52 | datatype scope = Scope of serial; | |
| 53 | ||
| 54 | fun new_scope () = Scope (serial ()); | |
| 55 | ||
| 56 | ||
| 57 | (* binding *) | |
| 29338 | 58 | |
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 59 | 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 | 60 |  {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 | 61 | 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 | 62 | 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 | 63 | 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 | 64 | 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 | 65 | pos: Position.T}; (*source position*) | 
| 28941 | 66 | |
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 67 | 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 | 68 |   Binding {restricted = restricted, concealed = concealed, prefix = prefix,
 | 
| 59858 | 69 | 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 | 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 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 | 72 | 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 | 73 | |
| 59874 | 74 | 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 | 75 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 76 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 77 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 78 | (** basic operations **) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 79 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 80 | (* name and position *) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 81 | |
| 59886 | 82 | fun make (name, pos) = make_binding (NONE, false, [], [], name, pos); | 
| 28965 | 83 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 84 | fun pos_of (Binding {pos, ...}) = pos;
 | 
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 85 | 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 | 86 | 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 | 87 | (restricted, concealed, prefix, qualifier, name, pos)); | 
| 61950 | 88 | val reset_pos = set_pos Position.none; | 
| 53380 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 89 | |
| 
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
 wenzelm parents: 
50239diff
changeset | 90 | 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 | 91 | 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 | 92 | |
| 30338 | 93 | fun eq_name (b, b') = name_of b = name_of b'; | 
| 94 | ||
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 95 | 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 | 96 | 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 | 97 | (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 | 98 | |
| 30338 | 99 | val prefix_name = map_name o prefix; | 
| 100 | val suffix_name = map_name o suffix; | |
| 28941 | 101 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 102 | 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 | 103 | 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 | 104 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 105 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 106 | (* user qualifier *) | 
| 28941 | 107 | |
| 30410 | 108 | fun qualify _ "" = I | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 109 | | 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 | 110 | 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 | 111 | (restricted, concealed, prefix, (qual, mandatory) :: qualifier, name, pos)); | 
| 30410 | 112 | |
| 59858 | 113 | fun qualified mandatory name' = | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 114 | map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | 
| 59858 | 115 | 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 | 116 | in (restricted, concealed, prefix, qualifier', name', pos) end); | 
| 35200 
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
 wenzelm parents: 
33157diff
changeset | 117 | |
| 30361 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 118 | fun qualified_name "" = empty | 
| 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 119 | | qualified_name s = | 
| 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 120 | let val (qualifier, name) = split_last (Long_Name.explode s) | 
| 59886 | 121 | 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 | 122 | |
| 28965 | 123 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 124 | (* system prefix *) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 125 | |
| 30276 | 126 | fun prefix_of (Binding {prefix, ...}) = prefix;
 | 
| 127 | ||
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 128 | 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 | 129 | 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 | 130 | (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 | 131 | |
| 30335 
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
 wenzelm parents: 
30276diff
changeset | 132 | fun prefix _ "" = I | 
| 30410 | 133 | | prefix mandatory prfx = map_prefix (cons (prfx, mandatory)); | 
| 134 | ||
| 135 | ||
| 59858 | 136 | (* visibility flags *) | 
| 137 | ||
| 62241 | 138 | 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 | 139 | map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => | 
| 62241 | 140 | (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 | 141 | |
| 59859 | 142 | 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 | 143 | 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 | 144 | (restricted, true, prefix, qualifier, name, pos)); | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 145 | |
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 146 | |
| 42381 
309ec68442c6
added Binding.print convenience, which includes quote already;
 wenzelm parents: 
41254diff
changeset | 147 | (* print *) | 
| 30410 | 148 | |
| 43547 
f3a8476285c6
clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
 wenzelm parents: 
43546diff
changeset | 149 | fun pretty (Binding {prefix, qualifier, name, pos, ...}) =
 | 
| 46897 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 150 | if name = "" then Pretty.str "\"\"" | 
| 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 151 | else | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
48992diff
changeset | 152 | Pretty.markup (Position.markup pos Markup.binding) | 
| 46897 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 153 | [Pretty.str (Long_Name.implode (map #1 (prefix @ qualifier) @ [name]))] | 
| 
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
 wenzelm parents: 
45666diff
changeset | 154 | |> Pretty.quote; | 
| 28941 | 155 | |
| 61877 
276ad4354069
renamed Pretty.str_of to Pretty.unformatted_string_of to emphasize its meaning;
 wenzelm parents: 
59990diff
changeset | 156 | val print = Pretty.unformatted_string_of o pretty; | 
| 42381 
309ec68442c6
added Binding.print convenience, which includes quote already;
 wenzelm parents: 
41254diff
changeset | 157 | |
| 58032 
e92cdae8b3b5
clarified ML toplevel pp: avoid ML output to be attached to inlined binding positions;
 wenzelm parents: 
53380diff
changeset | 158 | val pp = pretty o set_pos Position.none; | 
| 
e92cdae8b3b5
clarified ML toplevel pp: avoid ML output to be attached to inlined binding positions;
 wenzelm parents: 
53380diff
changeset | 159 | |
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 160 | |
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 161 | (* check *) | 
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 162 | |
| 48992 | 163 | 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 | 164 | |
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 165 | fun check binding = | 
| 50239 | 166 | if Symbol_Pos.is_identifier (name_of binding) then () | 
| 41254 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 167 | else legacy_feature (bad binding); | 
| 
78c3e472bb35
extra checking of name bindings for classes, types, consts;
 wenzelm parents: 
39442diff
changeset | 168 | |
| 59874 | 169 | |
| 170 | ||
| 171 | (** resulting name_spec **) | |
| 172 | ||
| 173 | val bad_specs = ["", "??", "__"]; | |
| 174 | ||
| 59886 | 175 | fun name_spec scopes path binding = | 
| 59874 | 176 | 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 | 177 |     val Binding {restricted, concealed, prefix, qualifier, name, ...} = binding;
 | 
| 59874 | 178 | val _ = Long_Name.is_qualified name andalso error (bad binding); | 
| 179 | ||
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 180 | 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 | 181 | (case restricted of | 
| 59939 
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
 wenzelm parents: 
59886diff
changeset | 182 | NONE => NONE | 
| 
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
 wenzelm parents: 
59886diff
changeset | 183 | | SOME (strict, scope) => if member (op =) scopes scope then NONE else SOME strict); | 
| 59886 | 184 | |
| 59874 | 185 | val spec1 = | 
| 186 | maps (fn (a, b) => map (rpair b) (Long_Name.explode a)) (path @ prefix @ qualifier); | |
| 187 | val spec2 = if name = "" then [] else [(name, true)]; | |
| 188 | val spec = spec1 @ spec2; | |
| 189 | val _ = | |
| 190 | exists (fn (a, _) => member (op =) bad_specs a orelse exists_string (fn s => s = "\"") a) spec | |
| 191 | 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 | 192 |   in {restriction = restriction, concealed = concealed, spec = if null spec2 then [] else spec} end;
 | 
| 59874 | 193 | |
| 28941 | 194 | end; | 
| 195 | ||
| 30214 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
changeset | 196 | type binding = Binding.binding; |