Files
mercury/tests/hard_coded/parent2.child.m
Fergus Henderson 3c0063fac0 Add support for the use of partial module qualifiers,
Estimated hours taken: 8

Add support for the use of partial module qualifiers,
e.g. using `child:foo' to refer to `parent🧒foo'.
Previously we only allowed names to be fully-qualified
or completely unqualified.

Note that we still don't yet keep track of which modules are visible,
so this change does not properly handle the distinction between
`import_module' and `use_module' declarations for parent modules.
It basically assumes that `child:foo' is allowed iff plain `foo'
would be allowed (i.e. iff `parent:child' has been imported)
whereas it ought to be allowed iff `parent' has been imported.

compiler/modules.m:
	Add get_partial_qualifiers/2, for use by make_hlds.m
	and hlds_module.m.

compiler/make_hlds.m:
	Insert partially-qualified symbols into the cons_table.

compiler/hlds_module.m:
	Insert partially-qualified symbols into the pred_table.

compiler/module_qual.m:
	When searching the symbol tables used for types, insts, modes,
	and typeclasses, search for partially-qualified symbols.

compiler/modecheck_unify.m:
	When module-qualifying cons_ids, make sure that we fully module
	qualify them even if they're already partially qualified.

tests/hard_coded/parent.m:
tests/hard_coded/parent.child.m:
tests/hard_coded/parent.child2.m:
tests/hard_coded/parent.exp:
tests/hard_coded/parent2.m:
tests/hard_coded/parent2.child.m:
tests/hard_coded/parent2.exp:
	Uncomment the previously-failed test of using partially-qualified
	symbol names.  Add a new child module, `parent.child2', and import it
	using `use_module', so that we test `use_module' as well as
	`import_module'.  Add code to test importing of types and
	constructors.
1998-03-04 19:48:04 +00:00

43 lines
956 B
Mathematica

% Some test cases to test nested modules.
:- module parent2:child.
:- interface.
% module `io' is imported in parent2
:- type t1 == foo.
:- type t2 == parent2:foo.
:- pred main(io__state::di, io__state::uo) is det.
:- implementation.
:- import_module std_util.
:- type t3 == foo.
:- type t4 == parent2:foo.
:- func has_type_t1 = t1.
:- func has_type_t2 = t2.
:- func has_type_t3 = t3.
:- func has_type_t4 = t4.
has_type_t1 = bar.
has_type_t2 = parent2:bar.
has_type_t3 = baz(42).
has_type_t4 = parent2:baz(42).
main -->
parent2:hello,
hello,
print("t1 = "), print(type_of(has_type_t1)), nl,
print("t2 = "), print(type_of(has_type_t2)), nl,
print("t3 = "), print(type_of(has_type_t3)), nl,
print("t4 = "), print(type_of(has_type_t4)), nl,
print("has_type_t1 = "), print(has_type_t1), nl,
print("has_type_t2 = "), print(has_type_t2), nl,
print("has_type_t3 = "), print(has_type_t3), nl,
print("has_type_t4 = "), print(has_type_t4), nl.