DefinedNames.hs

Plain Haskell source file: DefinedNames.hs

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

Index