[commit: packages/template-haskell] master: Add reifyAnnotations (#8397) (694c734)

git at git.haskell.org git
Sat Oct 12 05:57:30 UTC 2013


Repository : ssh://git at git.haskell.org/template-haskell

On branch  : master
Link       : http://git.haskell.org/packages/template-haskell.git/commitdiff/694c734f508369004ec6f8ff2351520a45b91a24

>---------------------------------------------------------------

commit 694c734f508369004ec6f8ff2351520a45b91a24
Author: Austin Seipp <austin at well-typed.com>
Date:   Fri Oct 11 22:19:56 2013 -0500

    Add reifyAnnotations (#8397)
    
    Signed-off-by: Austin Seipp <austin at well-typed.com>


>---------------------------------------------------------------

694c734f508369004ec6f8ff2351520a45b91a24
 Language/Haskell/TH.hs        |    2 ++
 Language/Haskell/TH/Syntax.hs |   21 ++++++++++++++++++---
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/Language/Haskell/TH.hs b/Language/Haskell/TH.hs
index ed07f38..a5ccca2 100644
--- a/Language/Haskell/TH.hs
+++ b/Language/Haskell/TH.hs
@@ -32,6 +32,8 @@ module Language.Haskell.TH(
 	isInstance,
         -- *** Roles lookup
         reifyRoles,
+        -- *** Annotation lookup
+        reifyAnnotations, AnnLookup(..),
 
 	-- * Typed expressions
 	TExp, unType,
diff --git a/Language/Haskell/TH/Syntax.hs b/Language/Haskell/TH/Syntax.hs
index 11a35c1..9660dcd 100644
--- a/Language/Haskell/TH/Syntax.hs
+++ b/Language/Haskell/TH/Syntax.hs
@@ -53,7 +53,8 @@ class (Monad m, Applicative m) => Quasi m where
        -- Returns list of matching instance Decs
        --    (with empty sub-Decs)
        -- Works for classes and type functions
-  qReifyRoles     :: Name -> m [Role]
+  qReifyRoles       :: Name -> m [Role]
+  qReifyAnnotations :: Data a => AnnLookup -> m [a]
 
   qLocation :: m Loc
 
@@ -93,6 +94,7 @@ instance Quasi IO where
   qReify _            = badIO "reify"
   qReifyInstances _ _ = badIO "classInstances"
   qReifyRoles _       = badIO "reifyRoles"
+  qReifyAnnotations _ = badIO "reifyAnnotations"
   qLocation    	      = badIO "currentLocation"
   qRecover _ _ 	      = badIO "recover" -- Maybe we could fix this?
   qAddDependentFile _ = badIO "addDependentFile"
@@ -324,6 +326,13 @@ The returned list should never contain 'InferR'.
 reifyRoles :: Name -> Q [Role]
 reifyRoles nm = Q (qReifyRoles nm)
 
+-- | @reifyAnnotations target@ returns the list of annotations
+-- associated with @target at .  Only the annotations that are
+-- appropriately typed is returned.  So if you have @Int@ and @String@
+-- annotations for the same target, you have to call this function twice.
+reifyAnnotations :: Data a => AnnLookup -> Q [a]
+reifyAnnotations an = Q (qReifyAnnotations an)
+
 -- | Is the list of instances returned by 'reifyInstances' nonempty?
 isInstance :: Name -> [Type] -> Q Bool
 isInstance nm tys = do { decs <- reifyInstances nm tys
@@ -375,6 +384,7 @@ instance Quasi Q where
   qReify    	    = reify
   qReifyInstances   = reifyInstances
   qReifyRoles       = reifyRoles
+  qReifyAnnotations = reifyAnnotations
   qLookupName       = lookupName
   qLocation 	    = location
   qRunIO    	    = runIO
@@ -490,10 +500,10 @@ rightName = mkNameG DataName "base" "Data.Either" "Right"
 -----------------------------------------------------
 
 newtype ModName = ModName String	-- Module name
- deriving (Eq,Ord,Typeable,Data)
+ deriving (Show,Eq,Ord,Typeable,Data)
 
 newtype PkgName = PkgName String	-- package name
- deriving (Eq,Ord,Typeable,Data)
+ deriving (Show,Eq,Ord,Typeable,Data)
 
 newtype OccName = OccName String
  deriving (Eq,Ord,Typeable,Data)
@@ -1338,6 +1348,11 @@ data Role = NominalR            -- ^ @nominal@
           | InferR              -- ^ @_@
   deriving( Show, Eq, Data, Typeable )
 
+-- | Annotation target for reifyAnnotations
+data AnnLookup = AnnLookupModule PkgName ModName
+               | AnnLookupName Name
+               deriving( Show, Eq, Data, Typeable )
+
 -- | To avoid duplication between kinds and types, they
 -- are defined to be the same. Naturally, you would never
 -- have a type be 'StarT' and you would never have a kind




More information about the ghc-commits mailing list