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 |