Files
mercury/compiler/mlds_to_cs_util.m
Zoltan Somogyi 10cf2dcf5b Complete the update of mlds_to_cs_*.m.
compiler/mlds_to_cs_file.m:
compiler/mlds_to_cs_func.m:
compiler/mlds_to_cs_stmt.m:
    Switch to using indent.m for indentation.

    Do not generate #line directives, even if their generation is enabled,
    in places where its scope contains nothing derived from the original
    Mercury source file.

    Include as many things as possible in calls to io.format, because
    doing so allows people reading the code can see how those items
    fit together.

compiler/mlds_to_cs_data.m:
    Delete an unneeded ZZZ.

compiler/mlds_to_cs_util.m:
    Delete the indent_line_after_context predicate, after the changes above
    have replaced all calls to it.

compiler/mlds_to_target_util.m:
    Add an indent string argument to maybe_output_pred_proc_id_comment,
    because without it, you can't make the comment line up with the code
    it is commenting on.

compiler/mlds_to_java_func.m:
    Conform to the change in mlds_to_target_util.m, and move the generated
    comment to a more logical place.
2023-05-12 13:15:44 +10:00

152 lines
5.5 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% Copyright (C) 2010-2012 The University of Melbourne.
% Copyright (C) 2013-2018 The Mercury team.
% This file may only be copied under the terms of the GNU General
% Public License - see the file COPYING in the Mercury distribution.
%---------------------------------------------------------------------------%
%
% Utility services required by the other mlds_to_cs_*.m modules.
%
%---------------------------------------------------------------------------%
:- module ml_backend.mlds_to_cs_util.
:- interface.
:- import_module hlds.
:- import_module hlds.hlds_module.
:- import_module ml_backend.mlds.
:- import_module ml_backend.mlds_to_target_util.
:- import_module parse_tree.
:- import_module parse_tree.prog_data.
:- import_module bool.
:- import_module io.
:- import_module list.
:- import_module map.
%---------------------------------------------------------------------------%
% Keep the enum fields together, so they can be packed into one word.
:- type csharp_out_info
---> csharp_out_info(
% These are static.
csoi_module_info :: module_info,
csoi_auto_comments :: bool,
csoi_line_numbers :: bool,
csoi_foreign_line_numbers :: bool,
csoi_module_name :: mlds_module_name,
csoi_source_filename :: string,
csoi_code_addrs :: map(mlds_code_addr, string),
% These are dynamic.
csoi_output_generics :: output_generics,
csoi_break_context :: break_context,
csoi_univ_tvars :: list(tvar)
).
:- func init_csharp_out_info(module_info, string, map(mlds_code_addr, string))
= csharp_out_info.
%---------------------------------------------------------------------------%
:- pred cs_output_context(io.text_output_stream::in, bool::in,
prog_context::in, io::di, io::uo) is det.
:- pred cs_output_default_context(io.text_output_stream::in, bool::in,
io::di, io::uo) is det.
%---------------------------------------------------------------------------%
:- pred maybe_output_inline_comment_for_csharp(csharp_out_info::in,
io.text_output_stream::in, string::in, io::di, io::uo) is det.
%---------------------------------------------------------------------------%
:- pred output_pragma_warning_disable(io.text_output_stream::in,
io::di, io::uo) is det.
:- pred output_pragma_warning_restore(io.text_output_stream::in,
io::di, io::uo) is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module libs.
:- import_module libs.globals.
:- import_module libs.options.
:- import_module mdbcomp.
:- import_module mdbcomp.sym_name.
:- import_module string.
:- import_module term_context.
%---------------------------------------------------------------------------%
init_csharp_out_info(ModuleInfo, SourceFileName, CodeAddrs) = Info :-
module_info_get_globals(ModuleInfo, Globals),
globals.lookup_bool_option(Globals, auto_comments, AutoComments),
globals.lookup_bool_option(Globals, line_numbers, LineNumbers),
globals.lookup_bool_option(Globals, line_numbers_around_foreign_code,
ForeignLineNumbers),
module_info_get_name(ModuleInfo, ModuleName),
MLDS_ModuleName = mercury_module_name_to_mlds(ModuleName),
Info = csharp_out_info(ModuleInfo, AutoComments,
LineNumbers, ForeignLineNumbers, MLDS_ModuleName, SourceFileName,
CodeAddrs, do_not_output_generics, bc_none, []).
%---------------------------------------------------------------------------%
cs_output_context(Stream, OutputLineNumbers, Context, !IO) :-
(
OutputLineNumbers = yes,
( if is_dummy_context(Context) then
true
else
Context = term_context.context(File, Line),
io.format(Stream, "#line %d ""%s""\n", [i(Line), s(File)], !IO)
)
;
OutputLineNumbers = no
).
cs_output_default_context(Stream, OutputLineNumbers, !IO) :-
(
OutputLineNumbers = yes,
io.write_string(Stream, "#line default\n", !IO)
;
OutputLineNumbers = no
).
%---------------------------------------------------------------------------%
maybe_output_inline_comment_for_csharp(Info, Stream, Comment, !IO) :-
AutoComments = Info ^ csoi_auto_comments,
(
AutoComments = yes,
io.format(Stream, "/* %s */ ", [s(Comment)], !IO)
;
AutoComments = no
).
%---------------------------------------------------------------------------%
output_pragma_warning_disable(Stream, !IO) :-
% CS0162: Unreachable code detected.
% CS0168: The variable `foo' is declared but never used.
% CS0169: The private method `foo' is never used.
% CS0219: The variable `foo' is assigned but its value is never used.
% CS1717: Assignment made to same variable.
io.write_string(Stream,
"#pragma warning disable 162, 168, 169, 219, 1717\n", !IO).
output_pragma_warning_restore(Stream, !IO) :-
io.write_string(Stream, "#pragma warning restore\n", !IO).
%---------------------------------------------------------------------------%
:- end_module ml_backend.mlds_to_cs_util.
%---------------------------------------------------------------------------%