src/Pure/General/name_space.ML
changeset 28965 1de908189869
parent 28941 128459bd72d2
child 28991 694227dd3e8c
equal deleted inserted replaced
28963:f6d9e0e0b153 28965:1de908189869
    28   val extern: T -> string -> xstring
    28   val extern: T -> string -> xstring
    29   val hide: bool -> string -> T -> T
    29   val hide: bool -> string -> T -> T
    30   val get_accesses: T -> string -> xstring list
    30   val get_accesses: T -> string -> xstring list
    31   val merge: T * T -> T
    31   val merge: T * T -> T
    32   type naming
    32   type naming
       
    33   val default_naming: naming
       
    34   val declare: naming -> Binding.T -> T -> string * T
       
    35   val full_name: naming -> Binding.T -> string
       
    36   val declare_base: naming -> string -> T -> T
       
    37   val external_names: naming -> string -> string list
    33   val path_of: naming -> string
    38   val path_of: naming -> string
    34   val external_names: naming -> string -> string list
       
    35   val full: naming -> bstring -> string
       
    36   val declare: naming -> string -> T -> T
       
    37   val default_naming: naming
       
    38   val add_path: string -> naming -> naming
    39   val add_path: string -> naming -> naming
    39   val no_base_names: naming -> naming
    40   val no_base_names: naming -> naming
    40   val qualified_names: naming -> naming
    41   val qualified_names: naming -> naming
    41   val sticky_prefix: string -> naming -> naming
    42   val sticky_prefix: string -> naming -> naming
    42   val full_binding: naming -> Binding.T -> string
       
    43   val declare_binding: naming -> Binding.T -> T -> string * T
       
    44   type 'a table = T * 'a Symtab.table
    43   type 'a table = T * 'a Symtab.table
    45   val empty_table: 'a table
    44   val empty_table: 'a table
    46   val table_declare: naming -> Binding.T * 'a
    45   val bind: naming -> Binding.T * 'a
    47     -> 'a table -> string * 'a table (*exception Symtab.DUP*)
    46     -> 'a table -> string * 'a table (*exception Symtab.DUP*)
    48   val table_declare_permissive: naming -> Binding.T * 'a
       
    49     -> 'a table -> string * 'a table
       
    50   val extend_table: naming -> (bstring * 'a) list -> 'a table -> 'a table
       
    51   val merge_tables: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table
    47   val merge_tables: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table
    52   val dest_table: 'a table -> (string * 'a) list
    48   val dest_table: 'a table -> (string * 'a) list
    53   val extern_table: 'a table -> (xstring * 'a) list
    49   val extern_table: 'a table -> (xstring * 'a) list
       
    50   val extend_table: naming -> (bstring * 'a) list -> 'a table -> 'a table
    54 end;
    51 end;
    55 
    52 
    56 structure NameSpace: NAME_SPACE =
    53 structure NameSpace: NAME_SPACE =
    57 struct
    54 struct
    58 
    55 
   267 
   264 
   268 (* declarations *)
   265 (* declarations *)
   269 
   266 
   270 fun full (Naming (path, (qualify, _))) = qualify path;
   267 fun full (Naming (path, (qualify, _))) = qualify path;
   271 
   268 
   272 fun declare naming name space =
   269 fun full_name naming b =
       
   270   let val (prefix, bname) = Binding.dest b
       
   271   in full (apply_prefix prefix naming) bname end;
       
   272 
       
   273 fun declare_base naming name space =
   273   if is_hidden name then
   274   if is_hidden name then
   274     error ("Attempt to declare hidden name " ^ quote name)
   275     error ("Attempt to declare hidden name " ^ quote name)
   275   else
   276   else
   276     let
   277     let
   277       val names = explode_name name;
   278       val names = explode_name name;
   279           orelse exists_string (fn s => s = "\"") name) andalso
   280           orelse exists_string (fn s => s = "\"") name) andalso
   280         error ("Bad name declaration " ^ quote name);
   281         error ("Bad name declaration " ^ quote name);
   281       val (accs, accs') = pairself (map implode_name) (accesses naming names);
   282       val (accs, accs') = pairself (map implode_name) (accesses naming names);
   282     in space |> fold (add_name name) accs |> put_accesses name accs' end;
   283     in space |> fold (add_name name) accs |> put_accesses name accs' end;
   283 
   284 
   284 fun declare_binding bnaming b =
   285 fun declare bnaming b =
   285   let
   286   let
   286     val (prefix, bname) = Binding.dest_binding b;
   287     val (prefix, bname) = Binding.dest b;
   287     val naming = apply_prefix prefix bnaming;
   288     val naming = apply_prefix prefix bnaming;
   288     val name = full naming bname;
   289     val name = full naming bname;
   289   in declare naming name #> pair name end;
   290   in declare_base naming name #> pair name end;
   290 
   291 
   291 
   292 
   292 
   293 
   293 (** name spaces coupled with symbol tables **)
   294 (** name spaces coupled with symbol tables **)
   294 
   295 
   295 type 'a table = T * 'a Symtab.table;
   296 type 'a table = T * 'a Symtab.table;
   296 
   297 
   297 val empty_table = (empty, Symtab.empty);
   298 val empty_table = (empty, Symtab.empty);
   298 
   299 
   299 fun gen_table_declare update naming (binding, x) (space, tab) =
   300 fun bind naming (b, x) (space, tab) =
   300   let
   301   let
   301     val (name, space') = declare_binding naming binding space;
   302     val (name, space') = declare naming b space;
   302   in (name, (space', update (name, x) tab)) end;
   303   in (name, (space', Symtab.update_new (name, x) tab)) end;
   303 
       
   304 fun table_declare naming = gen_table_declare Symtab.update_new naming;
       
   305 fun table_declare_permissive naming = gen_table_declare Symtab.update naming;
       
   306 
       
   307 fun full_binding naming b =
       
   308   let val (prefix, bname) = Binding.dest_binding b
       
   309   in full (apply_prefix prefix naming) bname end;
       
   310 
   304 
   311 fun extend_table naming bentries (space, tab) =
   305 fun extend_table naming bentries (space, tab) =
   312   let val entries = map (apfst (full naming)) bentries
   306   let val entries = map (apfst (full naming)) bentries
   313   in (fold (declare naming o #1) entries space, Symtab.extend (tab, entries)) end;
   307   in (fold (declare_base naming o #1) entries space, Symtab.extend (tab, entries)) end;
   314 
   308 
   315 fun merge_tables eq ((space1, tab1), (space2, tab2)) =
   309 fun merge_tables eq ((space1, tab1), (space2, tab2)) =
   316   (merge (space1, space2), Symtab.merge eq (tab1, tab2));
   310   (merge (space1, space2), Symtab.merge eq (tab1, tab2));
   317 
   311 
   318 fun ext_table (space, tab) =
   312 fun ext_table (space, tab) =