src/Tools/Code/code_haskell.ML
changeset 34073 7b0bf55adecd
parent 34049 132d169bd6b7
child 34085 420234017d39
equal deleted inserted replaced
34072:99eda1d59da9 34073:7b0bf55adecd
   317       handle Option => error ("Unknown statement name: " ^ labelled_name name);
   317       handle Option => error ("Unknown statement name: " ^ labelled_name name);
   318   in (deresolver, hs_program) end;
   318   in (deresolver, hs_program) end;
   319 
   319 
   320 fun serialize_haskell module_prefix raw_module_name string_classes labelled_name
   320 fun serialize_haskell module_prefix raw_module_name string_classes labelled_name
   321     raw_reserved includes raw_module_alias
   321     raw_reserved includes raw_module_alias
   322     syntax_class syntax_tyco syntax_const program cs destination =
   322     syntax_class syntax_tyco syntax_const (code_of_pretty, code_writeln) program cs destination =
   323   let
   323   let
   324     val stmt_names = Code_Target.stmt_names_of_destination destination;
   324     val stmt_names = Code_Target.stmt_names_of_destination destination;
   325     val module_name = if null stmt_names then raw_module_name else SOME "Code";
   325     val module_name = if null stmt_names then raw_module_name else SOME "Code";
   326     val reserved = fold (insert (op =) o fst) includes raw_reserved;
   326     val reserved = fold (insert (op =) o fst) includes raw_reserved;
   327     val (deresolver, hs_program) = haskell_program_of_program labelled_name
   327     val (deresolver, hs_program) = haskell_program_of_program labelled_name
   365         fun print_import_include (name, _) = str ("import qualified " ^ name ^ ";");
   365         fun print_import_include (name, _) = str ("import qualified " ^ name ^ ";");
   366         fun print_import_module name = str ((if qualified
   366         fun print_import_module name = str ((if qualified
   367           then "import qualified "
   367           then "import qualified "
   368           else "import ") ^ name ^ ";");
   368           else "import ") ^ name ^ ";");
   369         val import_ps = map print_import_include includes @ map print_import_module imports
   369         val import_ps = map print_import_include includes @ map print_import_module imports
   370         val content = Pretty.chunks2 (if null import_ps then [] else [Pretty.chunks import_ps]
   370         val content = Pretty.chunks2 ((if null import_ps then [] else [Pretty.chunks import_ps])
   371             @ map_filter
   371             @ map_filter
   372               (fn (name, (_, SOME stmt)) => SOME (print_stmt qualified (name, stmt))
   372               (fn (name, (_, SOME stmt)) => SOME (print_stmt qualified (name, stmt))
   373                 | (_, (_, NONE)) => NONE) stmts
   373                 | (_, (_, NONE)) => NONE) stmts
   374           );
   374           );
   375       in print_module module_name' content end;
   375       in print_module module_name' content end;
   391                 o Long_Name.explode) modlname;
   391                 o Long_Name.explode) modlname;
   392         val pathname = Path.append destination filename;
   392         val pathname = Path.append destination filename;
   393         val _ = File.mkdir (Path.dir pathname);
   393         val _ = File.mkdir (Path.dir pathname);
   394       in File.write pathname
   394       in File.write pathname
   395         ("{-# OPTIONS_GHC -fglasgow-exts #-}\n\n"
   395         ("{-# OPTIONS_GHC -fglasgow-exts #-}\n\n"
   396           ^ Code_Target.code_of_pretty content)
   396           ^ code_of_pretty content)
   397       end
   397       end
   398   in
   398   in
   399     Code_Target.mk_serialization target NONE
   399     Code_Target.mk_serialization target NONE
   400       (fn NONE => K () o map (Code_Target.code_writeln o snd) | SOME file => K () o map
   400       (fn NONE => K () o map (code_writeln o snd) | SOME file => K () o map
   401         (write_module (check_destination file)))
   401         (write_module (check_destination file)))
   402       (rpair [] o cat_lines o map (Code_Target.code_of_pretty o snd))
   402       (rpair [] o cat_lines o map (code_of_pretty o snd))
   403       (map (uncurry print_module) includes
   403       (map (uncurry print_module) includes
   404         @ map serialize_module (Symtab.dest hs_program))
   404         @ map serialize_module (Symtab.dest hs_program))
   405       destination
   405       destination
   406   end;
   406   end;
   407 
   407