HaRe-0.6: tools/base/AST/HsDeclUtil.hs
module HsDeclUtil where
import HsDeclStruct
import HsDeclMaps
--import MUtils
--import HsGuardsMaps
import SrcLoc1
import SrcLocPretty
import PrettyPrint(pp)
-- Finds all of the free variables in a D structure.
freeVarsD fvd fve d =
accD (++) (++) (++) (++) (++) (++)
(mapDI id fve (const [])
(concatMap fvd)
(const [])
(const [])
(const [])
d)
[]
-- Rewrite expressions inside declarations given fixity information.
rewriteD rwe env d = mapDI id (rwe env) id id id id id d
-- New version: rewrite expressions and patterns,
-- and also recurse into nested declarations.
rewriteAllD rwe rwp rwds = mapDI id rwe rwp rwds id id id
fixitiesD ds =[(n,fixity) | HsInfixDecl _ fixity ns<-ds, n<-ns]
instance HasSrcLoc (DI i e p ds t c tp) where
srcLoc d =
case d of
HsTypeDecl s tps t -> s
HsNewTypeDecl s cntxt tps cd names -> s
HsDataDecl s cntxt tps cds names -> s
HsClassDecl s c tp fd ds -> s
HsInstDecl s optn c tp ds -> s
HsDefaultDecl s t -> s
HsTypeSig s nms c tp -> s
HsFunBind s matches -> s
HsPatBind s p rhs ds -> s
HsInfixDecl s fixity names -> s
HsPrimitiveBind s nm t -> s
HsPrimitiveTypeDecl s cntxt nm -> s
instance HasSrcLoc (HsMatchI i e p ds) where
srcLoc (HsMatch s _ _ _ _) = s
unbang bt = accBangType const bt ()
conargcnt con =
case con of
HsConDecl s _ _ c args -> length args
HsRecDecl s _ _ c fields -> sum (map (length.fst) fields)
conctx con =
case con of
HsConDecl s _ ctx c args -> ctx
HsRecDecl s _ ctx c fields -> ctx
instance HasSrcLoc (HsConDeclI i t c) where
srcLoc con =
case con of
HsConDecl s _ _ c argrs -> s
HsRecDecl s _ _ c fields -> s
chkNewtype con =
if conargcnt con==1
then if null (conctx con)
then return ()
else fail $ pp (srcLoc con)++
": existential newtype constructors can't have a context"
else fail $ pp (srcLoc con)++
": a newtype constructor must have exactly one argument"