module ScopeNamesBaseStruct where
import ScopeNames
import DefinedNames
import DefinedNamesBaseStruct()
import FreeNames
import BaseSyntax
import MUtils
import EnvM
instance ScopeNames i e ds1 ds2
=> ScopeNames i e (HsModuleI m i ds1) (HsModuleI m (i,e) ds2) where
scopeNames ext (HsModule s m e i ds) = HsModule s m # sc e <# sc i <# sc ds
where sc x = scopeNames ext x
instance ScopeNames i e (HsExportSpecI m i) (HsExportSpecI m (i,e)) where
scopeNames = scopeSpec
instance ScopeNames i e (HsImportSpecI i) (HsImportSpecI (i,e)) where
scopeNames = scopeSpec
instance ScopeNames i e (HsImportDeclI m i) (HsImportDeclI m (i,e)) where
scopeNames = scopeSpec -- uses the wrong environment!!!
scopeSpec ext spec = do env <- getEnv ; return (fmap (\i->(i,env)) spec)
pairEnv x = (,) x # getEnv
instance (Eq i,
ScopeNames i e e1 e2,
ScopeNames i e p1 p2,DefinedNames i p1,
ScopeNames i e ds1 ds2,DefinedNames i ds1,
ScopeNames i e t1 t2,FreeNames i t1,
ScopeNames i e c1 c2,FreeNames i c1)
=> ScopeNames i e (EI i e1 p1 ds1 t1 c1)
(EI (i,e) e2 p2 ds2 t2 c2) where
scopeNames ext e =
case e of
HsLambda ps e -> ex ps (HsLambda # sc ps <# sc e)
HsLet ds e -> ex ds (HsLet # sc ds <# sc e)
HsCase e alts -> HsCase # sc e <# sc alts
HsDo stmts -> HsDo # sc stmts
HsListComp stmts -> HsListComp # sc stmts
HsExpTypeSig s e c t -> HsExpTypeSig s # sc e <# ex (sc c) <# ex (sc t)
where ex = exttvar ext (c,t)
_ -> seqEI . mapEI pairEnv sc sc sc sc sc $ e
where
sc x = scopeNames ext x
ex b = extdef ext b
extdef ext b = inModEnv . ext $ definedNames b
exttvar ext b = inModEnv . ext $ freeTyvars b
exttvs ext = inModEnv . ext . map (typedTvar . HsVar)
instance (ScopeNames i e e1 e2,
ScopeNames i e p1 p2,DefinedNames i p1,
ScopeNames i e ds1 ds2,DefinedNames i ds1)
=> ScopeNames i e (HsStmt e1 p1 ds1) (HsStmt e2 p2 ds2) where
scopeNames ext stmt =
case stmt of
HsGenerator s p e stmt -> HsGenerator s # ex p (sc p) <# sc e <# ex p (sc stmt)
HsQualifier e stmt -> HsQualifier # sc e <# sc stmt
HsLetStmt ds stmt -> ex ds $ HsLetStmt # sc ds <# sc stmt
HsLast e -> HsLast # sc e
where
sc x = scopeNames ext x
ex b = extdef ext b
instance (ScopeNames i e e1 e2,
ScopeNames i e p1 p2,DefinedNames i p1,
ScopeNames i e ds1 ds2,DefinedNames i ds1)
=> ScopeNames i e (HsAlt e1 p1 ds1) (HsAlt e2 p2 ds2) where
scopeNames ext (HsAlt s p rhs ds) =
HsAlt s # ex p (scopeNames ext p) <# r rhs <# r ds
where
r x = ex (p,ds) (sc x)
sc x = scopeNames ext x
ex b = extdef ext b
instance (ScopeNames i e e1 e2,
ScopeNames i e p1 p2,DefinedNames i p1,
ScopeNames i e ds1 ds2,DefinedNames i ds1)
=> ScopeNames i e (HsMatchI i e1 p1 ds1) (HsMatchI (i,e) e2 p2 ds2) where
scopeNames ext (HsMatch s i ps rhs ds) =
HsMatch s # pairEnv i <# ex ps (scopeNames ext ps) <# r rhs <# r ds
where
r x = ex (ps,ds) (sc x)
sc x = scopeNames ext x
ex b = extdef ext b
instance ScopeNames i e e1 e2 => ScopeNames i e (HsRhs e1) (HsRhs e2) where
scopeNames ext = seqRhs . mapRhs (scopeNames ext)
instance ScopeNames i e p1 p2
=> ScopeNames i e (PI i p1) (PI (i,e) p2) where
scopeNames ext = seqPI . mapPI pairEnv (scopeNames ext)
instance (Eq i,
ScopeNames i e e1 e2,
ScopeNames i e p1 p2,DefinedNames i p1,
ScopeNames i e ds1 ds2,DefinedNames i ds1,
ScopeNames i e t1 t2,FreeNames i t1,
ScopeNames i e c1 c2,FreeNames i c1,
ScopeNames i e tp1 tp2,FreeNames i tp1)
=> ScopeNames i e (DI i e1 p1 ds1 t1 c1 tp1)
(DI (i,e) e2 p2 ds2 t2 c2 tp2) where
scopeNames ext d =
case d of
HsTypeDecl s tps t -> st tps
HsNewTypeDecl s ctx tps cd drv ->
HsNewTypeDecl s # mr ctx <# mr tps <# mr cd <# mapM pairEnv drv
where mr x = exttvar ext tps $ m x
HsDataDecl s ctx tps cds drv ->
HsDataDecl s # mr ctx <# mr tps <# mr cds <# mapM pairEnv drv
where mr x = exttvar ext tps $ m x
HsClassDecl s c tp fdeps ds -> st tp -- hmm, fdeps
-- !! ^^ Hmm, typevars in type sigs ds
HsInstDecl s optn c tp ds -> st (c,tp)
HsTypeSig s nms c tp -> st (c,tp)
HsFunBind s ms -> HsFunBind s # mapM m ms
HsPatBind s p rhs ds -> HsPatBind s # m p <# mr rhs <# mr ds
where mr x = extdef ext ds $ m x
-- ^^ not (p,ds)
-- The variables in p are added to the environment before
-- entering the declaration group this binding is part of,
-- and should not be added again.
HsPrimitiveTypeDecl s ctx tp -> st tp
HsPrimitiveBind s nm tp -> st tp
_ -> scAll
where
st tp = exttvar ext tp scAll
scAll = seqDI $ mapDI pairEnv m m m m m m d
m x = scopeNames ext x
instance (ScopeNames i e t1 t2,ScopeNames i e c1 c2)
=> ScopeNames i e (HsConDeclI i t1 c1) (HsConDeclI (i,e) t2 c2) where
scopeNames ext d =
case d of
HsConDecl s vs ectx c args -> st vs
HsRecDecl s vs ectx c fields -> st vs
where
st vs = exttvs ext vs scAll
scAll = seqConDecl $ mapConDeclI pairEnv m m d
m x = scopeNames ext x
instance ScopeNames i e t1 t2
=> ScopeNames i e (TI i t1) (TI (i,e) t2) where
scopeNames ext t =
case t of
HsTyForall vs ps t' -> exttvs ext vs scAll
_ -> scAll
where
scAll = seqTI $ mapTI pairEnv m t
m x = scopeNames ext x
freeTyvars tp = [typedTvar i|(i@(HsVar _),_)<-freeNames tp]
typedTvar i = (i,Type blankTypeInfo)