src/Pure/General/name_space.ML
changeset 77978 14d133cff073
parent 77977 85811617efcd
child 77979 a12c48fbf10f
equal deleted inserted replaced
77977:85811617efcd 77978:14d133cff073
   146 
   146 
   147 type internals = string list Long_Name.Chunks.T;  (*external name -> internal names*)
   147 type internals = string list Long_Name.Chunks.T;  (*external name -> internal names*)
   148 
   148 
   149 val merge_internals : internals * internals -> internals = Long_Name.Chunks.merge_list (op =);
   149 val merge_internals : internals * internals -> internals = Long_Name.Chunks.merge_list (op =);
   150 
   150 
   151 fun add_name name xname : internals -> internals =
   151 fun add_internals name xname : internals -> internals =
   152   Long_Name.Chunks.update_list (op =) (xname, name);
   152   Long_Name.Chunks.update_list (op =) (xname, name);
   153 
   153 
   154 fun del_name name xname : internals -> internals =
   154 fun del_internals name xname : internals -> internals =
   155   Long_Name.Chunks.remove_list (op =) (xname, name);
   155   Long_Name.Chunks.remove_list (op =) (xname, name);
   156 
   156 
   157 fun del_name_extra name xname : internals -> internals =
   157 fun del_internals' name xname : internals -> internals =
   158   Long_Name.Chunks.map_default (xname, []) (fn [] => [] | x :: xs => x :: remove (op =) name xs);
   158   Long_Name.Chunks.map_default (xname, []) (fn [] => [] | x :: xs => x :: remove (op =) name xs);
   159 
   159 
   160 
   160 
   161 (* accesses *)
   161 (* accesses *)
   162 
   162 
   539       val accesses =
   539       val accesses =
   540         get_accesses {intern = true, aliases = true, valid = true} space name
   540         get_accesses {intern = true, aliases = true, valid = true} space name
   541         |> not fully ? inter Long_Name.eq_chunks [Long_Name.base_chunks name];
   541         |> not fully ? inter Long_Name.eq_chunks [Long_Name.base_chunks name];
   542       val accesses' = get_accesses {intern = false, aliases = false, valid = true} space name;
   542       val accesses' = get_accesses {intern = false, aliases = false, valid = true} space name;
   543       val internals' = internals
   543       val internals' = internals
   544         |> fold (del_name name) accesses
   544         |> fold (del_internals name) accesses
   545         |> fold (del_name_extra name) accesses';
   545         |> fold (del_internals' name) accesses';
   546       val internals_hidden' = internals_hidden
   546       val internals_hidden' = internals_hidden
   547         |> add_name name (Long_Name.make_chunks name);
   547         |> add_internals name (Long_Name.make_chunks name);
   548     in (kind, internals', internals_hidden', entries, aliases) end);
   548     in (kind, internals', internals_hidden', entries, aliases) end);
   549 
   549 
   550 
   550 
   551 (* alias *)
   551 (* alias *)
   552 
   552 
   559     val new_entry = is_none (lookup_entries space alias_name);
   559     val new_entry = is_none (lookup_entries space alias_name);
   560     val decl_entry = can (the_entry space) alias_name;
   560     val decl_entry = can (the_entry space) alias_name;
   561   in
   561   in
   562     space |> map_name_space (fn (kind, internals, internals_hidden, entries, aliases) =>
   562     space |> map_name_space (fn (kind, internals, internals_hidden, entries, aliases) =>
   563       let
   563       let
   564         val internals' = internals |> fold (add_name name) alias_accesses;
   564         val internals' = internals |> fold (add_internals name) alias_accesses;
   565         val entries' =
   565         val entries' =
   566           if name <> alias_name andalso (new_entry orelse strict) then
   566           if name <> alias_name andalso (new_entry orelse strict) then
   567             entries |> update_entry strict kind (alias_name,
   567             entries |> update_entry strict kind (alias_name,
   568               Alias {
   568               Alias {
   569                 suppress = suppress,
   569                 suppress = suppress,
   622         pos = pos,
   622         pos = pos,
   623         serial = serial ()};
   623         serial = serial ()};
   624     val space' =
   624     val space' =
   625       space |> map_name_space (fn (kind, internals, internals_hidden, entries, aliases) =>
   625       space |> map_name_space (fn (kind, internals, internals_hidden, entries, aliases) =>
   626         let
   626         let
   627           val internals' = internals |> fold (add_name name) accesses;
   627           val internals' = internals |> fold (add_internals name) accesses;
   628           val entries' = entries |> update_entry strict kind (name, entry);
   628           val entries' = entries |> update_entry strict kind (name, entry);
   629         in (kind, internals', internals_hidden, entries', aliases) end);
   629         in (kind, internals', internals_hidden, entries', aliases) end);
   630     val _ =
   630     val _ =
   631       if proper_pos andalso Context_Position.is_reported_generic context pos then
   631       if proper_pos andalso Context_Position.is_reported_generic context pos then
   632         Position.report pos (markup_entry {def = true} (kind_of space) (name, entry))
   632         Position.report pos (markup_entry {def = true} (kind_of space) (name, entry))