Fix #16030 by refactoring IfaceSyn's treatment of GADT constructors
authorRyan Scott <ryan.gl.scott@gmail.com>
Wed, 19 Dec 2018 18:17:58 +0000 (19:17 +0100)
committerKrzysztof Gogolewski <krz.gogolewski@gmail.com>
Wed, 19 Dec 2018 19:57:06 +0000 (20:57 +0100)
commit9d9e35574a92773d872efd58a67339a9e054a9f1
treef5446c48c7096bdb88561670b3175dd03fd65a18
parentd555d4beb457f485aa122d118903f6f926f054f8
Fix #16030 by refactoring IfaceSyn's treatment of GADT constructors

Summary:
GHCi's `:info` command was pretty-printined GADT
constructors suboptimally in the following ways:

1. Sometimes, fields were parenthesized when they did not need it,
   e.g.,

```lang=haskell
data Foo a where
  MkFoo :: (Maybe a) -> Foo a
```

   I fixed this by refactoring some code in `pprIfaceConDecl` to be a
   little smarter with respect to GADT syntax. See `pprFieldArgTy`
   and `pprArgTy`.
2. With `-fprint-explicit-kinds` enabled, there would be times when
   specified arguments would be printed without a leading `@` in GADT
   return types, e.g.,

```lang=haskell
data Bar @k (a :: k) where
  MkBar :: Bar k a
```

   It turns out that `ppr_tc_app`, the function which pretty-prints
   these return types, was not using the proper machinery to print
   out the arguments, which caused the visibilities to be forgotten
   entirely. I refactored `ppr_tc_app` to do this correctly.

Test Plan: make test TEST=T16030

Reviewers: goldfire, bgamari, simonpj

Reviewed By: simonpj

Subscribers: simonpj, rwbarton, carter

GHC Trac Issues: #16030

Differential Revision: https://phabricator.haskell.org/D5440
compiler/iface/IfaceSyn.hs
compiler/iface/IfaceType.hs
testsuite/tests/ghci/scripts/T16030.hs [new file with mode: 0644]
testsuite/tests/ghci/scripts/T16030.script [new file with mode: 0644]
testsuite/tests/ghci/scripts/T16030.stdout [new file with mode: 0644]
testsuite/tests/ghci/scripts/all.T