{-| Module : MetaHS.Extensions.LOC Description : The MetaHS EDSL LOC aggregation Copyright : Copyright (C) 2017-2019 H.H.R.F. Vos, S. Kamps License : -- This file is distributed under the terms of the Apache License 2.0. For more information, see the file "LICENSE", which is included in the distribution. Stability : experimental Metamodel Elements that are interesting (those that occupy distinct line numbers) are : ModuleHead, ModuleImport, TypeSynonym, DataType, Function, TypeSignature, TypeClass and Instance. All other Elements that are part of the _contains relations are ignored. LOC - Sum of all non-empty, non-comment lines in a module. -} module MetaHS.Extensions.LOC ( keyLoc , locAggregator ) where import qualified Data.Set as Set import MetaHS.DataModel.MetaModel import MetaHS.EDSL.MetaModel -- | MetaModel key used for the LOC relation. keyLoc :: RelationKey keyLoc = "LOC" calcLoc :: MetaModel-- ^ The meta-model. -> Element -- ^ Module -> Int -- ^ The calculated LCOM metric value. calcLoc mm mod = sum ls where ls = [extractLines x | x <- es] es = [elementSource mm mc | mc <- moduleContains mm mod, isInteresting mc] extractLines :: Maybe Element -> Int extractLines jl = case jl of Just Location {locationStartLine = ls, locationEndLine = le} -> (le - ls) + 1 Nothing -> 0 -- | LOC aggregator that adds the LOC metric relation to the supplied meta-model. locAggregator :: MetaModel-- ^ The supplied meta-model. -> MetaModel-- ^ The complemented meta-model. locAggregator mm = setRelation keyLoc r mm where r = foldr f Set.empty $ filter (\x -> x /= Module {name = "?"}) $ getModules mm f mod = Set.insert (mod, lv mod) lv m = IntValue $ calcLoc mm m -- | The Elements for which the loc is measured. isInteresting :: Element -> Bool isInteresting ModuleHead {} = True isInteresting ModuleImport{} = True isInteresting TypeSynonym{} = True isInteresting DataType{} = True isInteresting Function{} = True isInteresting TypeSignature{} = True isInteresting TypeClass{} = True isInteresting Instance{} = True isInteresting Pragma{} = True isInteresting _ = False