Use IfaceAppArgs to store an IfaceAppTy's arguments
authorRyan Scott <ryan.gl.scott@gmail.com>
Wed, 11 Jul 2018 16:28:38 +0000 (12:28 -0400)
committerRyan Scott <ryan.gl.scott@gmail.com>
Wed, 11 Jul 2018 16:28:38 +0000 (12:28 -0400)
commit1c3536239cb5e83ff1427ac410d8fa2549e7d9c0
tree585787904cb8ce8b1b755ca85fb11eeec206fe6c
parente24da5edb4709bdb050c8d0676f302d0b87b8446
Use IfaceAppArgs to store an IfaceAppTy's arguments

Summary:
Currently, an `IfaceAppTy` has no way to tell whether its
argument is visible or not, so it simply treats all arguments as
visible, leading to #15330. We already have a solution for this
problem in the form of the `IfaceTcArgs` data structure, used by
`IfaceTyConApp` to represent the arguments to a type constructor.
Therefore, it makes sense to reuse this machinery for `IfaceAppTy`,
so this patch does just that.

This patch:

1. Renames `IfaceTcArgs` to `IfaceAppArgs` to reflect its more
   general purpose.
2. Changes the second field of `IfaceAppTy` from `IfaceType` to
   `IfaceAppArgs`, and propagates the necessary changes through. In
   particular, pretty-printing an `IfaceAppTy` now goes through the
   `IfaceAppArgs` pretty-printer, which correctly displays arguments
   as visible or not for free, fixing #15330.
3. Changes `toIfaceTypeX` and related functions so that when
   converting an `AppTy` to an `IfaceAppTy`, it flattens as many
   argument `AppTy`s as possible, and then converts those arguments
   into an `IfaceAppArgs` list, using the kind of the function
   `Type` as a guide. (Doing so minimizes the number of times we need
   to call `typeKind`, which is more expensive that finding the kind
   of a `TyCon`.)

Test Plan: make test TEST=T15330

Reviewers: goldfire, simonpj, bgamari

Reviewed By: simonpj

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15330

Differential Revision: https://phabricator.haskell.org/D4938
14 files changed:
compiler/backpack/RnModIface.hs
compiler/iface/IfaceSyn.hs
compiler/iface/IfaceType.hs
compiler/iface/IfaceType.hs-boot
compiler/iface/TcIface.hs
compiler/iface/ToIface.hs
compiler/iface/ToIface.hs-boot
compiler/types/TyCoRep.hs
testsuite/tests/indexed-types/should_fail/T14369.stderr
testsuite/tests/partial-sigs/should_fail/T14040a.stderr
testsuite/tests/typecheck/should_fail/T14350.stderr
testsuite/tests/typecheck/should_fail/T15330.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_fail/T15330.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_fail/all.T