packages feed

haskell-src-meta 0.5.0.3 → 0.5.1

raw patch · 3 files changed

+95/−3 lines, 3 filesdep +uniplatedep ~haskell-src-extsdep ~template-haskellPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: uniplate

Dependency ranges changed: haskell-src-exts, template-haskell

API changes (from Hackage documentation)

- Language.Haskell.TH.Instances.Lift: instance Lift ClassInstance
+ Language.Haskell.Meta.Parse.Careful: parseDecs :: String -> Either String [Dec]
+ Language.Haskell.Meta.Parse.Careful: parseExp :: String -> Either String Exp
+ Language.Haskell.Meta.Parse.Careful: parsePat :: String -> Either String Pat
+ Language.Haskell.Meta.Parse.Careful: parseType :: String -> Either String Type
+ Language.Haskell.Meta.Syntax.Translate: collectVars :: Type -> [TyVarBndr]
+ Language.Haskell.Meta.Syntax.Translate: fixForall :: Type -> Type
+ Language.Haskell.Meta.Syntax.Translate: moduleName :: [Char]
+ Language.Haskell.Meta.Syntax.Translate: toGuard :: GuardedAlt -> (Guard, Exp)
+ Language.Haskell.Meta.Syntax.Translate: transAct :: Activation -> Maybe (Bool, Int)
+ Language.Haskell.Meta.Utils: renameThings :: (t1 -> t2 -> t -> (a, t1, t2)) -> t1 -> t2 -> [a] -> [t] -> ([a], t1, t2)

Files

README view
@@ -12,6 +12,14 @@  Major changes: +0.5.0.3 -> 0.5.1:+- New module Language.Haskell.Meta.Parse.Careful, written by Reiner Pope+  so that ambiguous parses can be rejected instead of quietly done wrong.++0.5.0.2 -> 0.5.0.3:+- Support for GHC 7.4, thanks to Reiner Pope+- Support for unresolved infix expressions, again thanks to Reiner Pope+ 0.5.0.1 -> 0.5.0.2: - Fixed bug in translation of tuple constructors 
haskell-src-meta.cabal view
@@ -1,5 +1,5 @@ name:               haskell-src-meta-version:            0.5.0.3+version:            0.5.1 cabal-version:      >= 1.6 build-type:         Simple license:            BSD3@@ -17,13 +17,23 @@  extra-source-files: examples/*.hs README +flag new-th+  Description: Build with template-haskell >= 2.7.0+  Default: True+ library   build-depends:   base >= 4.2 && < 4.6,-                   haskell-src-exts >= 1.6 && < 1.12,-                   template-haskell >= 2.4 && < 2.8,+                   haskell-src-exts >= 1.8 && < 1.12,                    pretty >= 1.0 && < 1.2,                    syb >= 0.1 && < 0.4,                    th-lift == 0.5.*++  if flag(new-th)+    Build-depends: template-haskell >= 2.7 && < 2.9+  else+    Build-depends: template-haskell >= 2.4 && < 2.7,+                   uniplate >= 1.3 && < 1.7+   extensions:      CPP,                    RankNTypes,                    StandaloneDeriving,@@ -36,6 +46,7 @@   hs-source-dirs:  src   exposed-modules: Language.Haskell.Meta                    Language.Haskell.Meta.Parse+                   Language.Haskell.Meta.Parse.Careful                    Language.Haskell.Meta.Syntax.Translate                    Language.Haskell.TH.Instances.Lift                    Language.Haskell.Meta.Utils
+ src/Language/Haskell/Meta/Parse/Careful.hs view
@@ -0,0 +1,73 @@+{- |+This module provides the tools to handle operator fixities in infix expressions correctly.++The problem we solve is the following. Consider making a quasiquoter which antiquotes to Haskell - for instance, the quasiquoter in <http://hackage.haskell.org/package/hmatrix-static> allows me to write++> myVec :: Vector Double+> myVec = [vec| 2+3*4, 5-4-3 |]++To correctly parse such expressions, we need to know the fixities and precedences of the operators, so that the above is parsed the same way as++> myVec = [vec| 2+(3*4), (5-4)-3 |]++There is a danger, if we are not careful in parsing, that the above expression instead parses as++> myVec = [vec| (2+3)*4, 5-(4-3) |]++which is a surprising bug, and would only be detected through testing at runtime, rather than at compile time.++When this danger arises, we use this \"careful\" module. It handles \"unresolved infix\" expressions such as @2+3*4@ in two ways, depending on the version of GHC:++  * in GHC 7.4 and above (where support for \"unresolved infix\" was added in Template Haskell), resolution of the infix expression is deferred to the compiler, which has all fixities available to it.++  * prior to GHC 7.4, any ambiguous infix expression is flagged as a parse error at compile time, and the user is advised to resolve the ambiguity by adding parentheses.++-}+module Language.Haskell.Meta.Parse.Careful(+  parsePat, +  parseExp, +  parseType, +  parseDecs+ ) where++import qualified Language.Haskell.Meta.Parse as Sloppy+import qualified Language.Haskell.Meta.Syntax.Translate as Translate+import qualified Language.Haskell.TH as TH+import qualified Language.Haskell.Exts.Syntax as Hs+#if !(MIN_VERSION_template_haskell(2,7,0))+import Data.Generics.Uniplate.Data+#endif++doChecked parser translater p = +  case parser p of +    Left s -> Left s+    Right p' | amb p' -> Left "Infix expression could not be resolved as operator fixities are not known. Resolve ambiguity by adding parentheses"+             | otherwise -> Right (translater p')++parsePat :: String -> Either String TH.Pat+parsePat = doChecked Sloppy.parseHsPat Translate.toPat++parseExp :: String -> Either String TH.Exp+parseExp = doChecked Sloppy.parseHsExp Translate.toExp++parseType :: String -> Either String TH.Type+parseType = doChecked Sloppy.parseHsType Translate.toType++parseDecs :: String -> Either String [TH.Dec]+parseDecs = doChecked Sloppy.parseHsDecls Translate.toDecs++#if MIN_VERSION_template_haskell(2,7,0)+amb = const False+#else+amb syn = any isAmbExp (universeBi syn) || any isAmbPat (universeBi syn)+  where+    isAmbExp (Hs.InfixApp Hs.InfixApp{} _ _) = True+    isAmbExp (Hs.InfixApp _ _ Hs.InfixApp{}) = True+    isAmbExp (Hs.InfixApp Hs.RightSection{} _ _) = True+    isAmbExp (Hs.InfixApp _ _ Hs.LeftSection{}) = True+    isAmbExp _ = False+    +    isAmbPat (Hs.PInfixApp Hs.PInfixApp{} _ _) = True+    isAmbPat (Hs.PInfixApp _ _ Hs.PInfixApp{}) = True+    isAmbPat _ = False+#endif