HaRe-0.6: tools/base/defs/DefinedNamesBaseStruct.hs
{-+
Instances for extracting defined names from the nonrecursive
base language structures.
-}
module DefinedNamesBaseStruct where
import BaseSyntax
import DefinedNames
import HsIdent (getHSName)
instance DefinedNames i ds => DefinedNames i (HsModuleI m i' ds) where
definedNames = definedNames . hsModDecls -- hmm
instance ClassMethods i (DI i e p ds t c tp) where
classMethods cname cnt d =
case d of
(HsTypeSig s nms _ _) -> map (method cname cnt nms) nms
_ -> []
instance AddName i (DI i e p ds t c tp)
instance (DefinedNames i tp, ClassMethods i ds, ContextSize c, DefinedNames i p)
=> DefinedNames i (DI i e p ds t c tp) where
definedNames d =
case d of
HsTypeDecl s tp t -> dataNames tp Synonym []
HsNewTypeDecl s ctx tp cd drv -> dataNames tp Newtype [cd]
HsDataDecl s ctx tp cds drv -> dataNames tp Data cds
HsClassDecl s c tp fd ds -> classNames tp c ds
HsInstDecl s optn c tp ds -> [] -- !!
HsDefaultDecl s t -> []
HsTypeSig s nms c t -> []
HsFunBind s (match:_) -> [matchName match]
HsPatBind s p rhs ds -> definedNames p
HsInfixDecl s fixity names -> []
--HsPrimitiveTypeDecl s ctx tp -> definedNames tp
HsPrimitiveTypeDecl s ctx tp -> dataNames tp Primitive []
HsPrimitiveBind s nm tp -> [value nm]
_ -> []
where
dataNames tp defty cds = tcon t tyinfo:cons++fields
where
tyinfo = TypeInfo
{ defType = Just defty
, constructors = cs
, fields = fs
}
cons = map (con t tyinfo . conName) cs
fields = map (field t tyinfo) fs
cs = map conNameArity cds
fs = concatMap fieldNames cds
t = definedType tp
conNameArity c =
case c of
HsConDecl s _ _ n args -> ConInfo {conName=n,
conArity=length args,
conFields=Nothing}
HsRecDecl s _ _ n fields -> ConInfo {conName=n,
conArity=length fs,
conFields=Just fs}
where fs = concatMap fst fields
fieldNames c =
case c of
HsConDecl s _ _ n types -> []
HsRecDecl s _ _ n fields -> concatMap fst fields
classNames tp ctx ds =
classname c n (map (getHSName . fst) methods) : methods
where
n = contextSize ctx -- number of superclasses
methods = classMethods c n ds
c = definedType tp
matchName (HsMatch s n _ _ _) = value n
-- Limited to function/pattern bindings. It is used to rename default methods...
instance MapDefinedNames i p => MapDefinedNames i (DI i e p ds t c tp) where
mapDefinedNames f d =
case d of
HsPatBind s p rhs ds -> HsPatBind s (m p) rhs ds
_ -> mapDI2 f id id id id id id id d
where m x = mapDefinedNames f x
-- Meaningful for type patterns (types on the lhs in definitions) only:
instance DefinedNames i tp => DefinedNames i (TI i tp) where
-- no need to define classMethods
definedNames t =
case t of
HsTyApp f x -> definedNames f
HsTyCon nm -> [ tcon nm blankTypeInfo ]
_ -> [] -- hmm, report error?
{-+
For patterns, #definedNames# should return the identifiers that are bound by
the pattern, i.e., variables, but not constructors and field labels.
-}
instance DefinedNames i p => DefinedNames i (PI i p) where
-- no need to define classMethods
definedNames p =
case p of
HsPRec c fields -> definedNames fields -- (*)
_ -> accPI2 ((:).value) (const id) ((++).definedNames) p []
-- (*) This is treated specially, since accPI2 includes fnm in the result
instance DefinedNames i p => DefinedNames i (HsFieldI i p) where
definedNames (HsField f p) = definedNames p
instance MapDefinedNames i p => MapDefinedNames i (PI i p) where
mapDefinedNames f p =
case p of
HsPRec c fields -> HsPRec c (m fields)
_ -> mapPI2 f id m p
where m x = mapDefinedNames f x
instance MapDefinedNames i p => MapDefinedNames i (HsFieldI i p) where
mapDefinedNames f (HsField field p) = HsField field (mapDefinedNames f p)