Files
mercury/compiler/make_hlds_separate_items.m
Zoltan Somogyi c643291d1f Add cons_list and snoc_list to cord.m.
library/cord.m:
    Add those two new predicates.

NEWS.md:
    Announce the additions.

compiler/*.m:
    Use snoc_list in many places.

tests/hard_coded/test_cord_2.{m,exp}:
    Extend this test case to test cons_list.
2025-10-10 18:48:26 +11:00

1155 lines
53 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% Copyright (C) 2015-2025 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.
%---------------------------------------------------------------------------%
%
% This module separates the different kinds of items in an augmented
% compilation unit.
%
%---------------------------------------------------------------------------%
:- module hlds.make_hlds.make_hlds_separate_items.
:- interface.
:- import_module hlds.make_hlds.make_hlds_types.
:- import_module hlds.status.
:- import_module parse_tree.
:- import_module parse_tree.prog_data.
:- import_module parse_tree.prog_item.
:- import_module parse_tree.prog_parse_tree.
:- import_module list.
:- import_module set.
%---------------------------------------------------------------------------%
:- type ims_tuple_list(T) == list(ims_tuple_item(T)).
:- type ims_tuple_item(T) == {item_mercury_status, T}.
% The augmented compilation unit consists of the parse tree of
% a source module, the parse trees of interface files, and the
% parse trees of optimization files. For most of these kinds of item,
% return all the items of that kind in these parse trees in a
% two level list. The top level list, which is usually a sec_list
% or an ims_list, is a plain list, whose elements are sec_sub_lists
% and ims_sub_lists respectively. Each of these sublists contains
% a list of the items of the given kind in one section of a parse tree,
% wrapped up together with either a sec_info or an item_mercury_status,
% both of which specify properties of the given section of the
% given parse tree. The properties say e.g. whether the section is
% in the current module, whether its contents are imported or exported,
% whether references elsewhere in the code to the entities it defines
% must be module qualified or not.
%
% XXX CLEANUP We should return several kinds of items as maps,
% not as lists. Specifically,
%
% - we should return type definitions as a type_ctor_checked_map,
% or at least as a type_ctor_defn_map, in both cases with additional
% section information in the values;
% - we should return inst definitions as an inst_ctor_defn_map
% extended with status information;
% - we should return mode definitions as a mode_ctor_defn_map
% extended with status information;
% - we should return type representation info as a map from type_ctor
% to item_type_repn_info.
%
% Several of the parse trees kinds that we process here already have
% this information in the map form. We flatten these maps to lists
% only to minimize the complexity of the diff that radically rewrites
% this module and the associated code.
%
:- pred separate_items_in_aug_comp_unit(aug_compilation_unit::in,
include_module_map::out,
ims_list(item_avail)::out,
list(item_fim)::out,
sec_list(item_type_defn_info)::out,
sec_list(item_type_defn_info)::out,
sec_list(item_type_defn_info)::out,
ims_list(item_inst_defn_info)::out,
ims_list(item_mode_defn_info)::out,
sec_list(item_pred_decl_info)::out,
ims_list(item_mode_decl_info)::out,
ims_list(item_promise_info)::out,
sec_list(item_typeclass_info)::out,
ims_list(item_instance_info)::out,
ims_list(item_initialise_info)::out,
ims_list(item_finalise_info)::out,
sec_list(item_mutable_info)::out,
type_ctor_repn_map::out,
ims_tuple_list(item_foreign_enum_info)::out,
list(item_foreign_export_enum_info)::out,
ims_list(item_decl_pragma_info)::out,
ims_list(item_decl_marker_info)::out,
list(decl_pragma_type_spec_constr_info)::out,
list(decl_pragma_type_spec_info)::out,
list(decl_pragma_termination_info)::out,
list(decl_pragma_termination2_info)::out,
list(decl_pragma_struct_sharing_info)::out,
list(decl_pragma_struct_reuse_info)::out,
ims_list(item_impl_pragma_info)::out,
ims_list(item_impl_marker_info)::out,
list(gen_pragma_unused_args_info)::out,
list(gen_pragma_exceptions_info)::out,
list(gen_pragma_trailing_info)::out,
list(gen_pragma_mm_tabling_info)::out,
ims_list(item_clause_info)::out,
ims_list(item_foreign_proc_info)::out,
set(pred_pf_name_arity)::out) is det.
%---------------------------------------------------------------------------%
:- implementation.
:- import_module mdbcomp.
:- import_module mdbcomp.sym_name.
:- import_module parse_tree.convert_import_use.
:- import_module parse_tree.file_kind. % XXX Undesirable dependency.
:- import_module parse_tree.item_util.
:- import_module assoc_list.
:- import_module cord.
:- import_module int.
:- import_module map.
:- import_module pair.
:- import_module require.
%---------------------------------------------------------------------------%
:- type int_type_ctor_repns
---> int_type_ctor_repns(int_file_kind, type_ctor_repn_map).
:- type module_int_type_ctor_repns ==
assoc_list(module_name, int_type_ctor_repns).
:- type ims_tuple_cord(T) == cord(ims_tuple_item(T)).
:- type item_accumulator
---> item_accumulator(
ia_avails :: ims_cord(item_avail),
ia_fims :: cord(item_fim),
ia_type_defns_abs :: sec_cord(item_type_defn_info),
ia_type_defns_mer :: sec_cord(item_type_defn_info),
ia_type_defns_for :: sec_cord(item_type_defn_info),
ia_inst_defns :: ims_cord(item_inst_defn_info),
ia_mode_defns :: ims_cord(item_mode_defn_info),
ia_typeclasses :: sec_cord(item_typeclass_info),
ia_instances :: ims_cord(item_instance_info),
ia_pred_decls :: sec_cord(item_pred_decl_info),
ia_mode_decls :: ims_cord(item_mode_decl_info),
ia_clauses :: ims_cord(item_clause_info),
ia_foreign_procs :: ims_cord(item_foreign_proc_info),
ia_foreign_enums :: ims_tuple_cord(item_foreign_enum_info),
ia_fees :: cord(item_foreign_export_enum_info),
ia_decl_pragmas :: ims_cord(item_decl_pragma_info),
ia_decl_marker :: ims_cord(item_decl_marker_info),
ia_decl_type_spec_constr
:: cord(decl_pragma_type_spec_constr_info),
ia_decl_type_spec :: cord(decl_pragma_type_spec_info),
ia_decl_term :: cord(decl_pragma_termination_info),
ia_decl_term2 :: cord(decl_pragma_termination2_info),
ia_decl_str_sharing :: cord(decl_pragma_struct_sharing_info),
ia_decl_str_reuse :: cord(decl_pragma_struct_reuse_info),
ia_impl_pragmas :: ims_cord(item_impl_pragma_info),
ia_impl_marker :: ims_cord(item_impl_marker_info),
ia_gen_unused_args :: cord(gen_pragma_unused_args_info),
ia_gen_exceptions :: cord(gen_pragma_exceptions_info),
ia_gen_trailing :: cord(gen_pragma_trailing_info),
ia_gen_mm_tabling :: cord(gen_pragma_mm_tabling_info),
ia_promises :: ims_cord(item_promise_info),
ia_initialises :: ims_cord(item_initialise_info),
ia_finalises :: ims_cord(item_finalise_info),
ia_mutables :: sec_cord(item_mutable_info),
ia_type_repns :: module_int_type_ctor_repns
).
separate_items_in_aug_comp_unit(AugCompUnit, InclMap, Avails, FIMs,
TypeDefnsAbstract, TypeDefnsMercury, TypeDefnsForeign,
InstDefns, ModeDefns, PredDecls, ModeDecls,
Promises, TypeClasses, Instances,
Initialises, Finalises, Mutables,
TypeRepnMap, ForeignEnums, ForeignExportEnums,
DeclPragmas, DeclMarkers,
DeclPragmasTypeSpecConstr, DeclPragmasTypeSpec,
DeclPragmasTermInfo, DeclPragmasTerm2Info,
DeclPragmasSharing, DeclPragmasReuse,
ImplPragmas, ImplMarkers, GenPragmasUnusedArgs, GenPragmasExceptions,
GenPragmasTrailing, GenPragmasMMTabling,
Clauses, ForeignProcs, IntBadPreds) :-
AugCompUnit = aug_compilation_unit(ParseTreeModuleSrc,
AncestorIntSpecs, DirectInt1Specs, IndirectInt2Specs,
PlainOpts, TransOpts, IntForOptSpecs, TypeRepnSpecs,
_ModuleVersionNumbers),
% We start with an empty cord for each kind of item.
% Then for each file we have read in, we append to this cord
% all the items of that kind in that file to the list,
% with the items in the interface section preceding the items
% in the implementation section. The final result should be a cord
% of all the items of that kind in the original forward order.
some [!Acc] (
!:Acc = item_accumulator(cord.init, cord.init,
cord.init, cord.init, cord.init,
cord.init, cord.init, cord.init, cord.init,
cord.init, cord.init, cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init,
cord.init, cord.init, cord.init,
cord.init, []),
acc_parse_tree_module_src(ParseTreeModuleSrc, !Acc),
map.foldl_values(acc_ancestor_int_spec, AncestorIntSpecs, !Acc),
map.foldl_values(acc_direct_int1_spec, DirectInt1Specs, !Acc),
map.foldl_values(acc_indirect_int2_spec, IndirectInt2Specs, !Acc),
map.foldl_values(acc_int_for_opt_spec, IntForOptSpecs, !Acc),
% We add the contents of .opt and .trans_opt files last,
% even after int_for_opt files. The reason for this is that
%
% - a module's.opt file may contain items that are duplicates
% of items in that module's .int, .int2 or .int0 file,
% such as pred decls, mode decls, and type definitions
% (which, in the case of solver types, may also indirectly
% represent pred decls), and
%
% - while the code in e.g. add_pred.m that checks for these duplicates
% refrains from generating error messages when the duplicates come
% from a .opt file, it does generate errors when they come from
% a .intN file.
%
% To avoid spurious errors, we therefore arrange for all items
% from .opt files to come after all items from .intN files.
%
% .trans_opt files cannot contain any item that duplicates anything
% in a .intN file, so we *could process them before .intN files,
% but there is no reason to do so.
%
% Likewise, there can be duplicates between .opt and .trans_opt files
% and only things we pay attention to from type_repn_spec files.
map.foldl_values(acc_parse_tree_plain_opt, PlainOpts, !Acc),
map.foldl_values(acc_parse_tree_trans_opt, TransOpts, !Acc),
map.foldl_values(acc_type_repn_spec, TypeRepnSpecs, !Acc),
!.Acc = item_accumulator(AvailsCord, FIMsCord,
TypeDefnsAbstractCord, TypeDefnsMercuryCord, TypeDefnsForeignCord,
InstDefnsCord, ModeDefnsCord, TypeClassesCord, InstancesCord,
PredDeclsCord, ModeDeclsCord, ClausesCord, ForeignProcsCord,
ForeignEnumsCord, ForeignExportEnumsCord,
DeclPragmasCord, DeclMarkersCord,
DeclPragmasTypeSpecConstrCord, DeclPragmasTypeSpecCord,
DeclPragmasTermInfoCord, DeclPragmasTerm2InfoCord,
DeclPragmasSharingCord, DeclPragmasReuseCord,
ImplPragmasCord, ImplMarkersCord,
GenPragmasUnusedArgsCord, GenPragmasExceptionsCord,
GenPragmasTrailingCord, GenPragmasMMTablingCord,
PromisesCord, InitialisesCord, FinalisesCord,
MutablesCord, ModuleIntTypeRepns)
),
Avails = cord.list(AvailsCord),
FIMs = cord.list(FIMsCord),
TypeDefnsAbstract = cord.list(TypeDefnsAbstractCord),
TypeDefnsMercury = cord.list(TypeDefnsMercuryCord),
TypeDefnsForeign = cord.list(TypeDefnsForeignCord),
InstDefns = cord.list(InstDefnsCord),
ModeDefns = cord.list(ModeDefnsCord),
TypeClasses = cord.list(TypeClassesCord),
Instances = cord.list(InstancesCord),
PredDecls = cord.list(PredDeclsCord),
ModeDecls = cord.list(ModeDeclsCord),
Clauses = cord.list(ClausesCord),
ForeignProcs = cord.list(ForeignProcsCord),
ForeignEnums = cord.list(ForeignEnumsCord),
ForeignExportEnums = cord.list(ForeignExportEnumsCord),
DeclPragmas = cord.list(DeclPragmasCord),
DeclMarkers = cord.list(DeclMarkersCord),
DeclPragmasTypeSpecConstr = cord.list(DeclPragmasTypeSpecConstrCord),
DeclPragmasTypeSpec = cord.list(DeclPragmasTypeSpecCord),
DeclPragmasTermInfo = cord.list(DeclPragmasTermInfoCord),
DeclPragmasTerm2Info = cord.list(DeclPragmasTerm2InfoCord),
DeclPragmasSharing = cord.list(DeclPragmasSharingCord),
DeclPragmasReuse = cord.list(DeclPragmasReuseCord),
ImplPragmas = cord.list(ImplPragmasCord),
ImplMarkers = cord.list(ImplMarkersCord),
GenPragmasUnusedArgs = cord.list(GenPragmasUnusedArgsCord),
GenPragmasExceptions = cord.list(GenPragmasExceptionsCord),
GenPragmasTrailing = cord.list(GenPragmasTrailingCord),
GenPragmasMMTabling = cord.list(GenPragmasMMTablingCord),
Promises = cord.list(PromisesCord),
Initialises = cord.list(InitialisesCord),
Finalises = cord.list(FinalisesCord),
Mutables = cord.list(MutablesCord),
list.foldl(acc_int_type_repn_map, ModuleIntTypeRepns,
map.init, ModuleIntTypeRepnMap),
map.foldl_values(acc_type_repn_map, ModuleIntTypeRepnMap,
cord.init, TypeCtorRepnsCord),
map.from_sorted_assoc_list(cord.list(TypeCtorRepnsCord), TypeRepnMap),
InclMap = ParseTreeModuleSrc ^ ptms_include_map,
IntBadPreds = ParseTreeModuleSrc ^ ptms_int_bad_clauses.
:- pred acc_int_type_repn_map(pair(module_name, int_type_ctor_repns)::in,
map(module_name, int_type_ctor_repns)::in,
map(module_name, int_type_ctor_repns)::out) is det.
acc_int_type_repn_map(ModuleName - IntTypeRepns, !ModuleMap) :-
IntTypeRepns = int_type_ctor_repns(IntFileKind, _TypeCtorRepnMap),
( if map.search(!.ModuleMap, ModuleName, OldIntTypeRepns) then
OldIntTypeRepns =
int_type_ctor_repns(OldIntFileKind, _OldTypeCtorRepnMap),
Content = type_repn_content(IntFileKind),
OldContent = type_repn_content(OldIntFileKind),
( if Content > OldContent then
map.det_update(ModuleName, IntTypeRepns, !ModuleMap)
else
true
)
else
map.det_insert(ModuleName, IntTypeRepns, !ModuleMap)
).
% How much type_repn information does each kind of interface file have,
% relatively speaking? A higher number indicates more.
%
% .int0 files contain no type_repns at all. .int files contain a
% type_repn item for every type defined in the module. .int2 and .int3
% files both contain the same information: a type_repn item for only
% (a) the simple types defined in the module (direct dummy, enum and
% notag types) and (b) the non-simple types that have a property
% (such as word alignment) that can useful in the representations
% of other types. To make the choice deterministic, we break the tie
% in favor of .int2 files.
%
:- func type_repn_content(int_file_kind) = int.
type_repn_content(ifk_int0) = 0.
type_repn_content(ifk_int1) = 3.
type_repn_content(ifk_int2) = 2.
type_repn_content(ifk_int3) = 1.
:- pred acc_type_repn_map(int_type_ctor_repns::in,
cord(pair(type_ctor, item_type_repn_info))::in,
cord(pair(type_ctor, item_type_repn_info))::out) is det.
acc_type_repn_map(IntTypeRepns, !Cord) :-
IntTypeRepns = int_type_ctor_repns(_IntFileKind, TypeCtorRepnMap),
map.to_sorted_assoc_list(TypeCtorRepnMap, TypeCtorRepnPairs),
cord.snoc_list(TypeCtorRepnPairs, !Cord).
%---------------------------------------------------------------------------%
:- pred acc_ancestor_int_spec(ancestor_int_spec::in,
item_accumulator::in, item_accumulator::out) is det.
acc_ancestor_int_spec(AncestorIntSpec, !Acc) :-
AncestorIntSpec = ancestor_int0(ParseTreeInt0, ReadWhy0),
acc_parse_tree_int0(ParseTreeInt0, ReadWhy0, !Acc).
:- pred acc_direct_int1_spec(direct_int1_spec::in,
item_accumulator::in, item_accumulator::out) is det.
acc_direct_int1_spec(DirectInt1Spec, !Acc) :-
DirectInt1Spec = direct_int1(ParseTreeInt1, ReadWhy1),
acc_parse_tree_int1(ParseTreeInt1, ReadWhy1, !Acc).
:- pred acc_indirect_int2_spec(indirect_int2_spec::in,
item_accumulator::in, item_accumulator::out) is det.
acc_indirect_int2_spec(IndirectInt2Spec, !Acc) :-
IndirectInt2Spec = indirect_int2(ParseTreeInt2, ReadWhy2),
acc_parse_tree_int2(ParseTreeInt2, ReadWhy2, !Acc).
:- pred acc_int_for_opt_spec(int_for_opt_spec::in,
item_accumulator::in, item_accumulator::out) is det.
acc_int_for_opt_spec(IntForOptSpec, !Acc) :-
(
IntForOptSpec = for_opt_int0(ParseTreeInt0, ReadWhy0),
acc_parse_tree_int0(ParseTreeInt0, ReadWhy0, !Acc)
;
IntForOptSpec = for_opt_int1(ParseTreeInt1, ReadWhy1),
acc_parse_tree_int1(ParseTreeInt1, ReadWhy1, !Acc)
;
IntForOptSpec = for_opt_int2(ParseTreeInt2, ReadWhy2),
acc_parse_tree_int2(ParseTreeInt2, ReadWhy2, !Acc)
).
:- pred acc_type_repn_spec(type_repn_spec::in,
item_accumulator::in, item_accumulator::out) is det.
acc_type_repn_spec(TypeRepnSpec, !Acc) :-
TypeRepnSpec = type_repn_spec_int1(ParseTreeInt1),
ModuleName = ParseTreeInt1 ^ pti1_module_name,
IntTypeRepnMap = ParseTreeInt1 ^ pti1_type_repns,
AccTypeRepns0 = !.Acc ^ ia_type_repns,
AccTypeRepns = [ModuleName - int_type_ctor_repns(ifk_int1, IntTypeRepnMap)
| AccTypeRepns0],
!Acc ^ ia_type_repns := AccTypeRepns.
%---------------------------------------------------------------------------%
:- pred acc_parse_tree_module_src(parse_tree_module_src::in,
item_accumulator::in, item_accumulator::out) is det.
acc_parse_tree_module_src(ParseTreeModuleSrc, !Acc) :-
% XXX CLEANUP *If* we could rely on _MaybeImplicitFIMLangs
% having been filled in by now, which unfortunately we can't,
% we could include the FIMs it corresponds to in AccFIMs,
% which should allow us to delete some code elsewhere in the compiler
% that now has the job of computing the set of FIMs implicitly needed
% by the code of this module.
ParseTreeModuleSrc = parse_tree_module_src(_ModuleName, _ModuleNameContext,
InclMap, ImportUseMap,
IntFIMSpecMap, ImpFIMSpecMap, _IntSelfFIMLangs, _ImpSelfFIMLangs,
TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap,
_TypeSpecs, _InstModeSpecs,
IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls,
IntDeclPragmas, IntDeclMarkers, IntPromises, _IntBadPreds,
SubTypeClasses, SubInstances, SubPredDecls, SubModeDecls,
ImpClauses, ImpForeignProcs, ImpForeignExportEnums,
SubDeclPragmas, SubDeclMarkers, ImpImplPragmas, ImpImplMarkers,
SubPromises, ImpInitialises, ImpFinalises, SubMutables),
IntItemMercuryStatus = item_defined_in_this_module(item_export_anywhere),
ImpItemMercuryStatus = item_defined_in_this_module(item_export_nowhere),
IntSectionInfo = sec_info(IntItemMercuryStatus, may_be_unqualified),
ImpSectionInfo = sec_info(ImpItemMercuryStatus, may_be_unqualified),
( if map.is_empty(InclMap) then
% There are no submodules to export stuff to.
SubItemMercuryStatus = ImpItemMercuryStatus,
SubSectionInfo = ImpSectionInfo
else
SubItemMercuryStatus =
item_defined_in_this_module(item_export_only_submodules),
SubSectionInfo = sec_info(SubItemMercuryStatus, may_be_unqualified)
),
!.Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0),
import_and_or_use_map_to_item_avails(do_not_include_implicit,
ImportUseMap, IntAvails, ImpAvails),
acc_ims_avails(IntItemMercuryStatus, IntAvails, AccAvails0, AccAvails1),
acc_ims_avails(ImpItemMercuryStatus, ImpAvails, AccAvails1, AccAvails),
IntFIMs = list.map(fim_spec_to_item, map.keys(IntFIMSpecMap)),
ImpFIMs = list.map(fim_spec_to_item, map.keys(ImpFIMSpecMap)),
cord.snoc_list(IntFIMs ++ ImpFIMs, AccFIMs0, AccFIMs),
type_ctor_checked_map_get_src_defns(TypeCtorCheckedMap,
IntTypeDefns, SubTypeDefns, SubForeignEnums),
separate_type_defns_abs_mer_for(IntTypeDefns,
[], IntTypeDefnsAbs, [], IntTypeDefnsMer, [], IntTypeDefnsFor),
separate_type_defns_abs_mer_for(SubTypeDefns,
[], SubTypeDefnsAbs, [], SubTypeDefnsMer, [], SubTypeDefnsFor),
acc_sec_list(IntSectionInfo, IntTypeDefnsAbs,
AccTypeDefnsAbs0, AccTypeDefnsAbs1),
acc_sec_list(SubSectionInfo, SubTypeDefnsAbs,
AccTypeDefnsAbs1, AccTypeDefnsAbs),
acc_sec_list(IntSectionInfo, IntTypeDefnsMer,
AccTypeDefnsMer0, AccTypeDefnsMer1),
acc_sec_list(SubSectionInfo, SubTypeDefnsMer,
AccTypeDefnsMer1, AccTypeDefnsMer),
acc_sec_list(IntSectionInfo, IntTypeDefnsFor,
AccTypeDefnsFor0, AccTypeDefnsFor1),
acc_sec_list(SubSectionInfo, SubTypeDefnsFor,
AccTypeDefnsFor1, AccTypeDefnsFor),
inst_ctor_checked_map_get_src_defns(InstCtorCheckedMap,
IntInstDefns, SubInstDefns),
acc_ims_list(IntItemMercuryStatus, IntInstDefns,
AccInstDefns0, AccInstDefns1),
acc_ims_list(SubItemMercuryStatus, SubInstDefns,
AccInstDefns1, AccInstDefns),
mode_ctor_checked_map_get_src_defns(ModeCtorCheckedMap,
IntModeDefns, SubModeDefns),
acc_ims_list(IntItemMercuryStatus, IntModeDefns,
AccModeDefns0, AccModeDefns1),
acc_ims_list(SubItemMercuryStatus, SubModeDefns,
AccModeDefns1, AccModeDefns),
acc_sec_list(IntSectionInfo, IntTypeClasses,
AccTypeClasses0, AccTypeClasses1),
acc_sec_list(SubSectionInfo, SubTypeClasses,
AccTypeClasses1, AccTypeClasses),
acc_ims_list(IntItemMercuryStatus, IntInstances,
AccInstances0, AccInstances1),
acc_ims_list(SubItemMercuryStatus, SubInstances,
AccInstances1, AccInstances),
acc_sec_list(IntSectionInfo, IntPredDecls, AccPredDecls0, AccPredDecls1),
acc_sec_list(SubSectionInfo, SubPredDecls, AccPredDecls1, AccPredDecls),
acc_ims_list(IntItemMercuryStatus, IntModeDecls,
AccModeDecls0, AccModeDecls1),
acc_ims_list(SubItemMercuryStatus, SubModeDecls,
AccModeDecls1, AccModeDecls),
acc_ims_list(ImpItemMercuryStatus, ImpClauses,
AccClauses0, AccClauses),
acc_ims_list(ImpItemMercuryStatus, ImpForeignProcs,
AccForeignProcs0, AccForeignProcs),
acc_ims_tuple_list(SubItemMercuryStatus, SubForeignEnums,
AccForeignEnums0, AccForeignEnums),
AccForeignExportEnums = AccForeignExportEnums0 ++
cord.from_list(ImpForeignExportEnums),
acc_ims_list(IntItemMercuryStatus, IntDeclPragmas,
AccDeclPragmas0, AccDeclPragmas1),
acc_ims_list(IntItemMercuryStatus, IntDeclMarkers,
AccDeclMarkers0, AccDeclMarkers1),
acc_ims_list(SubItemMercuryStatus, SubDeclPragmas,
AccDeclPragmas1, AccDeclPragmas),
acc_ims_list(SubItemMercuryStatus, SubDeclMarkers,
AccDeclMarkers1, AccDeclMarkers),
acc_ims_list(SubItemMercuryStatus, ImpImplPragmas,
AccImplPragmas0, AccImplPragmas),
acc_ims_list(SubItemMercuryStatus, ImpImplMarkers,
AccImplMarkers0, AccImplMarkers),
acc_ims_list(IntItemMercuryStatus, IntPromises,
AccPromises0, AccPromises1),
acc_ims_list(SubItemMercuryStatus, SubPromises,
AccPromises1, AccPromises),
acc_ims_list(ImpItemMercuryStatus, ImpInitialises,
AccInitialises0, AccInitialises),
acc_ims_list(ImpItemMercuryStatus, ImpFinalises,
AccFinalises0, AccFinalises),
acc_sec_list(SubSectionInfo, SubMutables, AccMutables0, AccMutables),
!:Acc = item_accumulator(AccAvails, AccFIMs,
AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor,
AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances,
AccPredDecls, AccModeDecls, AccClauses, AccForeignProcs,
AccForeignEnums, AccForeignExportEnums,
AccDeclPragmas, AccDeclMarkers,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas, AccImplMarkers,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises, AccInitialises, AccFinalises,
AccMutables, AccTypeRepns0).
%---------------------%
:- pred acc_parse_tree_int0(parse_tree_int0::in,
read_why_int0::in, item_accumulator::in, item_accumulator::out) is det.
acc_parse_tree_int0(ParseTreeInt0, ReadWhy0, !Acc) :-
(
ReadWhy0 = rwi0_section,
IntImportLocn = import_locn_ancestor_int0_interface,
ImpImportLocn = import_locn_ancestor_int0_implementation,
IntItemImport = item_import_int_concrete(IntImportLocn),
ImpItemImport = item_import_int_concrete(ImpImportLocn),
IntNeedQual = may_be_unqualified,
ImpNeedQual = may_be_unqualified
;
ReadWhy0 = rwi0_opt,
IntItemImport = item_import_opt_int,
ImpItemImport = item_import_opt_int,
IntNeedQual = must_be_qualified,
ImpNeedQual = must_be_qualified
),
IntItemMercuryStatus = item_defined_in_other_module(IntItemImport),
ImpItemMercuryStatus = item_defined_in_other_module(ImpItemImport),
IntSectionInfo = sec_info(IntItemMercuryStatus, IntNeedQual),
ImpSectionInfo = sec_info(ImpItemMercuryStatus, ImpNeedQual),
ParseTreeInt0 = parse_tree_int0(_ModuleName, _ModuleNameContext,
_MaybeVersionNumbers, _InclMap, ImportUseMap, IntFIMSpecs, ImpFIMSpecs,
TypeCtorCheckedMap, InstCtorCheckedMap, ModeCtorCheckedMap,
IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls,
IntDeclPragmas, IntDeclMarkers, IntPromises,
ImpTypeClasses, ImpInstances, ImpPredDecls, ImpModeDecls,
ImpDeclPragmas, ImpDeclMarkers, ImpPromises),
!.Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0),
section_import_and_or_use_map_to_item_avails(ImportUseMap,
IntAvails, ImpAvails),
acc_ims_avails(IntItemMercuryStatus, IntAvails, AccAvails0, AccAvails1),
acc_ims_avails(ImpItemMercuryStatus, ImpAvails, AccAvails1, AccAvails),
IntFIMs = list.map(fim_spec_to_item, set.to_sorted_list(IntFIMSpecs)),
ImpFIMs = list.map(fim_spec_to_item, set.to_sorted_list(ImpFIMSpecs)),
cord.snoc_list(IntFIMs ++ ImpFIMs, AccFIMs0, AccFIMs),
type_ctor_checked_map_get_src_defns(TypeCtorCheckedMap,
IntTypeDefns, ImpTypeDefns, ImpForeignEnums),
separate_type_defns_abs_mer_for(IntTypeDefns,
[], IntTypeDefnsAbs, [], IntTypeDefnsMer, [], IntTypeDefnsFor),
separate_type_defns_abs_mer_for(ImpTypeDefns,
[], ImpTypeDefnsAbs, [], ImpTypeDefnsMer, [], ImpTypeDefnsFor),
acc_sec_list(IntSectionInfo, IntTypeDefnsAbs,
AccTypeDefnsAbs0, AccTypeDefnsAbs1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsAbs,
AccTypeDefnsAbs1, AccTypeDefnsAbs),
acc_sec_list(IntSectionInfo, IntTypeDefnsMer,
AccTypeDefnsMer0, AccTypeDefnsMer1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsMer,
AccTypeDefnsMer1, AccTypeDefnsMer),
acc_sec_list(IntSectionInfo, IntTypeDefnsFor,
AccTypeDefnsFor0, AccTypeDefnsFor1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsFor,
AccTypeDefnsFor1, AccTypeDefnsFor),
inst_ctor_checked_map_get_src_defns(InstCtorCheckedMap,
IntInstDefns, ImpInstDefns),
acc_ims_list(IntItemMercuryStatus, IntInstDefns,
AccInstDefns0, AccInstDefns1),
acc_ims_list(ImpItemMercuryStatus, ImpInstDefns,
AccInstDefns1, AccInstDefns),
mode_ctor_checked_map_get_src_defns(ModeCtorCheckedMap,
IntModeDefns, ImpModeDefns),
acc_ims_list(IntItemMercuryStatus, IntModeDefns,
AccModeDefns0, AccModeDefns1),
acc_ims_list(ImpItemMercuryStatus, ImpModeDefns,
AccModeDefns1, AccModeDefns),
acc_sec_list(IntSectionInfo, IntTypeClasses,
AccTypeClasses0, AccTypeClasses1),
acc_sec_list(ImpSectionInfo, ImpTypeClasses,
AccTypeClasses1, AccTypeClasses),
acc_ims_list(IntItemMercuryStatus, coerce(IntInstances),
AccInstances0, AccInstances1),
acc_ims_list(ImpItemMercuryStatus, coerce(ImpInstances),
AccInstances1, AccInstances),
acc_sec_list(IntSectionInfo, IntPredDecls, AccPredDecls0, AccPredDecls1),
acc_sec_list(ImpSectionInfo, ImpPredDecls, AccPredDecls1, AccPredDecls),
acc_ims_list(IntItemMercuryStatus, IntModeDecls,
AccModeDecls0, AccModeDecls1),
acc_ims_list(ImpItemMercuryStatus, ImpModeDecls,
AccModeDecls1, AccModeDecls),
acc_ims_tuple_list(ImpItemMercuryStatus, ImpForeignEnums,
AccForeignEnums0, AccForeignEnums),
acc_ims_list(IntItemMercuryStatus, IntDeclPragmas,
AccDeclPragmas0, AccDeclPragmas1),
acc_ims_list(IntItemMercuryStatus, IntDeclMarkers,
AccDeclMarkers0, AccDeclMarkers1),
acc_ims_list(ImpItemMercuryStatus, ImpDeclPragmas,
AccDeclPragmas1, AccDeclPragmas),
acc_ims_list(ImpItemMercuryStatus, ImpDeclMarkers,
AccDeclMarkers1, AccDeclMarkers),
acc_ims_list(IntItemMercuryStatus, IntPromises,
AccPromises0, AccPromises1),
acc_ims_list(ImpItemMercuryStatus, ImpPromises,
AccPromises1, AccPromises),
!:Acc = item_accumulator(AccAvails, AccFIMs,
AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor,
AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances,
AccPredDecls, AccModeDecls, AccClauses0, AccForeignProcs0,
AccForeignEnums, AccForeignExportEnums0,
AccDeclPragmas, AccDeclMarkers,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0).
%---------------------%
:- pred acc_parse_tree_int1(parse_tree_int1::in,
read_why_int1::in, item_accumulator::in, item_accumulator::out) is det.
acc_parse_tree_int1(ParseTreeInt1, ReadWhy1, !Acc) :-
(
(
ReadWhy1 = rwi1_int_import,
IntImportLocn = import_locn_interface,
IntNeedQual = may_be_unqualified
;
ReadWhy1 = rwi1_int_use,
IntImportLocn = import_locn_interface,
IntNeedQual = must_be_qualified
;
ReadWhy1 = rwi1_imp_import,
IntImportLocn = import_locn_implementation,
IntNeedQual = may_be_unqualified
;
ReadWhy1 = rwi1_imp_use,
IntImportLocn = import_locn_implementation,
IntNeedQual = must_be_qualified
;
ReadWhy1 = rwi1_int_use_imp_import,
IntImportLocn = import_locn_interface,
IntNeedQual = may_be_unqualified
% XXX ITEM_LIST Either this should be something like
% must_be_qualified_in_interface, or the job of IntNeedQual should
% be split into, with IntNeedQualInInterface = must_be_qualified,
% and IntNeedQualInImplementation = may_be_unqualified.
;
ReadWhy1 = rwi1_type_repn,
% This ReadWhy1 should occur only in type_repn_specs,
% which are processed separately by acc_type_repn_spec.
unexpected($pred, "rwi1_type_repn")
),
IntItemImport = item_import_int_concrete(IntImportLocn),
ImpItemImport = item_import_int_abstract,
ImpNeedQual = must_be_qualified
;
ReadWhy1 = rwi1_opt,
IntItemImport = item_import_opt_int,
ImpItemImport = item_import_opt_int,
IntNeedQual = must_be_qualified,
ImpNeedQual = must_be_qualified
),
IntItemMercuryStatus = item_defined_in_other_module(IntItemImport),
ImpItemMercuryStatus = item_defined_in_other_module(ImpItemImport),
IntSectionInfo = sec_info(IntItemMercuryStatus, IntNeedQual),
ImpSectionInfo = sec_info(ImpItemMercuryStatus, ImpNeedQual),
ParseTreeInt1 = parse_tree_int1(ModuleName, _ModuleNameContext,
_MaybeVersionNumbers, _InclMap, UseMap, IntFIMSpecs, ImpFIMSpecs,
TypeCheckedMap, InstCheckedMap, ModeCheckedMap,
IntTypeClasses, IntInstances, IntPredDecls, IntModeDecls,
IntDeclPragmas, IntDeclMarkers, IntPromises, IntTypeRepnMap,
ImpTypeClasses),
!.Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0),
section_use_map_to_item_avails(UseMap, IntAvails, ImpAvails),
acc_ims_avails(IntItemMercuryStatus, IntAvails, AccAvails0, AccAvails1),
acc_ims_avails(ImpItemMercuryStatus, ImpAvails, AccAvails1, AccAvails),
IntFIMs = list.map(fim_spec_to_item, set.to_sorted_list(IntFIMSpecs)),
ImpFIMs = list.map(fim_spec_to_item, set.to_sorted_list(ImpFIMSpecs)),
cord.snoc_list(IntFIMs ++ ImpFIMs, AccFIMs0, AccFIMs),
type_ctor_checked_map_get_src_defns(TypeCheckedMap,
IntTypeDefns, ImpTypeDefns, ImpForeignEnums),
separate_type_defns_abs_mer_for(IntTypeDefns,
[], IntTypeDefnsAbs, [], IntTypeDefnsMer, [], IntTypeDefnsFor),
separate_type_defns_abs_mer_for(ImpTypeDefns,
[], ImpTypeDefnsAbs, [], ImpTypeDefnsMer, [], ImpTypeDefnsFor),
acc_sec_list(IntSectionInfo, IntTypeDefnsAbs,
AccTypeDefnsAbs0, AccTypeDefnsAbs1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsAbs,
AccTypeDefnsAbs1, AccTypeDefnsAbs),
acc_sec_list(IntSectionInfo, IntTypeDefnsMer,
AccTypeDefnsMer0, AccTypeDefnsMer1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsMer,
AccTypeDefnsMer1, AccTypeDefnsMer),
acc_sec_list(IntSectionInfo, IntTypeDefnsFor,
AccTypeDefnsFor0, AccTypeDefnsFor1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsFor,
AccTypeDefnsFor1, AccTypeDefnsFor),
inst_ctor_checked_map_get_src_defns(InstCheckedMap,
IntInstDefns, _ImpInstDefns),
acc_ims_list(IntItemMercuryStatus, IntInstDefns,
AccInstDefns0, AccInstDefns),
mode_ctor_checked_map_get_src_defns(ModeCheckedMap,
IntModeDefns, _ImpModeDefns),
acc_ims_list(IntItemMercuryStatus, IntModeDefns,
AccModeDefns0, AccModeDefns),
acc_sec_list(IntSectionInfo, IntTypeClasses,
AccTypeClasses0, AccTypeClasses1),
acc_sec_list(ImpSectionInfo, coerce(ImpTypeClasses),
AccTypeClasses1, AccTypeClasses),
acc_ims_list(IntItemMercuryStatus, coerce(IntInstances),
AccInstances0, AccInstances),
acc_sec_list(IntSectionInfo, IntPredDecls, AccPredDecls0, AccPredDecls),
acc_ims_list(IntItemMercuryStatus, IntModeDecls,
AccModeDecls0, AccModeDecls),
acc_ims_tuple_list(ImpItemMercuryStatus, ImpForeignEnums,
AccForeignEnums0, AccForeignEnums),
acc_ims_list(IntItemMercuryStatus, IntDeclPragmas,
AccDeclPragmas0, AccDeclPragmas),
acc_ims_list(IntItemMercuryStatus, IntDeclMarkers,
AccDeclMarkers0, AccDeclMarkers),
acc_ims_list(IntItemMercuryStatus, IntPromises, AccPromises0, AccPromises),
AccTypeRepns = [ModuleName - int_type_ctor_repns(ifk_int1, IntTypeRepnMap)
| AccTypeRepns0],
!:Acc = item_accumulator(AccAvails, AccFIMs,
AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor,
AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances,
AccPredDecls, AccModeDecls, AccClauses0, AccForeignProcs0,
AccForeignEnums, AccForeignExportEnums0,
AccDeclPragmas, AccDeclMarkers,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns).
%---------------------%
:- pred acc_parse_tree_int2(parse_tree_int2::in,
read_why_int2::in, item_accumulator::in, item_accumulator::out) is det.
acc_parse_tree_int2(ParseTreeInt2, ReadWhy2, !Acc) :-
(
(
ReadWhy2 = rwi2_int_use,
IntImportLocn = import_locn_interface
;
ReadWhy2 = rwi2_imp_use,
IntImportLocn = import_locn_implementation
),
IntItemImport = item_import_int_concrete(IntImportLocn),
ImpItemImport = item_import_int_abstract
;
ReadWhy2 = rwi2_abstract,
IntItemImport = item_import_int_abstract,
ImpItemImport = item_import_int_abstract
;
ReadWhy2 = rwi2_opt,
IntItemImport = item_import_opt_int,
ImpItemImport = item_import_opt_int
),
IntItemMercuryStatus = item_defined_in_other_module(IntItemImport),
ImpItemMercuryStatus = item_defined_in_other_module(ImpItemImport),
IntNeedQual = must_be_qualified,
ImpNeedQual = must_be_qualified,
IntSectionInfo = sec_info(IntItemMercuryStatus, IntNeedQual),
ImpSectionInfo = sec_info(ImpItemMercuryStatus, ImpNeedQual),
ParseTreeInt2 = parse_tree_int2(ModuleName, _ModuleNameContext,
_MaybeVersionNumbers, _InclMap, UseMap, IntFIMSpecs, ImpFIMSpecs,
TypeCheckedMap, InstCheckedMap, ModeCheckedMap,
IntTypeClasses, IntInstances, IntTypeRepnMap),
!.Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0),
section_use_map_to_item_avails(UseMap, IntAvails, ImpAvails),
acc_ims_avails(IntItemMercuryStatus, IntAvails, AccAvails0, AccAvails1),
acc_ims_avails(ImpItemMercuryStatus, ImpAvails, AccAvails1, AccAvails),
IntFIMs = list.map(fim_spec_to_item, set.to_sorted_list(IntFIMSpecs)),
ImpFIMs = list.map(fim_spec_to_item, set.to_sorted_list(ImpFIMSpecs)),
cord.snoc_list(IntFIMs ++ ImpFIMs, AccFIMs0, AccFIMs),
type_ctor_checked_map_get_src_defns(TypeCheckedMap,
IntTypeDefns, ImpTypeDefns, _ImpForeignEnums),
separate_type_defns_abs_mer_for(IntTypeDefns,
[], IntTypeDefnsAbs, [], IntTypeDefnsMer, [], IntTypeDefnsFor),
separate_type_defns_abs_mer_for(ImpTypeDefns,
[], ImpTypeDefnsAbs, [], ImpTypeDefnsMer, [], ImpTypeDefnsFor),
acc_sec_list(IntSectionInfo, IntTypeDefnsAbs,
AccTypeDefnsAbs0, AccTypeDefnsAbs1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsAbs,
AccTypeDefnsAbs1, AccTypeDefnsAbs),
acc_sec_list(IntSectionInfo, IntTypeDefnsMer,
AccTypeDefnsMer0, AccTypeDefnsMer1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsMer,
AccTypeDefnsMer1, AccTypeDefnsMer),
acc_sec_list(IntSectionInfo, IntTypeDefnsFor,
AccTypeDefnsFor0, AccTypeDefnsFor1),
acc_sec_list(ImpSectionInfo, ImpTypeDefnsFor,
AccTypeDefnsFor1, AccTypeDefnsFor),
inst_ctor_checked_map_get_src_defns(InstCheckedMap,
IntInstDefns, _ImpInstDefns),
acc_ims_list(IntItemMercuryStatus, IntInstDefns,
AccInstDefns0, AccInstDefns),
mode_ctor_checked_map_get_src_defns(ModeCheckedMap,
IntModeDefns, _ImpModeDefns),
acc_ims_list(IntItemMercuryStatus, IntModeDefns,
AccModeDefns0, AccModeDefns),
acc_sec_list(IntSectionInfo, IntTypeClasses,
AccTypeClasses0, AccTypeClasses),
acc_ims_list(IntItemMercuryStatus, coerce(IntInstances),
AccInstances0, AccInstances),
AccTypeRepns = [ModuleName - int_type_ctor_repns(ifk_int2, IntTypeRepnMap)
| AccTypeRepns0],
!:Acc = item_accumulator(AccAvails, AccFIMs,
AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor,
AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns).
%---------------------%
:- pred acc_parse_tree_plain_opt(parse_tree_plain_opt::in,
item_accumulator::in, item_accumulator::out) is det.
acc_parse_tree_plain_opt(ParseTreePlainOpt, !Acc) :-
ItemMercuryStatus = item_defined_in_other_module(item_import_opt_int),
SectionInfo = sec_info(ItemMercuryStatus, must_be_qualified),
ParseTreePlainOpt = parse_tree_plain_opt(_ModuleName, _ModuleNameContext,
UseMap, FIMSpecs, TypeDefns, ForeignEnums,
InstDefns, ModeDefns, TypeClasses, Instances,
PredDecls, ModeDecls, Clauses, ForeignProcs, Promises,
DeclMarkers, ImplMarkers, TypeSpecs, UnusedArgs, TermInfos, Term2Infos,
Exceptions, Trailings, MMTablings, Sharings, Reuses),
!.Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0),
OptAvails = use_map_to_item_avails(UseMap),
acc_ims_avails(ItemMercuryStatus, OptAvails, AccAvails0, AccAvails),
OptFIMs = list.map(fim_spec_to_item, set.to_sorted_list(FIMSpecs)),
cord.snoc_list(OptFIMs, AccFIMs0, AccFIMs),
separate_type_defns_abs_mer_for(TypeDefns,
[], TypeDefnsAbs, [], TypeDefnsMer, [], TypeDefnsFor),
acc_sec_list(SectionInfo, TypeDefnsAbs,
AccTypeDefnsAbs0, AccTypeDefnsAbs),
acc_sec_list(SectionInfo, TypeDefnsMer,
AccTypeDefnsMer0, AccTypeDefnsMer),
acc_sec_list(SectionInfo, TypeDefnsFor,
AccTypeDefnsFor0, AccTypeDefnsFor),
acc_ims_list(ItemMercuryStatus, InstDefns, AccInstDefns0, AccInstDefns),
acc_ims_list(ItemMercuryStatus, ModeDefns, AccModeDefns0, AccModeDefns),
acc_sec_list(SectionInfo, TypeClasses, AccTypeClasses0, AccTypeClasses),
acc_ims_list(ItemMercuryStatus, Instances, AccInstances0, AccInstances),
acc_sec_list(SectionInfo, PredDecls, AccPredDecls0, AccPredDecls),
acc_ims_list(ItemMercuryStatus, ModeDecls, AccModeDecls0, AccModeDecls),
acc_ims_list(ItemMercuryStatus, Clauses, AccClauses0, AccClauses),
acc_ims_list(ItemMercuryStatus, ForeignProcs,
AccForeignProcs0, AccForeignProcs),
acc_ims_tuple_list(ItemMercuryStatus, ForeignEnums,
AccForeignEnums0, AccForeignEnums),
acc_ims_list(ItemMercuryStatus, coerce(DeclMarkers),
AccDeclMarkers0, AccDeclMarkers),
AccDeclPragmasTypeSpec = AccDeclPragmasTypeSpec0 ++
cord.from_list(TypeSpecs),
AccDeclPragmasTermInfo = AccDeclPragmasTermInfo0 ++
cord.from_list(TermInfos),
AccDeclPragmasTerm2Info = AccDeclPragmasTerm2Info0 ++
cord.from_list(Term2Infos),
AccDeclPragmasSharing = AccDeclPragmasSharing0 ++
cord.from_list(Sharings),
AccDeclPragmasReuse = AccDeclPragmasReuse0 ++
cord.from_list(Reuses),
acc_ims_list(ItemMercuryStatus, coerce(ImplMarkers),
AccImplMarkers0, AccImplMarkers),
AccGenPragmasUnusedArgs = AccGenPragmasUnusedArgs0 ++
cord.from_list(UnusedArgs),
AccGenPragmasExceptions = AccGenPragmasExceptions0 ++
cord.from_list(Exceptions),
AccGenPragmasTrailing = AccGenPragmasTrailing0 ++
cord.from_list(Trailings),
AccGenPragmasMMTabling = AccGenPragmasMMTabling0 ++
cord.from_list(MMTablings),
acc_ims_list(ItemMercuryStatus, Promises, AccPromises0, AccPromises),
!:Acc = item_accumulator(AccAvails, AccFIMs,
AccTypeDefnsAbs, AccTypeDefnsMer, AccTypeDefnsFor,
AccInstDefns, AccModeDefns, AccTypeClasses, AccInstances,
AccPredDecls, AccModeDecls, AccClauses, AccForeignProcs,
AccForeignEnums, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec,
AccDeclPragmasTermInfo, AccDeclPragmasTerm2Info,
AccDeclPragmasSharing, AccDeclPragmasReuse,
AccImplPragmas0, AccImplMarkers,
AccGenPragmasUnusedArgs, AccGenPragmasExceptions,
AccGenPragmasTrailing, AccGenPragmasMMTabling,
AccPromises, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0).
%---------------------%
:- pred acc_parse_tree_trans_opt(parse_tree_trans_opt::in,
item_accumulator::in, item_accumulator::out) is det.
acc_parse_tree_trans_opt(ParseTreeTransOpt, !Acc) :-
ParseTreeTransOpt = parse_tree_trans_opt(_ModuleName, _ModuleNameContext,
TermInfos, Term2Infos, Exceptions, Trailings, MMTablings,
Sharings, Reuses),
!.Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo0, AccDeclPragmasTerm2Info0,
AccDeclPragmasSharing0, AccDeclPragmasReuse0,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions0,
AccGenPragmasTrailing0, AccGenPragmasMMTabling0,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0),
AccDeclPragmasTermInfo = AccDeclPragmasTermInfo0 ++
cord.from_list(TermInfos),
AccDeclPragmasTerm2Info = AccDeclPragmasTerm2Info0 ++
cord.from_list(Term2Infos),
AccDeclPragmasSharing = AccDeclPragmasSharing0 ++
cord.from_list(Sharings),
AccDeclPragmasReuse = AccDeclPragmasReuse0 ++
cord.from_list(Reuses),
AccGenPragmasExceptions = AccGenPragmasExceptions0 ++
cord.from_list(Exceptions),
AccGenPragmasTrailing = AccGenPragmasTrailing0 ++
cord.from_list(Trailings),
AccGenPragmasMMTabling = AccGenPragmasMMTabling0 ++
cord.from_list(MMTablings),
!:Acc = item_accumulator(AccAvails0, AccFIMs0,
AccTypeDefnsAbs0, AccTypeDefnsMer0, AccTypeDefnsFor0,
AccInstDefns0, AccModeDefns0, AccTypeClasses0, AccInstances0,
AccPredDecls0, AccModeDecls0, AccClauses0, AccForeignProcs0,
AccForeignEnums0, AccForeignExportEnums0,
AccDeclPragmas0, AccDeclMarkers0,
AccDeclPragmasTypeSpecConstr0, AccDeclPragmasTypeSpec0,
AccDeclPragmasTermInfo, AccDeclPragmasTerm2Info,
AccDeclPragmasSharing, AccDeclPragmasReuse,
AccImplPragmas0, AccImplMarkers0,
AccGenPragmasUnusedArgs0, AccGenPragmasExceptions,
AccGenPragmasTrailing, AccGenPragmasMMTabling,
AccPromises0, AccInitialises0, AccFinalises0,
AccMutables0, AccTypeRepns0).
%---------------------------------------------------------------------------%
:- pred acc_ims_avails(item_mercury_status::in, list(item_avail)::in,
ims_cord(item_avail)::in, ims_cord(item_avail)::out) is det.
acc_ims_avails(ItemMercuryStatus, Avails, !AccAvails) :-
(
Avails = []
;
Avails = [_ | _],
ImsSubList = ims_sub_list(ItemMercuryStatus, Avails),
cord.snoc(ImsSubList, !AccAvails)
).
%---------------------------------------------------------------------------%
:- pred separate_type_defns_abs_mer_for(list(item_type_defn_info)::in,
list(item_type_defn_info)::in, list(item_type_defn_info)::out,
list(item_type_defn_info)::in, list(item_type_defn_info)::out,
list(item_type_defn_info)::in, list(item_type_defn_info)::out) is det.
separate_type_defns_abs_mer_for([], !Abs, !Mer, !For).
separate_type_defns_abs_mer_for([Item | Items], !Abs, !Mer, !For) :-
separate_type_defns_abs_mer_for(Items, !Abs, !Mer, !For),
Item = item_type_defn_info(_, _, TypeDefn, _, _, _),
(
TypeDefn = parse_tree_abstract_type(_),
!:Abs = [Item | !.Abs]
;
( TypeDefn = parse_tree_du_type(_)
; TypeDefn = parse_tree_sub_type(_)
; TypeDefn = parse_tree_eqv_type(_)
; TypeDefn = parse_tree_solver_type(_)
),
!:Mer = [Item | !.Mer]
;
TypeDefn = parse_tree_foreign_type(_),
!:For = [Item | !.For]
).
%---------------------------------------------------------------------------%
:- pred acc_sec_list(sec_info::in, list(T)::in,
sec_cord(T)::in, sec_cord(T)::out) is det.
acc_sec_list(SectionInfo, Items, !SecCord) :-
(
Items = []
;
Items = [_ | _],
SecSubList = sec_sub_list(SectionInfo, Items),
cord.snoc(SecSubList, !SecCord)
).
%---------------------%
:- pred acc_ims_list(item_mercury_status::in, list(T)::in,
ims_cord(T)::in, ims_cord(T)::out) is det.
acc_ims_list(ItemMercuryStatus, Items, !ImsCord) :-
(
Items = []
;
Items = [_ | _],
ImsSubList = ims_sub_list(ItemMercuryStatus, Items),
cord.snoc(ImsSubList, !ImsCord)
).
%---------------------%
:- pred acc_ims_tuple_list(item_mercury_status::in, list(T)::in,
ims_tuple_cord(T)::in, ims_tuple_cord(T)::out) is det.
acc_ims_tuple_list(_ItemMercuryStatus, [], !ImsItems).
acc_ims_tuple_list(ItemMercuryStatus, [Item | Items], !ImsItems) :-
cord.snoc({ItemMercuryStatus, Item}, !ImsItems),
acc_ims_tuple_list(ItemMercuryStatus, Items, !ImsItems).
%---------------------------------------------------------------------------%
:- end_module hlds.make_hlds.make_hlds_separate_items.
%---------------------------------------------------------------------------%