diff --git a/compiler/handle_options.m b/compiler/handle_options.m index e4235ee40..a8b7b038c 100644 --- a/compiler/handle_options.m +++ b/compiler/handle_options.m @@ -3389,7 +3389,7 @@ disable_smart_recompilation(OptionDescr, !Globals, !Specs, !IO) :- usage_errors(ProgressStream, Globals, Specs, !IO) :- io.progname_base("mercury_compile", ProgName, !IO), io.format(ProgressStream, "%s:\n", [s(ProgName)], !IO), - write_error_specs(ProgressStream, Globals, Specs, !IO). + write_error_specs(ProgressStream, Globals, Specs, !IO). % usage msg only %---------------------------------------------------------------------------% :- end_module libs.handle_options. diff --git a/compiler/mercury_compile_main.m b/compiler/mercury_compile_main.m index 754f5a472..4eda7bce2 100644 --- a/compiler/mercury_compile_main.m +++ b/compiler/mercury_compile_main.m @@ -206,7 +206,8 @@ main_after_setup(ProgressStream, ErrorStream, Globals, ArgPack, !IO) :- HaveParseTreeMaps0, _HaveParseTreeMaps, init_maybe_written_specs, MaybeWrittenSpecs, !IO), write_not_yet_written_specs(ErrorStream, Globals, - MaybeWrittenSpecs, _, !IO) + MaybeWrittenSpecs, _, !IO), + maybe_print_delayed_error_messages(ErrorStream, Globals, !IO) ). %---------------------------------------------------------------------------% @@ -229,11 +230,12 @@ do_op_mode(ProgressStream, ErrorStream, Globals, OpMode, ArgPack, ; OpMode = opm_top_generate_source_file_mapping, ArgPack = compiler_arg_pack(_, _, _, Args), - source_file_map.write_source_file_map(ErrorStream, Globals, Args, !IO) + source_file_map.write_source_file_map(Args, FileMapSpecs, !IO), + add_to_be_written_specs(FileMapSpecs, !MaybeWrittenSpecs) ; OpMode = opm_top_generate_standalone_interface(StandaloneIntBasename), - do_op_mode_standalone_interface(ProgressStream, ErrorStream, Globals, - StandaloneIntBasename, !IO) + do_op_mode_standalone_interface(ProgressStream, Globals, + StandaloneIntBasename, !MaybeWrittenSpecs, !IO) ; OpMode = opm_top_query(OpModeQuery), do_op_mode_query(Globals, OpModeQuery, !MaybeWrittenSpecs, !IO) @@ -256,11 +258,11 @@ do_op_mode(ProgressStream, ErrorStream, Globals, OpMode, ArgPack, ). :- pred do_op_mode_standalone_interface(io.text_output_stream::in, - io.text_output_stream::in, globals::in, string::in, - io::di, io::uo) is det. + globals::in, string::in, + maybe_written_specs::in, maybe_written_specs::out, io::di, io::uo) is det. -do_op_mode_standalone_interface(ProgressStream, ErrorStream, Globals, - StandaloneIntBasename, !IO) :- +do_op_mode_standalone_interface(ProgressStream, Globals, + StandaloneIntBasename, !MaybeWrittenSpecs, !IO) :- globals.get_target(Globals, Target), ( ( Target = target_csharp @@ -273,7 +275,7 @@ do_op_mode_standalone_interface(ProgressStream, ErrorStream, Globals, words(compilation_target_string(Target)), suffix("."), nl], Spec = no_ctxt_spec($pred, severity_error, phase_options, Pieces), - write_error_spec(ErrorStream, Globals, Spec, !IO) + add_to_be_written_specs([Spec], !MaybeWrittenSpecs) ; Target = target_c, make_standalone_interface(Globals, ProgressStream, @@ -460,9 +462,9 @@ do_op_mode_args(ProgressStream, ErrorStream, Globals, OpModeArgs, ExitStatus = 0 then ExtraObjFiles = cord.list(ExtraObjFilesCord), - generate_executable(ProgressStream, ErrorStream, Globals, - InvokedByMmcMake, Params, - FirstModuleName, ModulesToLink, ExtraObjFiles, !IO) + generate_executable(ProgressStream, Globals, InvokedByMmcMake, + Params, FirstModuleName, ModulesToLink, ExtraObjFiles, + !MaybeWrittenSpecs, !IO) else if all_args_end_in_dot_m(Args) = yes, AllSpecsSoFar = @@ -493,8 +495,7 @@ do_op_mode_args(ProgressStream, ErrorStream, Globals, OpModeArgs, ) else true - ), - maybe_print_delayed_error_messages(ErrorStream, Globals, !IO) + ) ; LibgradeCheckSpecs = [_ | _], % Print all remaining module-specific error_specs. @@ -561,13 +562,14 @@ could_not_read_some_int_file([Spec | Specs]) = CouldNotRead :- %---------------------------------------------------------------------------% -:- pred generate_executable(io.text_output_stream::in, - io.text_output_stream::in, globals::in, op_mode_invoked_by_mmc_make::in, - compiler_params::in, module_name::in, - list(module_name)::in, list(string)::in, io::di, io::uo) is det. +:- pred generate_executable(io.text_output_stream::in, globals::in, + op_mode_invoked_by_mmc_make::in, compiler_params::in, module_name::in, + list(module_name)::in, list(string)::in, + maybe_written_specs::in, maybe_written_specs::out, io::di, io::uo) is det. -generate_executable(ProgressStream, ErrorStream, Globals, InvokedByMmcMake, - Params, FirstModuleName, ModulesToLink, ExtraObjFiles, !IO) :- +generate_executable(ProgressStream, Globals, InvokedByMmcMake, Params, + FirstModuleName, ModulesToLink, ExtraObjFiles, + !MaybeWrittenSpecs, !IO) :- globals.get_target(Globals, Target), ( Target = target_java, @@ -586,7 +588,7 @@ generate_executable(ProgressStream, ErrorStream, Globals, InvokedByMmcMake, link_files_into_executable_or_library_for_c_cs_java(ProgressStream, Globals, csharp_executable, FirstModuleName, CssFilesToLink, Specs, Succeeded, !IO), - write_error_specs(ErrorStream, Globals, Specs, !IO) + add_to_be_written_specs(Specs, !MaybeWrittenSpecs) ; Target = target_c, ( @@ -612,7 +614,7 @@ generate_executable(ProgressStream, ErrorStream, Globals, InvokedByMmcMake, Specs, Succeeded, !IO) ) ), - write_error_specs(ErrorStream, Globals, Specs, !IO) + add_to_be_written_specs(Specs, !MaybeWrittenSpecs) ), maybe_set_exit_status(Succeeded, !IO). diff --git a/compiler/mercury_compile_make_hlds.m b/compiler/mercury_compile_make_hlds.m index 2984a8996..62c7dc3ba 100644 --- a/compiler/mercury_compile_make_hlds.m +++ b/compiler/mercury_compile_make_hlds.m @@ -153,10 +153,10 @@ make_hlds_pass(ProgressStream, ErrorStream, Globals, ModuleName, MaybeDFileTransOptDeps, !IO) ), - maybe_grab_plain_and_trans_opt_files(ProgressStream, ErrorStream, Globals, + maybe_grab_plain_and_trans_opt_files(ProgressStream, Globals, OpModeAugment, Verbose, MaybeDFileTransOptDeps, OptBlockingSpecs, Baggage0, Baggage1, AugCompUnit0, AugCompUnit1, - !HaveReadModuleMaps, !IO), + !HaveReadModuleMaps, !MaybeWrittenSpecs, !IO), ( OptBlockingSpecs = [], IntermodError = no @@ -512,16 +512,16 @@ read_d_file_get_modules(InStream, TransOptDeps, !IO) :- %---------------------% :- pred maybe_grab_plain_and_trans_opt_files(io.text_output_stream::in, - io.text_output_stream::in, globals::in, op_mode_augment::in, + globals::in, op_mode_augment::in, bool::in, maybe(list(module_name))::in, list(error_spec)::out, module_baggage::in, module_baggage::out, aug_compilation_unit::in, aug_compilation_unit::out, have_parse_tree_maps::in, have_parse_tree_maps::out, - io::di, io::uo) is det. + maybe_written_specs::in, maybe_written_specs::out, io::di, io::uo) is det. -maybe_grab_plain_and_trans_opt_files(ProgressStream, ErrorStream, Globals, - OpModeAugment, Verbose, MaybeDFileTransOptDeps, BlockingSpecs, - !Baggage, !AugCompUnit, !HaveReadModuleMaps, !IO) :- +maybe_grab_plain_and_trans_opt_files(ProgressStream, Globals, OpModeAugment, + Verbose, MaybeDFileTransOptDeps, BlockingSpecs, !Baggage, + !AugCompUnit, !HaveReadModuleMaps, !MaybeWrittenSpecs, !IO) :- globals.lookup_bool_option(Globals, intermodule_optimization, IntermodOpt), globals.lookup_bool_option(Globals, use_opt_files, UseOptInt), globals.lookup_bool_option(Globals, transitive_optimization, TransOpt), @@ -540,7 +540,7 @@ maybe_grab_plain_and_trans_opt_files(ProgressStream, ErrorStream, Globals, grab_plain_opt_and_int_for_opt_files(ProgressStream, Globals, PlainOptBlockingSpecs, !Baggage, !AugCompUnit, !HaveReadModuleMaps, !IO), - maybe_write_string(ProgressStream, Verbose, "% Done.\n", !IO) + maybe_write_string(ProgressStream, Verbose, "% done.\n", !IO) else PlainOptBlockingSpecs = [] ), @@ -569,7 +569,7 @@ maybe_grab_plain_and_trans_opt_files(ProgressStream, ErrorStream, Globals, words("You need to remake the dependencies."), nl], Severity = severity_warning(warn_missing_trans_opt_deps), Spec = no_ctxt_spec($pred, Severity, phase_read_files, Pieces), - write_error_spec(ErrorStream, Globals, Spec, !IO) + add_to_be_written_specs([Spec], !MaybeWrittenSpecs) ; WarnNoTransOptDeps = no ) diff --git a/compiler/mode_info.m b/compiler/mode_info.m index ff8f74d97..6e4df8422 100644 --- a/compiler/mode_info.m +++ b/compiler/mode_info.m @@ -1305,7 +1305,7 @@ mode_info_add_error(ModeErrorInfo, !ModeInfo) :- Spec = mode_error_info_to_spec(!.ModeInfo, ModeErrorInfo), globals.set_option(print_error_spec_id, bool(yes), Globals0, Globals), - write_error_spec(DebugStream, Globals, Spec, !IO), + write_error_spec(DebugStream, Globals, Spec, !IO), % debug msg io.flush_output(DebugStream, !IO) ) ). diff --git a/compiler/recompilation.check.m b/compiler/recompilation.check.m index 63a415642..ca5bce2c7 100644 --- a/compiler/recompilation.check.m +++ b/compiler/recompilation.check.m @@ -1710,7 +1710,7 @@ report_used_file_read_error(Globals, ModuleName, UsedFileError, Stream, !IO) :- list.condense(MsgsList, Msgs), Spec = error_spec($pred, Severity, phase_read_files, Msgs) ), - write_error_spec(Stream, Globals, Spec, !IO). + write_error_spec(Stream, Globals, Spec, !IO). % informational only %---------------------% @@ -1791,7 +1791,7 @@ write_recompile_reason(Globals, Stream, ThisModuleName, Reason, !IO) :- phase_read_files, AllPieces), % Since these messages are informational, there should be no warnings % or errors. - write_error_spec(Stream, Globals, Spec, !IO). + write_error_spec(Stream, Globals, Spec, !IO). % informational only :- func describe_item(recomp_item_id) = list(format_piece). diff --git a/compiler/source_file_map.m b/compiler/source_file_map.m index 2995d57d5..09d9dec05 100644 --- a/compiler/source_file_map.m +++ b/compiler/source_file_map.m @@ -23,9 +23,9 @@ :- import_module libs. :- import_module libs.file_util. -:- import_module libs.globals. :- import_module mdbcomp. :- import_module mdbcomp.sym_name. +:- import_module parse_tree.error_spec. :- import_module parse_tree.maybe_error. :- import_module io. @@ -46,12 +46,12 @@ % Part 2: constructing Mercury.modules files. % - % write_source_file_map(ErrorStream, Globals, FileNames, !IO): + % write_source_file_map(FileNames, Specs, !IO): % % Given a list of file names, produce the Mercury.modules file. % -:- pred write_source_file_map(io.text_output_stream::in, - globals::in, list(string)::in, io::di, io::uo) is det. +:- pred write_source_file_map(list(string)::in, list(error_spec)::out, + io::di, io::uo) is det. %---------------------------------------------------------------------------% % @@ -94,7 +94,6 @@ :- implementation. -:- import_module parse_tree.error_spec. :- import_module parse_tree.file_names. :- import_module parse_tree.parse_module. % for peek_at_file :- import_module parse_tree.parse_tree_out_sym_name. @@ -130,18 +129,19 @@ default_module_name_for_file(FileName, DefaultModuleName) :- % Part 2. % -write_source_file_map(ErrorStream, Globals, FileNames, !IO) :- +write_source_file_map(FileNames, Specs, !IO) :- list.foldl4(acc_source_file_map_line, FileNames, - bimap.init, _, cord.init, MapFileLineCord, [], Specs, !IO), + bimap.init, _, cord.init, MapFileLineCord, [], Specs0, !IO), ( - Specs = [], + Specs0 = [], ModulesFileName = modules_file_name, io.open_output(ModulesFileName, ModulesFileResult, !IO), ( ModulesFileResult = ok(ModulesFileStream), MapFileLines = cord.list(MapFileLineCord), io.write_strings(ModulesFileStream, MapFileLines, !IO), - io.close_output(ModulesFileStream, !IO) + io.close_output(ModulesFileStream, !IO), + Specs = [] ; ModulesFileResult = error(Error), ErrorMsg = io.error_message(Error), @@ -151,11 +151,11 @@ write_source_file_map(ErrorStream, Globals, FileNames, !IO) :- words(ErrorMsg), suffix("."), nl], Spec = no_ctxt_spec($pred, severity_error, phase_write_files, Pieces), - write_error_spec(ErrorStream, Globals, Spec, !IO) + Specs = [Spec] ) ; - Specs = [_ | _], - write_error_specs(ErrorStream, Globals, Specs, !IO) + Specs0 = [_ | _], + Specs = Specs0 ). :- pred acc_source_file_map_line(file_name::in, diff --git a/compiler/typecheck.m b/compiler/typecheck.m index a9796679b..be369c77f 100644 --- a/compiler/typecheck.m +++ b/compiler/typecheck.m @@ -226,9 +226,8 @@ typecheck_to_fixpoint(ProgressStream, Iteration, MaxIterations, !ModuleInfo, OrigValidPredIds, [], ProgressSpecs), trace [io(!IO)] ( module_info_get_name(!.ModuleInfo, ModuleName), - get_debug_output_stream(Globals, ModuleName, OutputStream, - !IO), - write_error_specs(OutputStream, Globals, ProgressSpecs, !IO) + get_debug_output_stream(Globals, ModuleName, DebugStream, !IO), + write_error_specs(DebugStream, Globals, ProgressSpecs, !IO) ) ; DebugTypes = no diff --git a/compiler/write_error_spec.m b/compiler/write_error_spec.m index de53ccecb..eb3fc95f7 100644 --- a/compiler/write_error_spec.m +++ b/compiler/write_error_spec.m @@ -2536,7 +2536,7 @@ maybe_print_delayed_error_messages(ErrorStream, Globals, !IO) :- % for the next module. get_wrote_something(WroteSomething, !IO), set_wrote_something(no, !IO), - get_bad_color_schemes(BadColorSchemeSpecs0, !IO), + get_bad_color_schemes(BadColorSchemeSpecs, !IO), set_bad_color_schemes([], !IO), get_some_errors_were_context_limited(Limited, !IO), set_some_errors_were_context_limited(no_errors_were_context_limited, !IO), @@ -2547,7 +2547,6 @@ maybe_print_delayed_error_messages(ErrorStream, Globals, !IO) :- WroteSomething = no ; WroteSomething = yes, - list.sort_and_remove_dups(BadColorSchemeSpecs0, BadColorSchemeSpecs), write_error_specs(ErrorStream, Globals, BadColorSchemeSpecs, !IO) ),