module DefinedNames(module DefinedNames,module TypedIds) where import TypedIds import HsIdent import Maybe(mapMaybe) import Recursive
A class for extensible extraction of names defined by declaration(s).
Since the abstract syntax uses the same type for top level declarations
and the body of class definitions, we need a separate function to extract
the methods of a class.
It might be more elegant to define separate classes
for declarations, class bodies, type patterns and patterns...
type TypedIdent i = (HsIdentI i,IdTy i)
class DefinedNames i def | def->i where
definedNames :: def -> [TypedIdent i]
classMethods :: i -> def -> [TypedIdent i]
instance DefinedNames i d => DefinedNames i [d] where
definedNames = concatMap definedNames
classMethods c = concatMap (classMethods c)
instance (DefinedNames i a, DefinedNames i b) => DefinedNames i (a,b) where
definedNames (x,y) = definedNames x ++ definedNames y
classMethods c (x,y) = classMethods c x ++ classMethods c y
definedVars ds =
mapMaybe (hsVarName.fst) . filter (isValue.snd) . definedNames $ ds -- hmm
definedNamesRec x = definedNames (struct x)
classMethodsRec i = classMethods i . struct