module FreeNamesBaseStruct where import FreeNames import DefinedNames(DefinedNames) import BaseSyntax import Lists((\\\)) import List(nub) import TypedIds --import AccList(accList) import HsName -- modules (computes names that need to be imported) instance FreeNames i ds => FreeNames i (HsModuleI m i ds) where freeNames = freeNames . hsModDecls {-+ For patterns, #freeNames# should return the identifiers that appear in the pattern, but are not bound by the pattern, i.e., constructors and field labels. -} instance FreeNames i p => FreeNames i (PI i p) where freeNames p = case p of HsPRec i fs -> con i : freeNames fs _ -> accPI2 (const id) ((:).con) ((++).freeNames) p [] -- freeNotDef p = freeNames p \\\ defs p -- record fields instance FreeNames i p => FreeNames i (HsFieldI i p) where freeNames (HsField f p) = field f:freeNames p -- rhss instance FreeNames i e => FreeNames i (HsRhs e) where freeNames x = accRhs (++) (mapRhs freeNames x) [] -- alts instance (FreeNames i e, FreeNames i p, FreeNames i ds, DefinedNames i ds, DefinedNames i p) => FreeNames i (HsAlt e p ds) where freeNames (HsAlt _ p rhs ds) = freeNames p ++ (freeNames (rhs,ds) \\\ defs (ds,p)) -- stmts instance ( FreeNames i e, FreeNames i p, FreeNames i ds , DefinedNames i p, DefinedNames i ds ) => FreeNames i (HsStmt e p ds) where freeNames stmt = case stmt of HsGenerator _ p e stmt -> freeNames (p,e) ++ (freeNames stmt \\\ defs p) HsQualifier e stmt -> freeNames (e,stmt) HsLetStmt ds stmt -> freeNames (stmt,ds) \\\ defs ds HsLast e -> freeNames e -- Since this is not a strictly accumulating function, there are many cases -- in which accE can not be used... -- exps instance ( FreeNames i e, FreeNames i p, FreeNames i ds , FreeNames i t, FreeNames i c , DefinedNames i p, DefinedNames i ds ) => FreeNames i (EI i e p ds t c) where freeNames e = case e of HsLambda ps e -> freeNames ps ++ (freeNames e \\\ defs ps) HsLet ds e -> freeNames (e,ds) \\\ defs ds HsId n -> [val n] HsInfixApp x op z -> val op : freeNames (x,z) HsCase e alts -> freeNames (e,alts) HsDo stmts -> freeNames stmts HsLeftSection x op -> val op : freeNames x HsRightSection op y -> val op : freeNames y HsListComp stmts -> freeNames stmts HsRecConstr s n fs -> con n : freeNames fs HsRecUpdate s e fs -> freeNames (e,fs) _ -> accEI bug descend bug bug descend descend e [] where descend s = ((++).freeNames) s bug = error "freeNames at E ...: should have been handled" -- matches instance ( FreeNames i e, FreeNames i p, FreeNames i ds , DefinedNames i ds, DefinedNames i p ) => FreeNames i (HsMatchI i e p ds) where freeNames (HsMatch _ n ps rhs ds) = freeNames ps ++ ((freeNames (rhs,ds) \\\ defs ps) \\\ (val (HsVar n) : defs ds)) -- decls instance ( FreeNames i e, FreeNames i p, FreeNames i ds, FreeNames i t , FreeNames i c, FreeNames i tp , DefinedNames i p, DefinedNames i ds ) => FreeNames i (DI i e p ds t c tp) where freeNames d = case d of HsTypeDecl s tps t -> freeNames t \\\ freeNames tps HsNewTypeDecl s ctx tps cd drv -> dataNames ctx tps [cd] drv HsDataDecl s ctx tps cds drv -> dataNames ctx tps cds drv HsClassDecl s c tp fdeps ds -> freeNames (c,ds) \\\ freeNames tp -- hmm HsInstDecl s optn c tp ds -> freeNames ((c,tp),ds) \\\ freeVars tp -- hmm HsDefaultDecl s t -> freeNames t HsTypeSig s nms c tp -> freeCons (c,tp) HsFunBind s matches -> freeNames matches HsPatBind s p rhs ds -> freeNames p ++ (freeNames (rhs,ds) \\\ defs (p,ds)) HsInfixDecl s fixity names -> [] -- HsPrimitiveTypeDecl s cntxt nm -> -- HsPrimitiveBind s nm t -> -- TODO _ -> [] where dataNames ctx tps cds drv = nub (map tcon drv++freeNames (ctx,cds)) \\\ freeNames tps instance (FreeNames i t,FreeNames i c) => FreeNames i (HsConDeclI i t c) where freeNames cd = case cd of HsConDecl s is c n args -> freeNames (c,args) \\\ map tvar is HsRecDecl s is c n fields -> freeNames (c,map snd fields) \\\ map tvar is instance FreeNames i t => FreeNames i (HsBangType t) where freeNames = freeNames . unbang instance FreeNames i t => FreeNames i (TI i t) where freeNames t = case t of HsTyVar v -> [tvar v] HsTyCon v -> [tcon v] HsTyForall xs ps t -> freeNames (ps,t) \\\ map tvar xs _ -> crushT freeNames t -- utils --------------------------------------- field = var -- hmm!!