th-desugar 1.5.4.1 → 1.5.5
raw patch · 5 files changed
+77/−7 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.Haskell.TH.Desugar: instance Desugar Con DCon
- Language.Haskell.TH.Desugar: instance Desugar Cxt DCxt
- Language.Haskell.TH.Desugar: instance Desugar Exp DExp
- Language.Haskell.TH.Desugar: instance Desugar Kind DKind
- Language.Haskell.TH.Desugar: instance Desugar TyVarBndr DTyVarBndr
- Language.Haskell.TH.Desugar: instance Desugar Type DType
- Language.Haskell.TH.Desugar: instance Desugar [Dec] [DDec]
- Language.Haskell.TH.Desugar.Lift: instance Lift DClause
- Language.Haskell.TH.Desugar.Lift: instance Lift DCon
- Language.Haskell.TH.Desugar.Lift: instance Lift DConFields
- Language.Haskell.TH.Desugar.Lift: instance Lift DDec
- Language.Haskell.TH.Desugar.Lift: instance Lift DExp
- Language.Haskell.TH.Desugar.Lift: instance Lift DForeign
- Language.Haskell.TH.Desugar.Lift: instance Lift DKind
- Language.Haskell.TH.Desugar.Lift: instance Lift DLetDec
- Language.Haskell.TH.Desugar.Lift: instance Lift DMatch
- Language.Haskell.TH.Desugar.Lift: instance Lift DPat
- Language.Haskell.TH.Desugar.Lift: instance Lift DPragma
- Language.Haskell.TH.Desugar.Lift: instance Lift DPred
- Language.Haskell.TH.Desugar.Lift: instance Lift DRuleBndr
- Language.Haskell.TH.Desugar.Lift: instance Lift DTySynEqn
- Language.Haskell.TH.Desugar.Lift: instance Lift DTyVarBndr
- Language.Haskell.TH.Desugar.Lift: instance Lift DType
- Language.Haskell.TH.Desugar.Lift: instance Lift NewOrData
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar Language.Haskell.TH.Syntax.Con Language.Haskell.TH.Desugar.Core.DCon
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar Language.Haskell.TH.Syntax.Cxt Language.Haskell.TH.Desugar.Core.DCxt
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar Language.Haskell.TH.Syntax.Exp Language.Haskell.TH.Desugar.Core.DExp
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar Language.Haskell.TH.Syntax.Kind Language.Haskell.TH.Desugar.Core.DKind
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar Language.Haskell.TH.Syntax.TyVarBndr Language.Haskell.TH.Desugar.Core.DTyVarBndr
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar Language.Haskell.TH.Syntax.Type Language.Haskell.TH.Desugar.Core.DType
+ Language.Haskell.TH.Desugar: instance Language.Haskell.TH.Desugar.Desugar [Language.Haskell.TH.Syntax.Dec] [Language.Haskell.TH.Desugar.Core.DDec]
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DClause
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DCon
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DConFields
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DDec
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DExp
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DForeign
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DKind
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DLetDec
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DMatch
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DPat
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DPragma
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DPred
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DRuleBndr
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DTySynEqn
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DTyVarBndr
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.DType
+ Language.Haskell.TH.Desugar.Lift: instance Language.Haskell.TH.Syntax.Lift Language.Haskell.TH.Desugar.Core.NewOrData
- Language.Haskell.TH.Desugar: type DInstanceDec = DDec
+ Language.Haskell.TH.Desugar: type DInstanceDec = DDec Guaranteed to be an instance declaration
Files
- CHANGES.md +10/−0
- Language/Haskell/TH/Desugar/Core.hs +10/−5
- Test/Run.hs +12/−0
- Test/Splices.hs +43/−0
- th-desugar.cabal +2/−2
CHANGES.md view
@@ -1,6 +1,16 @@ `th-desugar` release notes ========================== +Version 1.5.5+-------------++* Fix issue #34. This means that desugaring (twice) is idempotent over+expressions, after the second time. That is, if you desugar an expression,+sweeten it, desugar again, sweeten again, and then desugar a third time, you+get the same result as when you desugared the second time. (The extra+round-trip is necessary there to make the output smaller in certain common+cases.)+ Version 1.5.4.1 --------------- * Fix issue #32, concerning reification of classes with default methods.
Language/Haskell/TH/Desugar/Core.hs view
@@ -226,6 +226,11 @@ let failure = DAppE (DVarE 'error) (DLitE (StringL "Non-exhaustive guards in multi-way if")) in dsGuards guarded_exps failure dsExp (LetE decs exp) = DLetE <$> dsLetDecs decs <*> dsExp exp+ -- the following special case avoids creating a new "let" when it's not+ -- necessary. See #34.+dsExp (CaseE (VarE scrutinee) matches) = do+ matches' <- dsMatches scrutinee matches+ return $ DCaseE (DVarE scrutinee) matches' dsExp (CaseE exp matches) = do scrutinee <- newUniqueName "scrutinee" exp' <- dsExp exp@@ -285,7 +290,7 @@ extract_type_name (SigT t _) = extract_type_name t extract_type_name (ConT n) = return n extract_type_name _ = impossible "Record selector domain not a datatype."- + filter_cons_with_names cons field_names = filter has_names cons where@@ -600,7 +605,7 @@ remove_arrows n (DArrowK _ k) = remove_arrows (n-1) k remove_arrows _ _ = impossible "Internal error: Fix for bug 8884 ran out of arrows."- + #else fixBug8884ForFamilies dec = return (dec, 0) -- return value ignored #endif@@ -671,7 +676,7 @@ dsDec (DefaultSigD n ty) = (:[]) <$> (DDefaultSigD n <$> dsType ty) #endif - + -- | Desugar @Dec@s that can appear in a let expression dsLetDecs :: DsMonad q => [Dec] -> q [DLetDec] dsLetDecs = concatMapM dsLetDec@@ -750,7 +755,7 @@ -> q [DClause] dsClauses _ [] = return [] dsClauses n (Clause pats (NormalB exp) where_decs : rest) = do- -- this is just a convenience optimization; we could tuple up all the patterns+ -- this case is necessary to maintain the roundtrip property. rest' <- dsClauses n rest exp' <- dsExp exp where_decs' <- dsLetDecs where_decs@@ -895,7 +900,7 @@ -- available. dsReify :: DsMonad q => Name -> q (Maybe DInfo) dsReify = traverse dsInfo <=< reifyWithLocals_maybe- + -- create a list of expressions in the same order as the fields in the first argument -- but with the values as given in the second argument -- if a field is missing from the second argument, use the corresponding expression
Test/Run.hs view
@@ -222,6 +222,16 @@ exps (map sweeten sexps) return $ ListE bools ) +test_roundtrip :: [Bool]+test_roundtrip = $( do exprs <- sequence test_exprs+ ds_exprs1 <- mapM dsExp exprs+ let th_exprs1 = map expToTH ds_exprs1+ ds_exprs2 <- mapM dsExp th_exprs1+ let th_exprs2 = map expToTH ds_exprs2+ ds_exprs3 <- mapM dsExp th_exprs2+ let bools = zipWith eqTH ds_exprs2 ds_exprs3+ Syn.lift bools )+ main :: IO () main = hspec $ do describe "th-desugar library" $ do@@ -261,5 +271,7 @@ local_reifications normal_reifications [1..] zipWithM (\b n -> it ("works on simplCase test " ++ show n) b) simplCase [1..]++ zipWithM (\b n -> it ("round-trip successfully on case " ++ show n) b) test_roundtrip [1..] fromHUnitTest tests
Test/Splices.hs view
@@ -385,3 +385,46 @@ [ [t|forall a. a ~ Int => a|] , [t|forall a. [a]|] , [t|forall a b. (a,b)|] ]++test_exprs :: [Q Exp]+test_exprs = [ test1_sections+ , test2_lampats+ , test3_lamcase+-- see above , test4_tuples+ , test5_ifs+ , test6_ifs2+ , test7_let+ , test8_case+ , test9_do+ , test10_comp+#if __GLASGOW_HASKELL__ >= 707+ , test11_parcomp+ , test12_parcomp2+#endif+ , test13_sig+ , test14_record+ , test15_litp+ , test16_tupp+ , test17_infixp+ , test18_tildep+ , test19_bangp+ , test20_asp+ , test21_wildp+ , test22_listp+ , test24_fun+ , test25_fun2+ , test26_forall+ , test27_kisig+ , test28_tupt+ , test29_listt+ , test30_promoted+ , test31_constraint+ , test32_tylit+ , test33_tvbs+ , test34_let_as+#if __GLASGOW_HASKELL__ >= 709+ , test37_pred+ , test38_pred2+ , test39_eq+#endif+ ]
th-desugar.cabal view
@@ -1,5 +1,5 @@ name: th-desugar-version: 1.5.4.1+version: 1.5.5 cabal-version: >= 1.10 synopsis: Functions to desugar Template Haskell homepage: http://www.cis.upenn.edu/~eir/packages/th-desugar@@ -26,7 +26,7 @@ source-repository this type: git location: https://github.com/goldfirere/th-desugar.git- tag: v1.5.4.1+ tag: v1.5.5 library build-depends: