module Pfe3Metrics where import Maybe(mapMaybe) import PFE0(allModules,pput) import PFE3(parseModule) import HsDeclStruct(DI(..)) import HsModule(hsModDecls) import DefinedNames(definedType) import HasBaseStruct(basestruct) import Statistics import PfeParse import MUtils pfe3MetricsCmds = [("classmetrics", (noArgs classMetrics,"number of instances per class metrics"))] classMetrics = do ms <- allModules (classes,insts) <- apBoth concat . unzip # mapM getClassInstDecls ms let cinstcnt = [(c,length [()|i<-insts,i==c])|c<-classes] pput (ppStatistics "number of instances" "class" cinstcnt) getClassInstDecls m = cls_insts . hsModDecls . snd # parseModule m cls_insts ds = (mapMaybe className ds,concatMap instClass ds) className d = case basestruct d of Just (HsClassDecl _ _ tp _ _) -> Just (definedType tp) _ -> Nothing instClass d = case basestruct d of Just (HsInstDecl _ _ _ tp _) -> [definedType tp] Just (HsDataDecl _ _ _ _ cls) -> cls Just (HsNewTypeDecl _ _ _ _ cls) -> cls _ -> []