haskell-src-meta 0.8.0.3 → 0.8.1
raw patch · 11 files changed
+142/−61 lines, 11 filesdep +containersdep ~basedep ~haskell-src-extsdep ~prettynew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: containers
Dependency ranges changed: base, haskell-src-exts, pretty, syb, template-haskell
API changes (from Hackage documentation)
- Language.Haskell.Meta.Syntax.Translate: collectVars :: Type -> [TyVarBndr]
- Language.Haskell.Meta.Syntax.Translate: fixForall :: Type -> Type
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt a => Language.Haskell.Meta.Syntax.Translate.ToCxt (GHC.Base.Maybe a)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs a => Language.Haskell.Meta.Syntax.Translate.ToDecs (GHC.Base.Maybe a)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDerivClauses a => Language.Haskell.Meta.Syntax.Translate.ToDerivClauses (GHC.Base.Maybe a)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToMaybeKind a => Language.Haskell.Meta.Syntax.Translate.ToMaybeKind (GHC.Base.Maybe a)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToNames a => Language.Haskell.Meta.Syntax.Translate.ToNames (GHC.Base.Maybe a)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToTyVars a => Language.Haskell.Meta.Syntax.Translate.ToTyVars (GHC.Base.Maybe a)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType (Language.Haskell.Exts.Syntax.Kind l)
- Language.Haskell.Meta.Utils: instance GHC.Show.Show Language.Haskell.TH.Lib.DecQ
- Language.Haskell.Meta.Utils: instance GHC.Show.Show Language.Haskell.TH.Lib.ExpQ
- Language.Haskell.Meta.Utils: instance GHC.Show.Show Language.Haskell.TH.Lib.TypeQ
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt a => Language.Haskell.Meta.Syntax.Translate.ToCxt (GHC.Maybe.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs a => Language.Haskell.Meta.Syntax.Translate.ToDecs (GHC.Maybe.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDerivClauses a => Language.Haskell.Meta.Syntax.Translate.ToDerivClauses (GHC.Maybe.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToMaybeKind a => Language.Haskell.Meta.Syntax.Translate.ToMaybeKind (GHC.Maybe.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToNames a => Language.Haskell.Meta.Syntax.Translate.ToNames (GHC.Maybe.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToTyVars a => Language.Haskell.Meta.Syntax.Translate.ToTyVars (GHC.Maybe.Maybe a)
+ Language.Haskell.Meta.Utils: instance GHC.Show.Show Language.Haskell.TH.Lib.Internal.DecQ
+ Language.Haskell.Meta.Utils: instance GHC.Show.Show Language.Haskell.TH.Lib.Internal.ExpQ
+ Language.Haskell.Meta.Utils: instance GHC.Show.Show Language.Haskell.TH.Lib.Internal.TypeQ
- Language.Haskell.Meta.Syntax.Translate: toDerivStrategy :: (DerivStrategy l) -> DerivStrategy
+ Language.Haskell.Meta.Syntax.Translate: toDerivStrategy :: DerivStrategy l -> DerivStrategy
- Language.Haskell.Meta.Utils: cleanNames :: (Data a) => a -> a
+ Language.Haskell.Meta.Utils: cleanNames :: Data a => a -> a
- Language.Haskell.Meta.Utils: gpretty :: (Data a) => a -> String
+ Language.Haskell.Meta.Utils: gpretty :: Data a => a -> String
- Language.Haskell.Meta.Utils: normalizeT :: (Data a) => a -> a
+ Language.Haskell.Meta.Utils: normalizeT :: Data a => a -> a
- Language.Haskell.Meta.Utils: pretty :: (Show a) => a -> String
+ Language.Haskell.Meta.Utils: pretty :: Show a => a -> String
- Language.Haskell.Meta.Utils: showToPatQ :: (Show a) => a -> PatQ
+ Language.Haskell.Meta.Utils: showToPatQ :: Show a => a -> PatQ
- Language.Haskell.Meta.Utils: toExpQ :: (Lift a) => (String -> Q a) -> (String -> ExpQ)
+ Language.Haskell.Meta.Utils: toExpQ :: Lift a => (String -> Q a) -> String -> ExpQ
- Language.Haskell.Meta.Utils: toPatQ :: (Show a) => (String -> Q a) -> (String -> PatQ)
+ Language.Haskell.Meta.Utils: toPatQ :: Show a => (String -> Q a) -> String -> PatQ
Files
- ChangeLog +7/−4
- README.md +2/−0
- examples/BF.hs +2/−8
- examples/Hs.hs +1/−1
- examples/HsHere.hs +5/−4
- examples/SKI.hs +5/−8
- haskell-src-meta.cabal +31/−12
- src/Language/Haskell/Meta/Parse.hs +1/−5
- src/Language/Haskell/Meta/Syntax/Translate.hs +3/−12
- tests/Splices.hs +31/−7
- tests/TestExamples.hs +54/−0
ChangeLog view
@@ -1,14 +1,17 @@-0.8.0.1+0.8.1:+- Compatible with GHC 8.6, haskell-src-exts 1.22++0.8.0.1: - Bump base and template-haskell library to versions shipped with GHC 7.6. -0.8+0.8: - Compatibility with GHC 8.2. - Remove deprecated modules. -0.7.0.1+0.7.0.1: - Fixed a bug that caused deriving clauses to be ignored on TH 2.11. -0.7.0+0.7.0: - Compatibility with haskell-src-exts 1.18. - Support dropped for GHC < 7.6 and haskell-src-exts < 1.17.
README.md view
@@ -11,3 +11,5 @@ I don't really view this as "my" package so if you want write access to the github repository, or you think you could do a better job as maintainer, just ask.++The above was written by Ben Millwood, but I (Dan Burton) share the same sentiment.
examples/BF.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE BangPatterns, TemplateHaskell #-} -module Language.Haskell.Meta.QQ.BF (- bf,bf2,bfHelloWorld+module BF (+ bf,bf2,bfHelloWorld,eval_,parse ) where import Language.Haskell.Meta (parsePat)@@ -174,9 +174,3 @@ go !n acc (c :cs) = (n+1, [Error ("go error: char "++show n ++" illegal character: "++show c)], []) -}------
examples/Hs.hs view
@@ -2,7 +2,7 @@ -- | Eat your face! -module Language.Haskell.Meta.QQ.Hs (hs, pat) where+module Hs (hs, pat) where import Language.Haskell.Meta (parseExp, parsePat) import Language.Haskell.Meta.Utils (pretty)
examples/HsHere.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE DeriveDataTypeable, PatternGuards, TemplateHaskell #-} -module Language.Haskell.Meta.QQ.HsHere (here) where+module HsHere (here) where import Language.Haskell.Meta (parseExp, parsePat) import Language.Haskell.TH.Lib@@ -20,7 +20,7 @@ -- | Example: ----- > a x = [$here| random "text" $(x + 1)+-- > a x = [here| random "text" $(x + 1) -- > something else|] -- -- Is like:@@ -28,7 +28,9 @@ -- > a x = " random \"text\" "++ show (x + 1) ++"\n something else" here :: QuasiQuoter here = QuasiQuoter- {quoteExp = hereExpQ+ {quoteType = fail "The here quoter is only for expressions and patterns"+ ,quoteDec = fail "The here quoter is only for expressions and patterns"+ ,quoteExp = hereExpQ ,quotePat = herePatQ} instance Lift Here@@ -111,4 +113,3 @@ cparenP = char ')' obrackP = char '[' cbrackP = char ']'-
examples/SKI.hs view
@@ -1,13 +1,13 @@ {-# LANGUAGE DeriveDataTypeable, PatternGuards, TemplateHaskell #-} -module Language.Haskell.Meta.QQ.SKI (SKI(..),ski) where+module SKI (SKI(..),ski,parse) where import Language.Haskell.Meta (parseExp, parsePat)-import Language.Haskell.TH.Lib+import Language.Haskell.TH.Lib hiding (parensP) import Language.Haskell.TH.Ppr import Language.Haskell.TH.Quote import Language.Haskell.TH.Syntax-import Language.Haskell.Meta.Utils (cleanNames, ppDoc, unQ)+import Language.Haskell.Meta.Utils (cleanNames, ppDoc, unsafeRunQ) import Text.ParserCombinators.ReadP import Data.Typeable(Typeable) import Data.Generics(Data)@@ -26,13 +26,13 @@ eval (I :$ x) = eval x eval ((K :$ x) :$ y) = eval x eval (((S :$ x) :$ y :$ z)) = eval (eval (x :$ z) :$ eval (y :$ z))-eval (E e :$ E e') = E (unQ[|$(return e) $(return e')|])+eval (E e :$ E e') = E (unsafeRunQ[|$(return e) $(return e')|]) eval (x :$ y) = eval0 ((eval x) :$ (eval y)) eval x = x eval0 (I :$ x) = eval x eval0 ((K :$ x) :$ y) = eval x eval0 (((S :$ x) :$ y :$ z)) = eval (eval (x :$ z) :$ eval (y :$ z))-eval0 (E e :$ E e') = E (unQ[|$(return e) $(return e')|])+eval0 (E e :$ E e') = E (unsafeRunQ[|$(return e) $(return e')|]) eval0 x = x ski :: QuasiQuoter@@ -150,6 +150,3 @@ c = s $ (b $ b $ s) $ k $ k b = s $ (k $ s) $ k -}---
haskell-src-meta.cabal view
@@ -1,5 +1,5 @@ name: haskell-src-meta-version: 0.8.0.3+version: 0.8.1 cabal-version: >= 1.8 build-type: Simple license: BSD3@@ -7,21 +7,21 @@ category: Language, Template Haskell author: Matt Morrow copyright: (c) Matt Morrow-maintainer: Ben Millwood <haskell@benmachine.co.uk>-bug-reports: https://github.com/bmillwood/haskell-src-meta/issues-tested-with: GHC == 7.6.3, GHC == 7.8.3, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.1+maintainer: danburton.email@gmail.com+bug-reports: https://github.com/DanBurton/haskell-src-meta/issues+tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.3 synopsis: Parse source to template-haskell abstract syntax. description: The translation from haskell-src-exts abstract syntax to template-haskell abstract syntax isn't 100% complete yet. -extra-source-files: ChangeLog README.md examples/*.hs+extra-source-files: ChangeLog README.md library- build-depends: base >= 4.6 && < 4.12,- haskell-src-exts >= 1.18 && < 1.21,+ build-depends: base >= 4.6 && < 5,+ haskell-src-exts >= 1.18 && < 1.22, pretty >= 1.0 && < 1.2, syb >= 0.1 && < 0.8,- template-haskell >= 2.8 && < 2.14,+ template-haskell >= 2.8 && < 2.15, th-orphans >= 0.9.1 && < 0.14 if impl(ghc < 7.8)@@ -40,11 +40,11 @@ build-depends: HUnit >= 1.2 && < 1.7,- base >= 4.5 && < 4.12,- haskell-src-exts >= 1.17 && < 1.21,+ base >= 4.5 && < 5,+ haskell-src-exts >= 1.17 && < 1.22, haskell-src-meta, pretty >= 1.0 && < 1.2,- template-haskell >= 2.7 && < 2.14,+ template-haskell >= 2.7 && < 2.15, test-framework >= 0.8 && < 0.9, test-framework-hunit >= 0.3 && < 0.4 @@ -57,6 +57,25 @@ base, haskell-src-meta +test-suite examples+ type: exitcode-stdio-1.0+ hs-source-dirs: examples, tests+ main-is: TestExamples.hs++ build-depends:+ base,+ containers,+ haskell-src-meta,+ syb,+ template-haskell,+ pretty++ other-modules:+ BF,+ Hs,+ HsHere,+ SKI+ source-repository head type: git- location: git://github.com/bmillwood/haskell-src-meta.git+ location: git://github.com/danburton/haskell-src-meta.git
src/Language/Haskell/Meta/Parse.hs view
@@ -68,14 +68,10 @@ {-# DEPRECATED myDefaultParseMode, myDefaultExtensions "The provided ParseModes aren't very meaningful, use your own instead" #-} myDefaultParseMode :: ParseMode-myDefaultParseMode = ParseMode+myDefaultParseMode = defaultParseMode {parseFilename = [] ,baseLanguage = Haskell2010 ,extensions = map EnableExtension myDefaultExtensions- ,ignoreLinePragmas = False- ,ignoreLanguagePragmas = False- ,fixities = Nothing- ,ignoreFunctionArity = False } myDefaultExtensions :: [KnownExtension]
src/Language/Haskell/Meta/Syntax/Translate.hs view
@@ -314,11 +314,13 @@ toName (PlainTV n) = n toName (KindedTV n _) = n +#if !MIN_VERSION_haskell_src_exts(1,21,0) instance ToType (Hs.Kind l) where toType (Hs.KindStar _) = StarT toType (Hs.KindFn _ k1 k2) = toType k1 .->. toType k2 toType (Hs.KindParen _ kp) = toType kp toType (Hs.KindVar _ n) = VarT (toName n)+#endif toKind :: Hs.Kind l -> Kind toKind = toType@@ -714,7 +716,7 @@ instance ToDecs (Hs.Decl l) where toDecs a@(Hs.TypeSig _ ns t)- = let xs = fmap (flip SigD (fixForall $ toType t) . toName) ns+ = let xs = fmap (flip SigD (toType t) . toName) ns in xs toDecs (Hs.InfixDecl l assoc Nothing ops) =@@ -728,17 +730,6 @@ Hs.AssocRight _ -> InfixR toDecs a = [toDec a]--collectVars e = case e of- VarT n -> [PlainTV n]- AppT t1 t2 -> nub $ collectVars t1 ++ collectVars t2- ForallT ns _ t -> collectVars t \\ ns- _ -> []--fixForall t = case vs of- [] -> t- _ -> ForallT vs [] t- where vs = collectVars t instance ToDecs a => ToDecs [a] where toDecs a = concatMap toDecs a
tests/Splices.hs view
@@ -1,26 +1,50 @@-{-#LANGUAGE TemplateHaskell#-}+{-# LANGUAGE CPP, TemplateHaskell #-} -- | Tests stuff mostly by just compiling correctly import Language.Haskell.Meta ------- Testing names:+----- Testing names ----- -- Test that the unit constructor works-$(either error return $ parseDecs +$(either error return $ parseDecs "unit :: IO ()\nunit = return ()") --- Testing that the [] constructor works in types, -$(either error return $ parseDecs +-- Testing that the [] constructor works in types,+#if MIN_VERSION_base(4,9,0)+$(either error return $ parseDecs "nilp :: [a] -> ([] a)\nnilp [] = []")+#else+-- CPP Note: Apparently ghc < 7 doesn't parse this correctly w/o the forall.+-- https://github.com/DanBurton/haskell-src-meta/issues/2+$(either error return $ parseDecs+ "nilp :: forall a. [a] -> ([] a)\nnilp [] = []")+#endif -$(either error return $ parseDecs +$(either error return $ parseDecs "pair :: (,) Int Int\npair = (,) 1 2") +----- Testing classes and instances -----+#if MIN_VERSION_base(4,9,0)+$(either error return $ parseDecs $ unlines+ ["class MyClass a where mymethod :: a -> b -> (a,b)"+ ,"instance MyClass Bool where mymethod a b = (a,b)"+ ])+#else+-- CPP Note: Apparently ghc < 7 doesn't parse this correctly w/o the forall.+-- https://github.com/DanBurton/haskell-src-meta/issues/2+$(either error return $ parseDecs $ unlines+ ["class MyClass a where mymethod :: forall b. a -> b -> (a,b)"+ ,"instance MyClass Bool where mymethod a b = (a,b)"+ ])+#endif ++ -- Just to check that it works as intended main = do+ -9 <- return $(either error return $ parseExp "-3^2") :: IO Int () <- unit [] <- return (nilp []) (1,2) <- return pair+ (True,1) <- return $ mymethod True 1 return ()
+ tests/TestExamples.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}++import Control.Monad (when)++import qualified BF+import qualified Hs+import qualified HsHere+import qualified SKI++import SKI (SKI(S, K, I, (:$)))++-- Very dumb test framework+shouldBe :: (Show a, Eq a) => a -> a -> IO ()+actual `shouldBe` expected = case actual == expected of+ True -> return ()+ False -> do+ putStr "Expected: "+ print expected+ putStr "Actual: "+ print actual+ fail "Expectation failure"+++a :: Int -> String+a x = [HsHere.here| random "text" $(x + 1)+ something else|]++hereTest :: IO ()+hereTest = do+ a 3 `shouldBe` (" random \"text\" "++ show (3 + 1) ++"\n something else")++-- TODO: better test exercising the bf quasiquoter++bfTest :: IO ()+bfTest = do+ BF.eval_ (BF.parse BF.bfHelloWorld) "" `shouldBe` "Hello World!\n"++hsTest :: IO ()+hsTest = do+ (\ [Hs.hs|a@(x,_)|] -> [Hs.hs|(a,x)|]) (42,88) `shouldBe` ((42,88),42)++-- TODO: better test exercising the ski quasiquoter++skiTest :: IO ()+skiTest = do+ SKI.parse "S(SS)IK(SK)" `shouldBe` ([(((S :$ (S :$ S)) :$ I) :$ K) :$ (S :$ K)],"")++main :: IO ()+main = do+ putStrLn ""+ hereTest+ bfTest+ hsTest+ skiTest