diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2018-11-15 09:02:11 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2018-11-15 11:50:52 +0000 |
commit | ae2c9b40f5b6bf272251d1f4107c60003f541b62 (patch) | |
tree | eb786f1cd10c872df876871a44baf7a2ef97abef /compiler/basicTypes/BasicTypes.hs | |
parent | 0ce66be953becf7c9de3cbea406953306b4db3b1 (diff) | |
download | haskell-ae2c9b40f5b6bf272251d1f4107c60003f541b62.tar.gz |
Smarter HsType pretty-print for promoted datacons
Fix Trac #15898, by being smarter about when to print
a space before a promoted data constructor, in a HsType.
I had to implement a mildly tiresome function
HsType.lhsTypeHasLeadingPromotionQuote
It has multiple cases, of course, but it's very simple.
The patch improves the error-message output in a bunch of
cases, and (to my surprise) actually fixes a bug in the
output of T14343 (Trac #14343), thus
- In the expression: _ :: Proxy '('( 'True, 'False), 'False)
+ In the expression: _ :: Proxy '( '( 'True, 'False), 'False)
I discovered that there were two copies of the PromotionFlag
type (a boolean, with helpfully named data cons), one in
IfaceType and one in HsType. So I combined into one,
PromotionFlag, and moved it to BasicTypes. That's why
quite a few files are touched, but it's all routine.
Diffstat (limited to 'compiler/basicTypes/BasicTypes.hs')
-rw-r--r-- | compiler/basicTypes/BasicTypes.hs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/compiler/basicTypes/BasicTypes.hs b/compiler/basicTypes/BasicTypes.hs index cf56957f7b..200e5c9b8a 100644 --- a/compiler/basicTypes/BasicTypes.hs +++ b/compiler/basicTypes/BasicTypes.hs @@ -28,6 +28,7 @@ module BasicTypes( Alignment, + PromotionFlag(..), isPromoted, FunctionOrData(..), WarningTxt(..), pprWarningTxtForMsg, StringLiteral(..), @@ -270,6 +271,24 @@ unSwap :: SwapFlag -> (a->a->b) -> a -> a -> b unSwap NotSwapped f a b = f a b unSwap IsSwapped f a b = f b a + +{- ********************************************************************* +* * + Promotion flag +* * +********************************************************************* -} + +-- | Is a TyCon a promoted data constructor or just a normal type constructor? +data PromotionFlag + = NotPromoted + | IsPromoted + deriving ( Eq, Data ) + +isPromoted :: PromotionFlag -> Bool +isPromoted IsPromoted = True +isPromoted NotPromoted = False + + {- ************************************************************************ * * |