diff --git a/test/Spec/TemplateHaskell.failing b/test/Spec/TemplateHaskell.failing new file mode 100644 index 0000000..b6f2fdd --- /dev/null +++ b/test/Spec/TemplateHaskell.failing @@ -0,0 +1,6 @@ +main: test/Spec/TemplateHaskell/TH.hs:22:1: threeQ +main: test/Spec/TemplateHaskell/TH.hs:25:1: intQQ +main: test/Spec/TemplateHaskell/TH.hs:33:1: zero1 +main: test/Spec/TemplateHaskell/TH.hs:36:1: zero2 +main: test/Spec/TemplateHaskell/TH.hs:39:1: zero3 +main: test/Spec/TemplateHaskell/TH.hs:42:1: zero4 diff --git a/test/Spec/TemplateHaskell.stdout b/test/Spec/TemplateHaskell.stdout new file mode 100644 index 0000000..e69de29 diff --git a/test/Spec/TemplateHaskell.toml b/test/Spec/TemplateHaskell.toml new file mode 100644 index 0000000..cd8cbd1 --- /dev/null +++ b/test/Spec/TemplateHaskell.toml @@ -0,0 +1,7 @@ +roots = [ "Spec.TemplateHaskell.User.root" ] + +type-class-roots = false + +unused-types = false + +root-instances = [] diff --git a/test/Spec/TemplateHaskell/TH.hs b/test/Spec/TemplateHaskell/TH.hs new file mode 100644 index 0000000..86dedad --- /dev/null +++ b/test/Spec/TemplateHaskell/TH.hs @@ -0,0 +1,42 @@ +module Spec.TemplateHaskell.TH (intQQ, oneQ, twoQ, two, three, threeQ) where + +import Language.Haskell.TH +import Language.Haskell.TH.Quote + +oneQ :: Q Exp +oneQ = pure . LitE $ IntegerL one + +one :: Integer +one = 1 + +two :: Int +two = 2 + +twoQ :: Q Exp +twoQ = pure . VarE $ mkName "two" + +three :: Int +three = 3 + +threeQ :: Q [Dec] +threeQ = pure [ValD (VarP $ mkName "three'") (NormalB . VarE $ mkName "three") []] + +intQQ :: QuasiQuoter +intQQ = QuasiQuoter + { quoteExp = pure . LitE . IntegerL . (zero1 +) . read + , quotePat = pure . LitP . IntegerL . (zero2 +) . read + , quoteType = pure . LitT . NumTyLit . (zero3 +) . read + , quoteDec = pure . pure . (\i -> ValD (VarP $ mkName "quote") (NormalB $ LitE $ IntegerL i) []) . (zero4 +) . read + } + +zero1 :: Integer +zero1 = 0 + +zero2 :: Integer +zero2 = 0 + +zero3 :: Integer +zero3 = 0 + +zero4 :: Integer +zero4 = 0 diff --git a/test/Spec/TemplateHaskell/User.hs b/test/Spec/TemplateHaskell/User.hs new file mode 100644 index 0000000..81e1c55 --- /dev/null +++ b/test/Spec/TemplateHaskell/User.hs @@ -0,0 +1,22 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE KindSignatures #-} + +module Spec.TemplateHaskell.User where + +import Spec.TemplateHaskell.TH +import GHC.TypeLits (Nat) + +$(threeQ) + +newtype T (a :: Nat) = T Int + +root :: T [intQQ|1|] +root = T $ $(oneQ) + [intQQ|1|] + quote + f (1 :: Int) + $(twoQ) + three' + where + f [intQQ|1|] = 1 + f _ = 1 + +quote :: Int +[intQQ|2|] diff --git a/weeder.cabal b/weeder.cabal index 3dbaee2..47f48d0 100644 --- a/weeder.cabal +++ b/weeder.cabal @@ -76,6 +76,7 @@ test-suite weeder-test , tasty , tasty-hunit-compat , tasty-golden + , template-haskell , text , toml-reader , weeder @@ -107,6 +108,8 @@ test-suite weeder-test Spec.RangeEnum.RangeEnum Spec.RootClasses.RootClasses Spec.StandaloneDeriving.StandaloneDeriving + Spec.TemplateHaskell.TH + Spec.TemplateHaskell.User Spec.TypeAliasGADT.TypeAliasGADT Spec.TypeDataDecl.TypeDataDecl Spec.Types.Types