[GHC] #9375: Support for module thinning/renaming on command line
GHC
ghc-devs at haskell.org
Mon Jul 28 15:34:28 UTC 2014
#9375: Support for module thinning/renaming on command line
-------------------------------------+-------------------------------------
Reporter: ezyang | Owner: ezyang
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Package system | Version: 7.8.2
Keywords: backpack | Operating System:
Architecture: Unknown/Multiple | Unknown/Multiple
Difficulty: Unknown | Type of failure:
Blocked By: | None/Unknown
Related Tickets: | Test Case:
| Blocking:
| Differential Revisions:
-------------------------------------+-------------------------------------
In #8407, we added the capability for packages to reexport modules from
other packages. This ticket is for the dual operation: during the
compilation of a module, rather than being forced dump all of the exposed
modules of package foo when I say `-package foo`, I should be able to
selectively pick which modules I make visible (thinning) and rename them,
if I like. For now, the proposed syntax is for all package flags, I can
now write `-package "foo (A as B, C)"`.
This feature has special implications for how the package database
hiding/showing works. Currently, if I write `-package foo-0.1`, this will
automatically go ahead and un-expose any other packages named `foo` that I
may have loaded. But if I write `-package foo-0.1 (Foo as Foo1) -package
foo-0.2 (Foo as Foo2)`, I probably didn't actually want to hide the old
instance of `foo-0.1` when I exposed `foo-0.2`. More generally, rather
than thinking of package configuration as flipping exposed/not-exposed
bits on and off of an in-memory package database, we would rather think of
it as setting up a mapping of module names to their implementations, and
only reporting a conflict when there is an inconsistent module mapping.
Since this is a change of behavior, I propose two sets of semantics,
controlled by a flag `-backpack` (but really, I mostly care about the
second set). Flag naming can be negotiated.
In the **absence** of `-backpack`, thinning/renaming works by modifying
the exposed/reexported module fields of the matched packages in the
database. However, the old hiding behavior still applies, so this
functionality would primarily be useful if two separate packages exported
a module with the same name, and you still wanted to use both of them.
So, the original example would not do what you want, but `-package mtl
(Control.Monad.Trans as MtlTrans) -package transformers
(Control.Monad.Trans as TransformersTrans)` would DTRT.
**With** the `-backpack` flag, no auto-hiding of packages occurs (this
affects flags with thinning and renaming). Furthermore, the package
database is cleared, as would be done with `-hide-all-packages`. We
replace the old resolution algorithm with the new one, which processes
each flag one-by-one while building a module mapping, picking a package
which is consistent with the currently selected set of packages. This
consistency is done by looking at the current module mapping and ensuring
all of the modules the package would bring into scope are consistent with
the modules we have already. Both example shown before would work;
furthermore, `-package foo -package foo` would also continue to work,
since `foo`'s exports are consistent with itself. However, `-package
foo-0.1 -package foo-0.2` would be rejected (whereas now it is accepted.)
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9375>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list