src/Tools/Code/code_ml.ML
changeset 39057 c6d146ed07ae
parent 39056 fa197571676b
child 39058 551fe1af03b0
equal deleted inserted replaced
39056:fa197571676b 39057:c6d146ed07ae
   788 fun serialize_ml target print_module print_stmt with_signatures { labelled_name,
   788 fun serialize_ml target print_module print_stmt with_signatures { labelled_name,
   789   reserved_syms, includes, module_alias, class_syntax, tyco_syntax,
   789   reserved_syms, includes, module_alias, class_syntax, tyco_syntax,
   790   const_syntax, program, names, presentation_names } =
   790   const_syntax, program, names, presentation_names } =
   791   let
   791   let
   792     val is_cons = Code_Thingol.is_cons program;
   792     val is_cons = Code_Thingol.is_cons program;
   793     val is_presentation = not (null presentation_names);
       
   794     val { deresolver, hierarchical_program = ml_program } =
   793     val { deresolver, hierarchical_program = ml_program } =
   795       ml_program_of_program labelled_name (Name.make_context reserved_syms) module_alias program;
   794       ml_program_of_program labelled_name (Name.make_context reserved_syms) module_alias program;
   796     val print_stmt = print_stmt labelled_name tyco_syntax const_syntax
   795     val print_stmt = print_stmt labelled_name tyco_syntax const_syntax
   797       (make_vars reserved_syms) is_cons;
   796       (make_vars reserved_syms) is_cons;
   798     fun print_node _ (_, Code_Namespace.Dummy) =
   797     fun print_node _ (_, Code_Namespace.Dummy) =
   799           NONE
   798           NONE
   800       | print_node prefix_fragments (name, Code_Namespace.Stmt stmt) =
   799       | print_node prefix_fragments (name, Code_Namespace.Stmt stmt) =
   801           if is_presentation andalso
   800           SOME (apsnd (markup_stmt name) (print_stmt (deresolver prefix_fragments) stmt))
   802             (null o filter (member (op =) presentation_names) o stmt_names_of) stmt
       
   803           then NONE
       
   804           else SOME (apsnd (markup_stmt name) (print_stmt (deresolver prefix_fragments) stmt))
       
   805       | print_node prefix_fragments (name_fragment, Code_Namespace.Module (_, nodes)) =
   801       | print_node prefix_fragments (name_fragment, Code_Namespace.Module (_, nodes)) =
   806           let
   802           let
   807             val (decls, body) = print_nodes (prefix_fragments @ [name_fragment]) nodes;
   803             val (decls, body) = print_nodes (prefix_fragments @ [name_fragment]) nodes;
   808             val p = if is_presentation then Pretty.chunks2 body
   804             val p = print_module name_fragment
   809               else print_module name_fragment
       
   810                 (if with_signatures then SOME decls else NONE) body;
   805                 (if with_signatures then SOME decls else NONE) body;
   811           in SOME ([], p) end
   806           in SOME ([], p) end
   812     and print_nodes prefix_fragments nodes = (map_filter
   807     and print_nodes prefix_fragments nodes = (map_filter
   813         (fn name => print_node prefix_fragments (name, snd (Graph.get_node nodes name)))
   808         (fn name => print_node prefix_fragments (name, snd (Graph.get_node nodes name)))
   814         o rev o flat o Graph.strong_conn) nodes
   809         o rev o flat o Graph.strong_conn) nodes