1+ {-# LANGUAGE RankNTypes #-}
2+ {-# LANGUAGE ScopedTypeVariables #-}
3+
14module Main where
25
3- import qualified Control.Monad.Fail as Fail
4- import qualified Language.Haskell.Exts as Exts
5- import qualified Language.Haskell.Exts.Extension as Extension
6- import qualified Language.Haskell.Exts.Parser as Parser
6+ import qualified Control.Monad.Fail as Fail
7+ import Data.Data (Data , cast , gfoldl )
8+ import Data.Functor.Const
9+ (Const (Const , getConst ))
10+ import qualified Language.Haskell.Exts as Exts
11+ import qualified Language.Haskell.Exts.Extension as Extension
12+ import qualified Language.Haskell.Exts.Parser as Parser
713import Language.Haskell.Meta.Parse
8- import qualified Language.Haskell.TH as TH
9- import Test.HUnit (Assertion , (@?=) )
14+ import Language.Haskell.Meta.Syntax.Translate
15+ import qualified Language.Haskell.TH as TH
16+ import Test.HUnit (Assertion , (@?=) )
1017import Test.Tasty
1118 (TestTree , defaultMain , testGroup )
12- import Test.Tasty.HUnit (testCase )
19+ import Test.Tasty.HUnit (testCase )
1320
1421type Test = TestTree
1522
@@ -19,12 +26,46 @@ main = defaultMain (testGroup "unit" tests)
1926tests :: [Test ]
2027tests = [ derivingClausesTest
2128 , typeAppTest
29+ , orderInTypeTuples
2230 ]
2331
2432derivingClausesTest :: Test
2533derivingClausesTest = testCase " Deriving clauses preserved" $
2634 roundTripDecls " data Foo = Foo deriving (A, B, C)"
2735
36+ orderInTypeTuples :: Test
37+ orderInTypeTuples =
38+ testCase " Ensure that type tuples reconstructed in proper order" $ do
39+ expected @?= actual
40+ where
41+ expected :: [TH. TyLit ]
42+ expected = collectAll (toExp parsed)
43+ actual = [TH. StrTyLit " a" , TH. StrTyLit " b" ]
44+
45+ parsed :: Exts. Exp Exts. SrcSpanInfo
46+ parsed = case Exts. parseExpWithMode mode " foo @'(\" a\" , \" b\" )" of
47+ Exts. ParseOk v -> v
48+ e -> error $ show e
49+ mode :: Exts. ParseMode
50+ mode = Exts. defaultParseMode {
51+ Exts. extensions = [
52+ Exts. EnableExtension Exts. TypeApplications
53+ , Exts. EnableExtension Exts. DataKinds
54+ ]
55+ }
56+
57+ collectAll :: (Data a , Data b ) => a -> [b ]
58+ collectAll = ($ [] ) . go
59+ where
60+ go :: forall a b . (Data a , Data b ) => a -> [b ] -> [b ]
61+ go = \ x ->
62+ case cast x of
63+ Just x' -> (x' : )
64+ Nothing -> getConst $ gfoldl ap (const $ Const id ) x
65+ where
66+ ap :: Data x => Const ([b ] -> [b ]) (x -> y ) -> x -> Const ([b ] -> [b ]) y
67+ ap (Const acc) x = Const $ acc . go x
68+
2869typeAppMode :: Exts. ParseMode
2970typeAppMode = Parser. defaultParseMode { Parser. extensions = [Extension. EnableExtension Extension. TypeApplications ] }
3071
0 commit comments