Print explicit foralls in type family eqns when appropriate
authorRyan Scott <ryan.gl.scott@gmail.com>
Mon, 26 Nov 2018 17:59:09 +0000 (12:59 -0500)
committerRyan Scott <ryan.gl.scott@gmail.com>
Mon, 26 Nov 2018 17:59:11 +0000 (12:59 -0500)
commitf932b1aa42f45625658c8abaf862cc570507c5ca
tree0755ee1ce530f0afee8a6b5ec44f22e53eee3cc5
parentdf570d920fa66db631f936fa377e598fe92bd2a1
Print explicit foralls in type family eqns when appropriate

Summary:
When `-fprint-explicit-foralls` is enabled, type family
equations are either printed without an explict `forall` entirely,
or with a bizarre square bracket syntax (in the case of closed type
families). I find neither satisfying, so in this patch, I introduce
support for printing explicit `forall`s in open type-family, closed
type-family, and data-family equations when appropriate. (By "when
appropriate", I refer to the conditions laid out in
`Note [When to print foralls]` in `IfaceType`.)

One tricky point in the implementation is that I had to pick a
visibility for each type variable in a `CoAxiom`/`FamInst` in order
to be able to pass it to `pprUserIfaceForAll` //et al.// Because
the type variables in a type family instance equation can't be
instantiated by the programmer anyway, the choice only really matters
for pretty-printing purposes, so I simply went with good ol'
trustworthy `Specified`. (This design choice is documented in
`Note [Printing foralls in type family instances]` in `IfaceType`.)

Test Plan: make test TEST=T15827

Reviewers: goldfire, bgamari, simonpj

Reviewed By: simonpj

Subscribers: simonpj, rwbarton, carter

GHC Trac Issues: #15827

Differential Revision: https://phabricator.haskell.org/D5282
13 files changed:
compiler/iface/IfaceSyn.hs
compiler/iface/IfaceType.hs
compiler/main/PprTyThing.hs
testsuite/tests/ghci/scripts/T13420.stdout
testsuite/tests/ghci/scripts/T15341.stdout
testsuite/tests/ghci/scripts/T15827.hs [new file with mode: 0644]
testsuite/tests/ghci/scripts/T15827.script [new file with mode: 0644]
testsuite/tests/ghci/scripts/T15827.stdout [new file with mode: 0644]
testsuite/tests/ghci/scripts/T4175.stdout
testsuite/tests/ghci/scripts/T7939.stdout
testsuite/tests/ghci/scripts/T8674.stdout
testsuite/tests/ghci/scripts/T9181.stdout
testsuite/tests/ghci/scripts/all.T