Merge MatchFixity and HsMatchContext
[ghc.git] / compiler / hsSyn / PlaceHolder.hs
index 97a4d7c..7b3391d 100644 (file)
@@ -3,7 +3,6 @@
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE StandaloneDeriving #-}
-{-# LANGUAGE UndecidableInstances #-}
 
 module PlaceHolder where
 
@@ -14,10 +13,11 @@ import NameSet
 import RdrName
 import Var
 import Coercion
-import {-# SOURCE #-} ConLike (ConLike)
-import TcEvidence (HsWrapper)
+import ConLike (ConLike)
 import FieldLabel
 import SrcLoc (Located)
+import TcEvidence ( HsWrapper )
+import Outputable ( OutputableBndr )
 
 import Data.Data hiding ( Fixity )
 import BasicTypes       (Fixity)
@@ -31,18 +31,21 @@ import BasicTypes       (Fixity)
 %************************************************************************
 -}
 
+-- NB: These are intentionally open, allowing API consumers (like Haddock)
+-- to declare new instances
+
 -- | used as place holder in PostTc and PostRn values
 data PlaceHolder = PlaceHolder
-  deriving (Data,Typeable)
+  deriving (Data)
 
 -- | Types that are not defined until after type checking
-type family PostTc it ty :: * -- Note [Pass sensitive types]
+type family PostTc id ty  -- Note [Pass sensitive types]
 type instance PostTc Id      ty = ty
 type instance PostTc Name    ty = PlaceHolder
 type instance PostTc RdrName ty = PlaceHolder
 
 -- | Types that are not defined until after renaming
-type family PostRn id ty :: * -- Note [Pass sensitive types]
+type family PostRn id ty  -- Note [Pass sensitive types]
 type instance PostRn Id      ty = ty
 type instance PostRn Name    ty = ty
 type instance PostRn RdrName ty = PlaceHolder
@@ -65,6 +68,9 @@ placeHolderNames = PlaceHolder
 placeHolderNamesTc :: NameSet
 placeHolderNamesTc = emptyNameSet
 
+placeHolderHsWrapper :: PlaceHolder
+placeHolderHsWrapper = PlaceHolder
+
 {-
 
 Note [Pass sensitive types]
@@ -83,10 +89,6 @@ pass-specific data types, implemented as a pair of open type families,
 one for PostTc and one for PostRn. These are then explicitly populated
 with a PlaceHolder value when they do not yet have meaning.
 
-Since the required bootstrap compiler at this stage does not have
-closed type families, an open type family had to be used, which
-unfortunately forces the requirement for UndecidableInstances.
-
 In terms of actual usage, we have the following
 
   PostTc id Kind
@@ -96,9 +98,18 @@ In terms of actual usage, we have the following
   PostRn id NameSet
 
 TcId and Var are synonyms for Id
+
+Unfortunately the type checker termination checking conditions fail for the
+DataId constraint type based on this, so even though it is safe the
+UndecidableInstances pragma is required where this is used.
 -}
 
 type DataId id =
+  ( DataIdPost id
+  , DataIdPost (NameOrRdrName id)
+  )
+
+type DataIdPost id =
   ( Data id
   , Data (PostRn id NameSet)
   , Data (PostRn id Fixity)
@@ -106,7 +117,7 @@ type DataId id =
   , Data (PostRn id Name)
   , Data (PostRn id (Located Name))
   , Data (PostRn id [Name])
---  , Data (PostRn id [id])
+
   , Data (PostRn id id)
   , Data (PostTc id Type)
   , Data (PostTc id Coercion)
@@ -117,3 +128,18 @@ type DataId id =
   , Data (PostTc id HsWrapper)
   , Data (PostTc id [FieldLabel])
   )
+
+
+-- |Follow the @id@, but never beyond Name. This is used in a 'HsMatchContext',
+-- for printing messages related to a 'Match'
+type family NameOrRdrName id where
+  NameOrRdrName Id      = Name
+  NameOrRdrName Name    = Name
+  NameOrRdrName RdrName = RdrName
+
+-- |Constraint type to bundle up the requirement for 'OutputableBndr' on both
+-- the @id@ and the 'NameOrRdrName' type for it
+type OutputableBndrId id =
+  ( OutputableBndr id
+  , OutputableBndr (NameOrRdrName id)
+  )