src/Tools/Code/code_namespace.ML
changeset 39055 81e0368812ad
parent 39029 cef7b58555aa
child 39147 3c284a152bd6
equal deleted inserted replaced
39034:ebeb48fd653b 39055:81e0368812ad
     4 Mastering target language namespaces.
     4 Mastering target language namespaces.
     5 *)
     5 *)
     6 
     6 
     7 signature CODE_NAMESPACE =
     7 signature CODE_NAMESPACE =
     8 sig
     8 sig
       
     9   val dest_name: string -> string * string
     9   datatype ('a, 'b) node =
    10   datatype ('a, 'b) node =
    10       Dummy
    11       Dummy
    11     | Stmt of 'a
    12     | Stmt of 'a
    12     | Module of ('b * (string * ('a, 'b) node) Graph.T);
    13     | Module of ('b * (string * ('a, 'b) node) Graph.T);
    13   val hierarchical_program: (string -> string) -> { module_alias: string -> string option,
    14   val hierarchical_program: (string -> string) -> { module_alias: string -> string option,
    21 end;
    22 end;
    22 
    23 
    23 structure Code_Namespace : CODE_NAMESPACE =
    24 structure Code_Namespace : CODE_NAMESPACE =
    24 struct
    25 struct
    25 
    26 
    26 (* hierarchical program structure *)
    27 (** splitting names in module and base part **)
       
    28 
       
    29 val dest_name =
       
    30   apfst Long_Name.implode o split_last o fst o split_last o Long_Name.explode;
       
    31 
       
    32 
       
    33 (** hierarchical program structure **)
    27 
    34 
    28 datatype ('a, 'b) node =
    35 datatype ('a, 'b) node =
    29     Dummy
    36     Dummy
    30   | Stmt of 'a
    37   | Stmt of 'a
    31   | Module of ('b * (string * ('a, 'b) node) Graph.T);
    38   | Module of ('b * (string * ('a, 'b) node) Graph.T);
    44     (* building module name hierarchy *)
    51     (* building module name hierarchy *)
    45     fun alias_fragments name = case module_alias name
    52     fun alias_fragments name = case module_alias name
    46      of SOME name' => Long_Name.explode name'
    53      of SOME name' => Long_Name.explode name'
    47       | NONE => map (fn name => fst (yield_singleton Name.variants name reserved))
    54       | NONE => map (fn name => fst (yield_singleton Name.variants name reserved))
    48           (Long_Name.explode name);
    55           (Long_Name.explode name);
    49     val module_names = Graph.fold (insert (op =) o fst o Code_Printer.dest_name o fst) program [];
    56     val module_names = Graph.fold (insert (op =) o fst o dest_name o fst) program [];
    50     val fragments_tab = fold (fn name => Symtab.update
    57     val fragments_tab = fold (fn name => Symtab.update
    51       (name, alias_fragments name)) module_names Symtab.empty;
    58       (name, alias_fragments name)) module_names Symtab.empty;
    52     val dest_name = Code_Printer.dest_name #>> (the o Symtab.lookup fragments_tab);
    59     val dest_name = dest_name #>> (the o Symtab.lookup fragments_tab);
    53 
    60 
    54     (* building empty module hierarchy *)
    61     (* building empty module hierarchy *)
    55     val empty_module = (empty_data, Graph.empty);
    62     val empty_module = (empty_data, Graph.empty);
    56     fun ensure_module name_fragment (data, nodes) =
    63     fun ensure_module name_fragment (data, nodes) =
    57       if can (Graph.get_node nodes) name_fragment then (data, nodes)
    64       if can (Graph.get_node nodes) name_fragment then (data, nodes)