metrics: factorize `mainmodule` and `model_view` attributes for all MClass metrics
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 4 Jul 2016 22:00:39 +0000 (18:00 -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/mclasses_metrics.nit
src/metrics/mendel_metrics.nit
src/metrics/rta_metrics.nit

index 7638758..9bd6b16 100644 (file)
@@ -22,6 +22,8 @@ import mmodules_metrics
 import mclasses_metrics
 
 redef class ToolContext
 import mclasses_metrics
 
 redef class ToolContext
+
+       # Inheritance related metrics phase
        var inheritance_metrics_phase: Phase = new InheritanceMetricsPhase(self, null)
 end
 
        var inheritance_metrics_phase: Phase = new InheritanceMetricsPhase(self, null)
 end
 
@@ -35,6 +37,9 @@ private class InheritanceMetricsPhase
                var out = "{toolcontext.opt_dir.value or else "metrics"}/inheritance"
                out.mkdir
 
                var out = "{toolcontext.opt_dir.value or else "metrics"}/inheritance"
                out.mkdir
 
+               var model = toolcontext.modelbuilder.model
+               var model_view = model.private_view
+
                print toolcontext.format_h1("\n# Inheritance metrics")
 
                var hmetrics = new MetricSet
                print toolcontext.format_h1("\n# Inheritance metrics")
 
                var hmetrics = new MetricSet
@@ -46,17 +51,16 @@ private class InheritanceMetricsPhase
                hmetrics.register(new MIFI(mainmodule))
 
                var cmetrics = new MetricSet
                hmetrics.register(new MIFI(mainmodule))
 
                var cmetrics = new MetricSet
-               cmetrics.register(new CNOAC(mainmodule))
-               cmetrics.register(new CNOPC(mainmodule))
-               cmetrics.register(new CNOCC(mainmodule))
-               cmetrics.register(new CNODC(mainmodule))
-               cmetrics.register(new CNOPI(mainmodule))
-               cmetrics.register(new CNOCI(mainmodule))
-               cmetrics.register(new CNODI(mainmodule))
-               cmetrics.register(new CDITC(mainmodule))
-               cmetrics.register(new CDITI(mainmodule))
+               cmetrics.register(new CNOAC(mainmodule, model_view))
+               cmetrics.register(new CNOPC(mainmodule, model_view))
+               cmetrics.register(new CNOCC(mainmodule, model_view))
+               cmetrics.register(new CNODC(mainmodule, model_view))
+               cmetrics.register(new CNOPI(mainmodule, model_view))
+               cmetrics.register(new CNOCI(mainmodule, model_view))
+               cmetrics.register(new CNODI(mainmodule, model_view))
+               cmetrics.register(new CDITC(mainmodule, model_view))
+               cmetrics.register(new CDITI(mainmodule, model_view))
 
 
-               var model = toolcontext.modelbuilder.model
                var mmodules = new HashSet[MModule]
                var mclasses = new HashSet[MClass]
                for mpackage in model.mpackages do
                var mmodules = new HashSet[MModule]
                var mclasses = new HashSet[MClass]
                for mpackage in model.mpackages do
@@ -286,9 +290,6 @@ class CNOAC
        redef fun name do return "cnoac"
        redef fun desc do return "number of class_kind ancestor"
 
        redef fun name do return "cnoac"
        redef fun desc do return "number of class_kind ancestor"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -312,9 +313,6 @@ class CNOPC
        redef fun name do return "cnopc"
        redef fun desc do return "number of class_kind parent"
 
        redef fun name do return "cnopc"
        redef fun desc do return "number of class_kind parent"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -338,9 +336,6 @@ class CNOCC
        redef fun name do return "cnocc"
        redef fun desc do return "number of class_kind children"
 
        redef fun name do return "cnocc"
        redef fun desc do return "number of class_kind children"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -364,9 +359,6 @@ class CNODC
        redef fun name do return "cnodc"
        redef fun desc do return "number of class_kind descendants"
 
        redef fun name do return "cnodc"
        redef fun desc do return "number of class_kind descendants"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -390,9 +382,6 @@ class CNOAI
        redef fun name do return "cnoai"
        redef fun desc do return "number of interface_kind ancestor"
 
        redef fun name do return "cnoai"
        redef fun desc do return "number of interface_kind ancestor"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -416,9 +405,6 @@ class CNOPI
        redef fun name do return "cnopi"
        redef fun desc do return "number of interface_kind parent"
 
        redef fun name do return "cnopi"
        redef fun desc do return "number of interface_kind parent"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -442,9 +428,6 @@ class CNOCI
        redef fun name do return "cnoci"
        redef fun desc do return "number of interface_kind children"
 
        redef fun name do return "cnoci"
        redef fun desc do return "number of interface_kind children"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -468,9 +451,6 @@ class CNODI
        redef fun name do return "cnodi"
        redef fun desc do return "number of interface_kind descendants"
 
        redef fun name do return "cnodi"
        redef fun desc do return "number of interface_kind descendants"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
@@ -494,9 +474,6 @@ class CDITC
        redef fun name do return "cditc"
        redef fun desc do return "depth in class tree following only class, abstract, extern kind"
 
        redef fun name do return "cditc"
        redef fun desc do return "depth in class tree following only class, abstract, extern kind"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.ditc(mainmodule)
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.ditc(mainmodule)
@@ -513,9 +490,6 @@ class CDITI
        redef fun name do return "cditi"
        redef fun desc do return "depth in class tree following only interface_kind"
 
        redef fun name do return "cditi"
        redef fun desc do return "depth in class tree following only interface_kind"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.diti(mainmodule)
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.diti(mainmodule)
@@ -526,7 +500,7 @@ end
 # model redef
 
 redef class MClass
 # model redef
 
 redef class MClass
-               
+
        # Class Depth in Inheritance Tree
        #
        # Following the longest path composed only of extends edges from self to Object
        # Class Depth in Inheritance Tree
        #
        # Following the longest path composed only of extends edges from self to Object
index 0951d10..3c99e67 100644 (file)
@@ -21,6 +21,8 @@ import metrics_base
 import model::model_collect
 
 redef class ToolContext
 import model::model_collect
 
 redef class ToolContext
+
+       # MClass related metrics phase
        var mclasses_metrics_phase: Phase = new MClassesMetricsPhase(self, null)
 end
 
        var mclasses_metrics_phase: Phase = new MClassesMetricsPhase(self, null)
 end
 
@@ -40,11 +42,11 @@ private class MClassesMetricsPhase
                print toolcontext.format_h1("\n# MClasses metrics")
 
                var metrics = new MetricSet
                print toolcontext.format_h1("\n# MClasses metrics")
 
                var metrics = new MetricSet
-               metrics.register(new CNOA(mainmodule))
-               metrics.register(new CNOP(mainmodule))
-               metrics.register(new CNOC(mainmodule))
-               metrics.register(new CNOD(mainmodule))
-               metrics.register(new CDIT(mainmodule))
+               metrics.register(new CNOA(mainmodule, model_view))
+               metrics.register(new CNOP(mainmodule, model_view))
+               metrics.register(new CNOC(mainmodule, model_view))
+               metrics.register(new CNOD(mainmodule, model_view))
+               metrics.register(new CDIT(mainmodule, model_view))
                metrics.register(new CNBP(mainmodule, model_view))
                metrics.register(new CNBA(mainmodule, model_view))
                metrics.register(new CNBIP(mainmodule, model_view))
                metrics.register(new CNBP(mainmodule, model_view))
                metrics.register(new CNBA(mainmodule, model_view))
                metrics.register(new CNBIP(mainmodule, model_view))
@@ -86,9 +88,15 @@ private class MClassesMetricsPhase
 end
 
 # A metric about MClass
 end
 
 # A metric about MClass
-interface MClassMetric
+abstract class MClassMetric
        super Metric
        redef type ELM: MClass
        super Metric
        redef type ELM: MClass
+
+       # Main module used for class linearization
+       var mainmodule: MModule
+
+       # Model view used to collect and filter entities
+       var model_view: ModelView
 end
 
 # Class Metric: Number of Ancestors
 end
 
 # Class Metric: Number of Ancestors
@@ -98,9 +106,6 @@ class CNOA
        redef fun name do return "cnoa"
        redef fun desc do return "number of ancestor classes"
 
        redef fun name do return "cnoa"
        redef fun desc do return "number of ancestor classes"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).greaters.length - 1
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).greaters.length - 1
@@ -115,9 +120,6 @@ class CNOP
        redef fun name do return "cnop"
        redef fun desc do return "number of parent classes"
 
        redef fun name do return "cnop"
        redef fun desc do return "number of parent classes"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).direct_greaters.length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).direct_greaters.length
@@ -132,9 +134,6 @@ class CNOC
        redef fun name do return "cnoc"
        redef fun desc do return "number of child classes"
 
        redef fun name do return "cnoc"
        redef fun desc do return "number of child classes"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).direct_smallers.length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).direct_smallers.length
@@ -149,9 +148,6 @@ class CNOD
        redef fun name do return "cnod"
        redef fun desc do return "number of descendant classes"
 
        redef fun name do return "cnod"
        redef fun desc do return "number of descendant classes"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).smallers.length - 1
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).smallers.length - 1
@@ -166,9 +162,6 @@ class CDIT
        redef fun name do return "cdit"
        redef fun desc do return "depth in class tree"
 
        redef fun name do return "cdit"
        redef fun desc do return "depth in class tree"
 
-       var mainmodule: MModule
-       init(mainmodule: MModule) do self.mainmodule = mainmodule
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).depth
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.in_hierarchy(mainmodule).depth
@@ -183,14 +176,6 @@ class CNBP
        redef fun name do return "cnbp"
        redef fun desc do return "number of accessible properties (inherited + local)"
 
        redef fun name do return "cnbp"
        redef fun desc do return "number of accessible properties (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
                        values[mclass] = mclass.collect_accessible_mproperties(model_view).length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.collect_accessible_mproperties(model_view).length
@@ -205,14 +190,6 @@ class CNBA
        redef fun name do return "cnba"
        redef fun desc do return "number of accessible attributes (inherited + local)"
 
        redef fun name do return "cnba"
        redef fun desc do return "number of accessible 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
                        values[mclass] = mclass.collect_accessible_mattributes(model_view).length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.collect_accessible_mattributes(model_view).length
@@ -227,14 +204,6 @@ class CNBIP
        redef fun name do return "cnbip"
        redef fun desc do return "number of introduced properties"
 
        redef fun name do return "cnbip"
        redef fun desc do return "number of introduced properties"
 
-       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
                        values[mclass] = mclass.collect_intro_mproperties(model_view).length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.collect_intro_mproperties(model_view).length
@@ -249,14 +218,6 @@ class CNBRP
        redef fun name do return "cnbrp"
        redef fun desc do return "number of redefined properties"
 
        redef fun name do return "cnbrp"
        redef fun desc do return "number of redefined properties"
 
-       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
                        values[mclass] = mclass.collect_redef_mproperties(model_view).length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.collect_redef_mproperties(model_view).length
@@ -271,14 +232,6 @@ class CNBHP
        redef fun name do return "cnbhp"
        redef fun desc do return "number of inherited properties"
 
        redef fun name do return "cnbhp"
        redef fun desc do return "number of inherited properties"
 
-       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
                        values[mclass] = mclass.collect_inherited_mproperties(model_view).length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.collect_inherited_mproperties(model_view).length
@@ -293,14 +246,6 @@ class CNBLP
        redef fun name do return "cnblp"
        redef fun desc do return "number of local properties (intro + redef)"
 
        redef fun name do return "cnblp"
        redef fun desc do return "number of local properties (intro + redef)"
 
-       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
                        values[mclass] = mclass.collect_local_mproperties(model_view).length
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        values[mclass] = mclass.collect_local_mproperties(model_view).length
index 1c4b6f8..a6f3518 100644 (file)
@@ -76,8 +76,8 @@ private class MendelMetricsPhase
                end
 
                var cnblp = new CNBLP(mainmodule, model_view)
                end
 
                var cnblp = new CNBLP(mainmodule, model_view)
-               var cnvi = new CNVI(mainmodule)
-               var cnvs = new CNVS(mainmodule)
+               var cnvi = new CNVI(mainmodule, model_view)
+               var cnvs = new CNVS(mainmodule, model_view)
 
                var metrics = new MetricSet
                metrics.register(cnblp, cnvi, cnvs)
 
                var metrics = new MetricSet
                metrics.register(cnblp, cnvi, cnvs)
@@ -137,13 +137,9 @@ class CBMS
        redef fun name do return "cbms"
        redef fun desc do return "branch mean size, mean number of introduction available among ancestors"
 
        redef fun name do return "cbms"
        redef fun desc do return "branch mean size, mean number of introduction available among ancestors"
 
-       # Mainmodule used to compute class hierarchy.
-       var mainmodule: MModule
-       private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       var totc = mclass.collect_accessible_mproperties(protected_view).length
+                       var totc = mclass.collect_accessible_mproperties(model_view).length
                        var ditc = mclass.in_hierarchy(mainmodule).depth
                        values[mclass] = totc.to_f / (ditc + 1).to_f
                end
                        var ditc = mclass.in_hierarchy(mainmodule).depth
                        values[mclass] = totc.to_f / (ditc + 1).to_f
                end
@@ -176,12 +172,8 @@ class CNVI
        redef fun name do return "cnvi"
        redef fun desc do return "class novelty index, contribution of the class to its branch in term of introductions"
 
        redef fun name do return "cnvi"
        redef fun desc do return "class novelty index, contribution of the class to its branch in term of introductions"
 
-       # Mainmodule used to compute class hierarchy.
-       var mainmodule: MModule
-       private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
        redef fun collect(mclasses) do
        redef fun collect(mclasses) do
-               var cbms = new CBMS(mainmodule)
+               var cbms = new CBMS(mainmodule, model_view)
                for mclass in mclasses do
                        # compute branch mean size
                        var parents = mclass.in_hierarchy(mainmodule).direct_greaters
                for mclass in mclasses do
                        # compute branch mean size
                        var parents = mclass.in_hierarchy(mainmodule).direct_greaters
@@ -189,7 +181,7 @@ class CNVI
                                cbms.clear
                                cbms.collect(new HashSet[MClass].from(parents))
                                # compute class novelty index
                                cbms.clear
                                cbms.collect(new HashSet[MClass].from(parents))
                                # compute class novelty index
-                               var locc = mclass.collect_accessible_mproperties(protected_view).length
+                               var locc = mclass.collect_accessible_mproperties(model_view).length
                                values[mclass] = locc.to_f / cbms.avg
                        else
                                values[mclass] = 0.0
                                values[mclass] = locc.to_f / cbms.avg
                        else
                                values[mclass] = 0.0
@@ -233,15 +225,11 @@ class CNVS
        redef fun name do return "cnvs"
        redef fun desc do return "class novelty score, importance of the contribution of the class to its branch"
 
        redef fun name do return "cnvs"
        redef fun desc do return "class novelty score, importance of the contribution of the class to its branch"
 
-       # Mainmodule used to compute class hierarchy.
-       var mainmodule: MModule
-       private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
        redef fun collect(mclasses) do
        redef fun collect(mclasses) do
-               var cnvi = new CNVI(mainmodule)
+               var cnvi = new CNVI(mainmodule, model_view)
                cnvi.collect(mclasses)
                for mclass in mclasses do
                cnvi.collect(mclasses)
                for mclass in mclasses do
-                       var locc = mclass.collect_local_mproperties(protected_view).length
+                       var locc = mclass.collect_local_mproperties(model_view).length
                        values[mclass] = cnvi.values[mclass] * locc.to_f
                end
        end
                        values[mclass] = cnvi.values[mclass] * locc.to_f
                end
        end
index 46d319a..d68860b 100644 (file)
@@ -359,9 +359,17 @@ end
 # rta redef
 
 redef class RapidTypeAnalysis
 # rta redef
 
 redef class RapidTypeAnalysis
-       var cnli = new CNLI
-       var cnlc = new CNLC
+
+       # Class Live Instances
+       var cnli: CNLI is lazy do return new CNLI(mainmodule, modelbuilder.model.protected_view)
+
+       # Class Live Casts
+       var cnlc: CNLC is lazy do return new CNLC(mainmodule, modelbuilder.model.protected_view)
+
+       # Type Live Instances
        var tnli = new TNLI
        var tnli = new TNLI
+
+       # Rtpe Live Casts
        var tnlc = new TNLC
 
        redef fun add_new(recv, mtype) do
        var tnlc = new TNLC
 
        redef fun add_new(recv, mtype) do
@@ -396,4 +404,3 @@ redef class MType
                return depth + 1
        end
 end
                return depth + 1
        end
 end
-