packages feed

th-abstraction 0.2.3.0 → 0.2.4.0

raw patch · 4 files changed

+71/−10 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Language.Haskell.TH.Datatype: Lazy :: Strictness
+ Language.Haskell.TH.Datatype: NoUnpack :: Unpackedness
+ Language.Haskell.TH.Datatype: Strict :: Strictness
+ Language.Haskell.TH.Datatype: Unpack :: Unpackedness
+ Language.Haskell.TH.Datatype: UnspecifiedStrictness :: Strictness
+ Language.Haskell.TH.Datatype: UnspecifiedUnpackedness :: Unpackedness
+ Language.Haskell.TH.Datatype: data Strictness
+ Language.Haskell.TH.Datatype: data Unpackedness
+ Language.Haskell.TH.Datatype: tvKind :: TyVarBndr -> Kind

Files

ChangeLog.md view
@@ -1,5 +1,10 @@ # Revision history for th-abstraction +## 0.2.4.0 -- 2017-07-31++* Fix bug that caused GADT equality constraints to be incorrect in some cases.+* Expose `Unpackedness` and `Strictness` (which were unexported by accident).+ ## 0.2.3.0 -- 2017-06-26  * Add `resolvePredSynonyms`
src/Language/Haskell/TH/Datatype.hs view
@@ -60,6 +60,8 @@   , DatatypeVariant(..)   , ConstructorVariant(..)   , FieldStrictness(..)+  , Unpackedness(..)+  , Strictness(..)    -- * Normalization functions   , reifyDatatype@@ -106,6 +108,7 @@   -- * Convenience functions   , unifyTypes   , tvName+  , tvKind   , datatypeType   ) where @@ -539,7 +542,7 @@  -- If a VarT is missing an explicit kind signature, steal it from a TyVarBndr. stealKindForType :: TyVarBndr -> Type -> Type-stealKindForType tvb t@VarT{} = SigT t (tvbKind tvb)+stealKindForType tvb t@VarT{} = SigT t (tvKind tvb) stealKindForType _   t        = t  -- | Normalize 'Dec' for a newtype or datatype into a 'DatatypeInfo'.@@ -611,9 +614,9 @@     PlainTV  t   -> VarT t  -- | Extract the kind from a 'TyVarBndr'. Assumes 'PlainTV' has kind @*@.-tvbKind :: TyVarBndr -> Kind-tvbKind (PlainTV  _)   = starK-tvbKind (KindedTV _ k) = k+tvKind :: TyVarBndr -> Kind+tvKind (PlainTV  _)   = starK+tvKind (KindedTV _ k) = k  -- | Remove the outermost 'SigT'. stripSigT :: Type -> Type@@ -878,16 +881,36 @@   Q [ConstructorInfo] normalizeGadtC typename params tyvars context names innerType                fields stricts getVariant =-  do innerType' <- resolveTypeSynonyms innerType+  do -- Due to GHC Trac #13885, it's possible that the type variables bound by+     -- a GADT constructor will shadow those that are bound by the data type.+     -- This function assumes this isn't the case in certain parts (e.g., when+     -- mergeArguments is invoked), so we do an alpha-renaming of the+     -- constructor-bound variables before proceeding. See #36 for an example+     -- of what can go wrong if this isn't done.+     let conBoundNames =+           concatMap (\tvb -> tvName tvb:freeVariables (tvKind tvb)) tyvars+     conSubst <- T.sequence $ Map.fromList [ (n, newName (nameBase n))+                                           | n <- conBoundNames ]+     let conSubst'     = fmap VarT conSubst+         renamedTyvars =+           map (\tvb -> case tvb of+                          PlainTV n    -> PlainTV  (conSubst Map.! n)+                          KindedTV n k -> KindedTV (conSubst Map.! n)+                                                   (applySubstitution conSubst' k)) tyvars+         renamedContext   = applySubstitution conSubst' context+         renamedInnerType = applySubstitution conSubst' innerType+         renamedFields    = applySubstitution conSubst' fields++     innerType' <- resolveTypeSynonyms renamedInnerType      case decomposeType innerType' of        ConT innerTyCon :| ts | typename == innerTyCon ->           let (substName, context1) = mergeArguments params ts              subst   = VarT <$> substName-             tyvars' = [ tv | tv <- tyvars, Map.notMember (tvName tv) subst ]+             tyvars' = [ tv | tv <- renamedTyvars, Map.notMember (tvName tv) subst ] -             context2 = applySubstitution subst (context1 ++ context)-             fields'  = applySubstitution subst fields+             context2 = applySubstitution subst (context1 ++ renamedContext)+             fields'  = applySubstitution subst renamedFields          in sequence [ ConstructorInfo name tyvars' context2                                        fields' stricts <$> variantQ                      | name <- names
test/Main.hs view
@@ -26,6 +26,10 @@ import Control.Monad (zipWithM_) #endif +#if MIN_VERSION_base(4,7,0)+import Data.Type.Equality ((:~:)(..))+#endif+ import Language.Haskell.TH import Language.Haskell.TH.Datatype import Language.Haskell.TH.Lib (starK)@@ -62,6 +66,9 @@ #endif      reifyDatatypeWithConNameTest      reifyConstructorTest+#if MIN_VERSION_base(4,7,0)+     importedEqualityTest+#endif  adt1Test :: IO () adt1Test =@@ -521,7 +528,6 @@ reifyDatatypeWithConNameTest :: IO () reifyDatatypeWithConNameTest =   $(do info <- reifyDatatype 'Just-       let a = VarT (mkName "a")        validateDI info          DatatypeInfo           { datatypeContext = []@@ -546,3 +552,30 @@ reifyConstructorTest =   $(do info <- reifyConstructor 'Just        validateCI info justCI)++#if MIN_VERSION_base(4,7,0)+importedEqualityTest :: IO ()+importedEqualityTest =+  $(do info <- reifyDatatype ''(:~:)+       let [a,b] = map (VarT . mkName) ["a","b"]+           k     = mkName "k"+           kKind = varKCompat k+       validateDI info+         DatatypeInfo+           { datatypeContext = []+           , datatypeName    = ''(:~:)+           , datatypeVars    = [SigT a kKind, SigT b kKind]+           , datatypeVariant = Datatype+           , datatypeCons    =+               [ ConstructorInfo+                   { constructorName       = 'Refl+                   , constructorVars       = [KindedTV k starK]+                     -- This shouldn't happen, ideally. See #37.++                   , constructorContext    = [equalPred a b]+                   , constructorFields     = []+                   , constructorStrictness = []+                   , constructorVariant    = NormalConstructor } ]+           }+   )+#endif
th-abstraction.cabal view
@@ -1,5 +1,5 @@ name:                th-abstraction-version:             0.2.3.0+version:             0.2.4.0 synopsis:            Nicer interface for reified information about data types description:         This package normalizes variations in the interface for                      inspecting datatype information via Template Haskell