haskell-tools-ast-0.4.1.2: Language/Haskell/Tools/AST/MakeASTReferences.hs
{-# LANGUAGE LambdaCase, TemplateHaskellQuotes #-}
-- | Contains a transformation to alter the references generated by the template haskell
-- function @makeReferences@.
module Language.Haskell.Tools.AST.MakeASTReferences where
import Control.Reference ((&))
import Language.Haskell.TH
import Language.Haskell.Tools.AST.Ann (Ann, element)
-- | Change the generated references to have the context of an annotated element.
-- Modifies the types according to the changes. This trasformation makes all
-- generated references monomorphic.
toASTReferences :: Q [Dec] -> Q [Dec]
toASTReferences = fmap (map $ \case
SigD name (ForallT vars ctx (refType `AppT` (ctxOrig `AppT` dom `AppT` stage)
`AppT` _
`AppT` fldOrig
`AppT` _))
-> SigD name (ForallT vars ctx (refType `AppT` (ConT ''Ann `AppT` ctxOrig `AppT` dom `AppT` stage)
`AppT` (ConT ''Ann `AppT` ctxOrig `AppT` dom `AppT` stage)
`AppT` fldOrig
`AppT` fldOrig))
ValD pat (NormalB e) locs -> ValD pat (NormalB (InfixE (Just (VarE 'element)) (VarE '(&)) (Just e))) locs
d -> d)