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 +5/−0
- src/Language/Haskell/TH/Datatype.hs +31/−8
- test/Main.hs +34/−1
- th-abstraction.cabal +1/−1
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