Support for using only partial pieces of included signatures.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Tue, 27 Dec 2016 02:39:01 +0000 (18:39 -0800)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Wed, 11 Jan 2017 14:53:52 +0000 (06:53 -0800)
commit5f9c6d2a91ac710e7b75cfe50a7a8e84cc9ae796
tree6127e630abd03e8f4106cb19b197976afcaa7f11
parent436aa7aaf1b30f19ece6c610e357cb678612de8a
Support for using only partial pieces of included signatures.

Summary:
Generally speaking, it's not possible to "hide" a requirement from a
package you include, because if there is some module relying on that
requirement, well, you can't just wish it out of existence.

However, some packages don't have any modules.  For these, we can
validly thin out requirements; indeed, this is very convenient if
someone has published a large signature package but you only want
some of the definitions.

This patchset tweaks the interpretation of export lists in
signatures: in particular, they no longer need to refer to
entities that are defined locally; they range over both the current
signature as well as any signatures that were inherited from
signature packages (defined by having zero exposed modules.)

In the process of doing this, I cleaned up a number of other
things:

* rnModIface and rnModExports now report errors that occurred
  during renaming and can propagate these to the TcM monad.
  This is important because in the current semantics, you can
  thin out a type which is referenced by a value you keep;
  in this situation, we need to error (to ensure that all
  types in signatures are rooted, so that we can determine
  their identities).

* I ended up introducing a new construct 'dependency signature;
  to bkp files, to make it easier to tell if we were depending
  on a signature package.  It's not difficult for Cabal to
  figure this out (I already have a patch for it.)

Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
Test Plan: validate

Reviewers: simonpj, austin, bgamari

Subscribers: thomie, mpickering

Differential Revision: https://phabricator.haskell.org/D2904

GHC Trac Issues: #12994
45 files changed:
compiler/backpack/BkpSyn.hs
compiler/backpack/DriverBkp.hs
compiler/backpack/NameShape.hs
compiler/backpack/RnModIface.hs
compiler/iface/LoadIface.hs
compiler/main/HeaderInfo.hs
compiler/main/HscMain.hs
compiler/parser/Parser.y
compiler/typecheck/TcBackpack.hs
compiler/typecheck/TcRnExports.hs
testsuite/tests/backpack/reexport/bkpreex01.bkp
testsuite/tests/backpack/reexport/bkpreex02.bkp
testsuite/tests/backpack/reexport/bkpreex03.bkp
testsuite/tests/backpack/reexport/bkpreex04.bkp
testsuite/tests/backpack/reexport/bkpreex06.bkp
testsuite/tests/backpack/should_compile/all.T
testsuite/tests/backpack/should_compile/bkp15.bkp
testsuite/tests/backpack/should_compile/bkp15.stderr
testsuite/tests/backpack/should_compile/bkp25.bkp
testsuite/tests/backpack/should_compile/bkp28.bkp
testsuite/tests/backpack/should_compile/bkp43.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_compile/bkp43.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_compile/bkp44.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_compile/bkp44.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/all.T
testsuite/tests/backpack/should_fail/bkpfail03.bkp
testsuite/tests/backpack/should_fail/bkpfail05.bkp
testsuite/tests/backpack/should_fail/bkpfail19.bkp
testsuite/tests/backpack/should_fail/bkpfail20.bkp
testsuite/tests/backpack/should_fail/bkpfail21.bkp
testsuite/tests/backpack/should_fail/bkpfail29.stderr
testsuite/tests/backpack/should_fail/bkpfail30.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail30.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail31.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail31.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail32.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail32.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail33.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail33.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail34.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail34.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail35.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail35.stderr [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail36.bkp [new file with mode: 0644]
testsuite/tests/backpack/should_fail/bkpfail36.stderr [new file with mode: 0644]