module DefinedNames(module DefinedNames,module TypedIds) where
import TypedIds
import HsIdent
--import Maybe(mapMaybe)
import Recursive
This modules defines 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.
type TypedIdent i = (HsIdentI i,IdTy i) class DefinedNames i def | def->i where definedNames :: def -> [TypedIdent i] class ClassMethods i def | def->i where classMethods :: i -> Int -> def -> [TypedIdent i] class ContextSize c where contextSize :: c -> Int
Some declarations have no explicit name in the concrete syntax, but can be assigned an automatically generated name.
class AddName i d | d->i where addName :: d -> d; addName=id
Default methods are part of class declarations in the Haskell syntax, but after type checking we treat them as separate top-level entities with their own names, so we need to be able to change their names...
class MapDefinedNames i def | def->i where mapDefinedNames :: (i->i) -> def->def
Instances for collecting defined names from lists and pairs of things:
instance DefinedNames i d => DefinedNames i [d] where
definedNames = concatMap definedNames
instance ClassMethods i d => ClassMethods i [d] where
classMethods c cnt = concatMap (classMethods c cnt)
instance AddName i d => AddName i [d] where
addName = map addName
instance MapDefinedNames i d => MapDefinedNames i [d] where
mapDefinedNames = map . mapDefinedNames
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
Auxiliary functions for extracting particular kinds of names:
definedVars ds = filter isHsVar . definedValues $ ds -- hmm
definedValues' ds = filter (isValue.snd) . definedNames $ ds
definedValues ds = map fst . definedValues' $ ds
definedType tp = c where [(HsCon c,_)] = definedNames tp
Auxiliary functions to simplify the definition of instances of DefinedNames:
definedNamesRec x = definedNames (struct x) classMethodsRec i cnt = classMethods i cnt . struct mapDefinedNamesRec f = mapRec (mapDefinedNames f) addNameRec x = mapRec addName x value qn = (HsVar qn,Value) -- con t defty cs n = (HsCon n,ConstrOf t defty cs) con t defty n = (HsCon n,ConstrOf t defty) field t tyinfo n = (HsVar n,FieldOf t tyinfo) method c cnt ms n = (HsVar n,MethodOf c cnt ms) -- tcon n defty cs fs = (HsCon n,Type defty cs fs) tcon n tyinfo = (HsCon n, Type tyinfo) classname c cnt methods = (HsCon c, Class cnt methods)