metrics: factorize `mainmodule` and `model_view` for all MModule metrics
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 4 Jul 2016 22:01:26 +0000 (18:01 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Wed, 20 Jul 2016 15:58:10 +0000 (11:58 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/metrics/inheritance_metrics.nit
src/metrics/mendel_metrics.nit
src/metrics/mmodules_metrics.nit
src/metrics/nullables_metrics.nit
src/metrics/rta_metrics.nit

index 9bd6b16..b00a40b 100644 (file)
@@ -43,12 +43,12 @@ private class InheritanceMetricsPhase
                print toolcontext.format_h1("\n# Inheritance metrics")
 
                var hmetrics = new MetricSet
-               hmetrics.register(new MDUI(mainmodule))
-               hmetrics.register(new MDUIC(mainmodule))
-               hmetrics.register(new MDUII(mainmodule))
-               hmetrics.register(new MIF(mainmodule))
-               hmetrics.register(new MIFC(mainmodule))
-               hmetrics.register(new MIFI(mainmodule))
+               hmetrics.register(new MDUI(mainmodule, model_view))
+               hmetrics.register(new MDUIC(mainmodule, model_view))
+               hmetrics.register(new MDUII(mainmodule, model_view))
+               hmetrics.register(new MIF(mainmodule, model_view))
+               hmetrics.register(new MIFC(mainmodule, model_view))
+               hmetrics.register(new MIFI(mainmodule, model_view))
 
                var cmetrics = new MetricSet
                cmetrics.register(new CNOAC(mainmodule, model_view))
@@ -112,9 +112,6 @@ class MDUI
        redef fun name do return "mdui"
        redef fun desc do return "proportion of mclass defined using inheritance (has other parent than Object)"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        var count = 0
@@ -139,9 +136,6 @@ class MDUIC
        redef fun name do return "mduic"
        redef fun desc do return "proportion of class_kind defined using inheritance"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        var count = 0
@@ -170,9 +164,6 @@ class MDUII
        redef fun name do return "mduii"
        redef fun desc do return "proportion of interface_kind defined using inheritance"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        var count = 0
@@ -201,9 +192,6 @@ class MIF
        redef fun name do return "mif"
        redef fun desc do return "proportion of mclass inherited from"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        var count = 0
@@ -228,9 +216,6 @@ class MIFC
        redef fun name do return "mifc"
        redef fun desc do return "proportion of class_kind inherited from"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        var count = 0
@@ -259,9 +244,6 @@ class MIFI
        redef fun name do return "mifi"
        redef fun desc do return "proportion of interface_kind inherited from"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        var count = 0
@@ -539,4 +521,3 @@ redef class MClass
                return min
        end
 end
-
index a6f3518..1eb4e5b 100644 (file)
@@ -156,8 +156,8 @@ class MBMS
 
        redef fun collect(mmodules) do
                for mmodule in mmodules do
-                       var totc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
-                       totc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+                       var totc = mmodule.collect_intro_mclassdefs(model_view).length
+                       totc += mmodule.collect_redef_mclassdefs(model_view).length
                        var ditc = mmodule.in_importation.depth
                        values[mmodule] = totc.to_f / (ditc + 1).to_f
                end
@@ -199,7 +199,7 @@ class MNVI
        redef fun desc do return "module novelty index, contribution of the module to its branch in term of introductions"
 
        redef fun collect(mmodules) do
-               var mbms = new MBMS
+               var mbms = new MBMS(mainmodule, model_view)
                for mmodule in mmodules do
                        # compute branch mean size
                        var parents = mmodule.in_importation.direct_greaters
@@ -207,8 +207,8 @@ class MNVI
                                mbms.clear
                                mbms.collect(new HashSet[MModule].from(parents))
                                # compute module novelty index
-                               var locc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
-                               locc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+                               var locc = mmodule.collect_intro_mclassdefs(model_view).length
+                               locc += mmodule.collect_redef_mclassdefs(model_view).length
                                values[mmodule] = locc.to_f / mbms.avg
                        else
                                values[mmodule] = 0.0
@@ -244,11 +244,11 @@ class MNVS
        redef fun desc do return "module novelty score, importance of the contribution of the module to its branch"
 
        redef fun collect(mmodules) do
-               var mnvi = new MNVI
+               var mnvi = new MNVI(mainmodule, model_view)
                mnvi.collect(mmodules)
                for mmodule in mmodules do
-                       var locc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
-                       locc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+                       var locc = mmodule.collect_intro_mclassdefs(model_view).length
+                       locc += mmodule.collect_redef_mclassdefs(model_view).length
                        values[mmodule] = mnvi.values[mmodule] * locc.to_f
                end
        end
index dc944d8..3f65954 100644 (file)
 module mmodules_metrics
 
 import metrics_base
+import model::model_collect
 
 redef class ToolContext
+
+       # MModules related metrics phase
        var mmodules_metrics_phase: Phase = new MModulesMetricsPhase(self, null)
 end
 
@@ -33,13 +36,23 @@ private class MModulesMetricsPhase
                var out = "{toolcontext.opt_dir.value or else "metrics"}/mmodules"
                out.mkdir
 
+               var model = toolcontext.modelbuilder.model
+               var model_view = model.private_view
+
                print toolcontext.format_h1("\n# MModules metrics")
 
                var metrics = new MetricSet
-               metrics.register(new MNOA, new MNOP, new MNOC, new MNOD, new MDIT)
-               metrics.register(new MNBI, new MNBR, new MNBCC, new MNBAC, new MNBIC)
+               metrics.register(new MNOA(mainmodule, model_view))
+               metrics.register(new MNOP(mainmodule, model_view))
+               metrics.register(new MNOC(mainmodule, model_view))
+               metrics.register(new MNOD(mainmodule, model_view))
+               metrics.register(new MDIT(mainmodule, model_view))
+               metrics.register(new MNBI(mainmodule, model_view))
+               metrics.register(new MNBR(mainmodule, model_view))
+               metrics.register(new MNBCC(mainmodule, model_view))
+               metrics.register(new MNBAC(mainmodule, model_view))
+               metrics.register(new MNBIC(mainmodule, model_view))
 
-               var model = toolcontext.modelbuilder.model
                var mmodules = new HashSet[MModule]
                for mpackage in model.mpackages do
 
@@ -68,9 +81,15 @@ private class MModulesMetricsPhase
 end
 
 # A metric about MModule
-interface MModuleMetric
+abstract class MModuleMetric
        super Metric
        redef type ELM: MModule
+
+       # Main module used for linearization
+       var mainmodule: MModule
+
+       # Model view used to collect and filter entities
+       var model_view: ModelView
 end
 
 # Module Metric: Number of Ancestors
@@ -250,5 +269,3 @@ class MNBEC
                end
        end
 end
-
-
index abd8180..f88c3ba 100644 (file)
@@ -22,6 +22,8 @@ import mclasses_metrics
 import semantize
 
 redef class ToolContext
+
+       # Nullable types related metrics
        var nullables_metrics_phase: Phase = new NullablesMetricsPhase(self, null)
 end
 
@@ -84,14 +86,6 @@ class CNBNA
        redef fun name do return "cnbna"
        redef fun desc do return "number of accessible nullable attributes (inherited + local)"
 
-       var mainmodule: MModule
-       var model_view: ModelView
-
-       init(mainmodule: MModule, model_view: ModelView) do
-               self.mainmodule = mainmodule
-               self.model_view = model_view
-       end
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var all = mclass.collect_accessible_mattributes(model_view)
@@ -114,7 +108,6 @@ end
 
 private class NullableSends
        super Visitor
-       var modelbuilder: ModelBuilder
        var nclassdef: AClassdef
 
        var total_sends: Int = 0
@@ -122,13 +115,6 @@ private class NullableSends
        var nullable_eq_sends: Int = 0
        var buggy_sends: Int = 0
 
-       # Get a new visitor on a classef to add type count in `typecount`.
-       init(modelbuilder: ModelBuilder, nclassdef: AClassdef)
-       do
-               self.modelbuilder = modelbuilder
-               self.nclassdef = nclassdef
-       end
-
        redef fun visit(n)
        do
                n.visit_all(self)
@@ -168,7 +154,7 @@ do
        # Visit all the source code to collect data
        for nmodule in modelbuilder.nmodules do
                for nclassdef in nmodule.n_classdefs do
-                       var visitor = new NullableSends(modelbuilder, nclassdef)
+                       var visitor = new NullableSends(nclassdef)
                        visitor.enter_visit(nclassdef)
                        total_sends += visitor.total_sends
                        nullable_sends += visitor.nullable_sends
index d68860b..a4c3e28 100644 (file)
@@ -23,6 +23,8 @@ import mmodules_metrics
 import mclasses_metrics
 
 redef class ToolContext
+
+       # RTA related metrics phase
        var rta_metrics_phase: Phase = new RTAMetricsPhase(self, null)
 end
 
@@ -35,17 +37,20 @@ private class RTAMetricsPhase
                var out = "{toolcontext.opt_dir.value or else "metrics"}/rta"
                out.mkdir
 
+               var model = toolcontext.modelbuilder.model
+               var model_view = model.protected_view
+
                print toolcontext.format_h1("\n# RTA metrics")
 
                print toolcontext.format_h2("\n ## Live instances by mainmodules")
                var mmetrics = new MetricSet
-               mmetrics.register(new MNLC(toolcontext.modelbuilder))
-               mmetrics.register(new MNLT(toolcontext.modelbuilder))
-               mmetrics.register(new MNCT(toolcontext.modelbuilder))
-               mmetrics.register(new MNLI(toolcontext.modelbuilder))
-               mmetrics.register(new MNLM(toolcontext.modelbuilder))
-               mmetrics.register(new MNLMD(toolcontext.modelbuilder))
-               mmetrics.register(new MNLDD(toolcontext.modelbuilder))
+               mmetrics.register(new MNLC(mainmodule, model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNLT(mainmodule, model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNCT(mainmodule, model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNLI(mainmodule, model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNLM(mainmodule, model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNLMD(mainmodule, model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNLDD(mainmodule, model_view, toolcontext.modelbuilder))
                mmetrics.collect(new HashSet[MModule].from([mainmodule]))
                mmetrics.to_console(1, not toolcontext.opt_nocolors.value)
                if csv then mmetrics.to_csv.write_to_file("{out}/{mainmodule}.csv")
@@ -116,15 +121,21 @@ end
 
 # Summary metrics
 
+# RTA related metric that needs a `modelbuilder`
+class RTAMetric
+       super MModuleMetric
+
+       # Modelbuilder used to access AST
+       var modelbuilder: ModelBuilder
+end
+
 # MModule Metric: Number of Live Types
 class MNLI
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnli"
        redef fun desc do return "number of live instances in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
 
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
@@ -137,14 +148,11 @@ end
 
 # MModule Metric: Number of Live Types
 class MNLT
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnlt"
        redef fun desc do return "number of live mtypes in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
@@ -156,14 +164,11 @@ end
 
 # MModule Metric: Number of Live Cast Types
 class MNCT
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnct"
        redef fun desc do return "number of live cast mtypes in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
@@ -175,14 +180,11 @@ end
 
 # MModule Metric: Number of Live Classes
 class MNLC
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnlc"
        redef fun desc do return "number of live mclasses in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var live = new HashSet[MClass]
@@ -198,14 +200,11 @@ end
 
 # MModule Metric: Number of Live Methods
 class MNLM
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnlm"
        redef fun desc do return "number of live methods in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
@@ -217,14 +216,11 @@ end
 
 # MModule Metric: Number of Live MethodDefs
 class MNLMD
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnlmd"
        redef fun desc do return "number of live method definitions in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
@@ -236,14 +232,11 @@ end
 
 # MModule Metric: Number of Dead MethodDefs
 class MNLDD
-       super MModuleMetric
+       super RTAMetric
        super IntMetric
        redef fun name do return "mnldd"
        redef fun desc do return "number of dead method definitions in a mmodule"
 
-       var modelbuilder: ModelBuilder
-       init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var dead = 0