diff options
author | Ryan Scott <ryan.gl.scott@gmail.com> | 2018-07-11 12:28:38 -0400 |
---|---|---|
committer | Ryan Scott <ryan.gl.scott@gmail.com> | 2018-07-11 12:28:38 -0400 |
commit | 1c3536239cb5e83ff1427ac410d8fa2549e7d9c0 (patch) | |
tree | 585787904cb8ce8b1b755ca85fb11eeec206fe6c /compiler/backpack | |
parent | e24da5edb4709bdb050c8d0676f302d0b87b8446 (diff) | |
download | haskell-1c3536239cb5e83ff1427ac410d8fa2549e7d9c0.tar.gz |
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
Diffstat (limited to 'compiler/backpack')
-rw-r--r-- | compiler/backpack/RnModIface.hs | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/compiler/backpack/RnModIface.hs b/compiler/backpack/RnModIface.hs index 6b958df760..51f312f975 100644 --- a/compiler/backpack/RnModIface.hs +++ b/compiler/backpack/RnModIface.hs @@ -512,7 +512,7 @@ rnIfaceTyConParent :: Rename IfaceTyConParent rnIfaceTyConParent (IfDataInstance n tc args) = IfDataInstance <$> rnIfaceGlobal n <*> rnIfaceTyCon tc - <*> rnIfaceTcArgs args + <*> rnIfaceAppArgs args rnIfaceTyConParent IfNoParent = pure IfNoParent rnIfaceConDecls :: Rename IfaceConDecls @@ -557,7 +557,7 @@ rnMaybeDefMethSpec mb = return mb rnIfaceAxBranch :: Rename IfaceAxBranch rnIfaceAxBranch d = do ty_vars <- mapM rnIfaceTvBndr (ifaxbTyVars d) - lhs <- rnIfaceTcArgs (ifaxbLHS d) + lhs <- rnIfaceAppArgs (ifaxbLHS d) rhs <- rnIfaceType (ifaxbRHS d) return d { ifaxbTyVars = ty_vars , ifaxbLHS = lhs @@ -693,16 +693,16 @@ rnIfaceType :: Rename IfaceType rnIfaceType (IfaceFreeTyVar n) = pure (IfaceFreeTyVar n) rnIfaceType (IfaceTyVar n) = pure (IfaceTyVar n) rnIfaceType (IfaceAppTy t1 t2) - = IfaceAppTy <$> rnIfaceType t1 <*> rnIfaceType t2 + = IfaceAppTy <$> rnIfaceType t1 <*> rnIfaceAppArgs t2 rnIfaceType (IfaceLitTy l) = return (IfaceLitTy l) rnIfaceType (IfaceFunTy t1 t2) = IfaceFunTy <$> rnIfaceType t1 <*> rnIfaceType t2 rnIfaceType (IfaceDFunTy t1 t2) = IfaceDFunTy <$> rnIfaceType t1 <*> rnIfaceType t2 rnIfaceType (IfaceTupleTy s i tks) - = IfaceTupleTy s i <$> rnIfaceTcArgs tks + = IfaceTupleTy s i <$> rnIfaceAppArgs tks rnIfaceType (IfaceTyConApp tc tks) - = IfaceTyConApp <$> rnIfaceTyCon tc <*> rnIfaceTcArgs tks + = IfaceTyConApp <$> rnIfaceTyCon tc <*> rnIfaceAppArgs tks rnIfaceType (IfaceForAllTy tv t) = IfaceForAllTy <$> rnIfaceForAllBndr tv <*> rnIfaceType t rnIfaceType (IfaceCoercionTy co) @@ -713,7 +713,7 @@ rnIfaceType (IfaceCastTy ty co) rnIfaceForAllBndr :: Rename IfaceForAllBndr rnIfaceForAllBndr (TvBndr tv vis) = TvBndr <$> rnIfaceTvBndr tv <*> pure vis -rnIfaceTcArgs :: Rename IfaceTcArgs -rnIfaceTcArgs (ITC_Invis t ts) = ITC_Invis <$> rnIfaceType t <*> rnIfaceTcArgs ts -rnIfaceTcArgs (ITC_Vis t ts) = ITC_Vis <$> rnIfaceType t <*> rnIfaceTcArgs ts -rnIfaceTcArgs ITC_Nil = pure ITC_Nil +rnIfaceAppArgs :: Rename IfaceAppArgs +rnIfaceAppArgs (IA_Invis t ts) = IA_Invis <$> rnIfaceType t <*> rnIfaceAppArgs ts +rnIfaceAppArgs (IA_Vis t ts) = IA_Vis <$> rnIfaceType t <*> rnIfaceAppArgs ts +rnIfaceAppArgs IA_Nil = pure IA_Nil |