rta: visit the superstring created by explain_assert
[nit.git] / src / metrics / mclasses_metrics.nit
index 89467b2..158a448 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
 
@@ -35,24 +37,25 @@ private class MClassesMetricsPhase
                out.mkdir
 
                var model = toolcontext.modelbuilder.model
                out.mkdir
 
                var model = toolcontext.modelbuilder.model
-               var model_view = model.private_view
+               var filter = new ModelFilter(private_visibility)
+               var model_view = new ModelView(model, mainmodule, filter)
 
                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 CNBP(mainmodule, model_view))
-               metrics.register(new CNBA(mainmodule, model_view))
-               metrics.register(new CNBIP(mainmodule, model_view))
-               metrics.register(new CNBRP(mainmodule, model_view))
-               metrics.register(new CNBHP(mainmodule, model_view))
-               #TODO metrics.register(new CNBI) # nb init
-               #TODO metrics.register(new CNBM) # nb methods
-               #TODO metrics.register(new CNBV) # nb vtypes
+               metrics.register(new CNOA(model_view))
+               metrics.register(new CNOP(model_view))
+               metrics.register(new CNOC(model_view))
+               metrics.register(new CNOD(model_view))
+               metrics.register(new CDIT(model_view))
+               metrics.register(new CNBP(model_view))
+               metrics.register(new CNBA(model_view))
+               metrics.register(new CNBI(model_view))
+               metrics.register(new CNBM(model_view))
+               metrics.register(new CNBV(model_view))
+               metrics.register(new CNBIP(model_view))
+               metrics.register(new CNBRP(model_view))
+               metrics.register(new CNBHP(model_view))
 
                var mclasses = new HashSet[MClass]
                for mpackage in model.mpackages do
 
                var mclasses = new HashSet[MClass]
                for mpackage in model.mpackages do
@@ -71,7 +74,7 @@ private class MClassesMetricsPhase
                                mclasses.add_all(mod_mclasses)
                                metrics.collect(new HashSet[MClass].from(mod_mclasses))
                                metrics.to_console(1, not toolcontext.opt_nocolors.value)
                                mclasses.add_all(mod_mclasses)
                                metrics.collect(new HashSet[MClass].from(mod_mclasses))
                                metrics.to_console(1, not toolcontext.opt_nocolors.value)
-                               if csv then metrics.to_csv.save("{out}/{mgroup}.csv")
+                               if csv then metrics.to_csv.write_to_file("{out}/{mgroup}.csv")
                        end
                end
                if not mclasses.is_empty then
                        end
                end
                if not mclasses.is_empty then
@@ -80,15 +83,18 @@ private class MClassesMetricsPhase
                        print toolcontext.format_h2("\n ## global metrics")
                        metrics.collect(mclasses)
                        metrics.to_console(1, not toolcontext.opt_nocolors.value)
                        print toolcontext.format_h2("\n ## global metrics")
                        metrics.collect(mclasses)
                        metrics.to_console(1, not toolcontext.opt_nocolors.value)
-                       if csv then metrics.to_csv.save("{out}/summary.csv")
+                       if csv then metrics.to_csv.write_to_file("{out}/summary.csv")
                end
        end
 end
 
 # A metric about MClass
                end
        end
 end
 
 # A metric about MClass
-interface MClassMetric
+abstract class MClassMetric
        super Metric
        redef type ELM: MClass
        super Metric
        redef type ELM: MClass
+
+       # 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,12 +104,9 @@ 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
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(mainmodule).greaters.length - 1
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).greaters.length - 1
                end
        end
 end
                end
        end
 end
@@ -115,12 +118,9 @@ 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
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(mainmodule).direct_greaters.length
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_greaters.length
                end
        end
 end
                end
        end
 end
@@ -132,12 +132,9 @@ 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
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(mainmodule).direct_smallers.length
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length
                end
        end
 end
                end
        end
 end
@@ -149,12 +146,9 @@ 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
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(mainmodule).smallers.length - 1
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).smallers.length - 1
                end
        end
 end
                end
        end
 end
@@ -166,12 +160,9 @@ 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
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(mainmodule).depth
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).depth
                end
        end
 end
                end
        end
 end
@@ -183,14 +174,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,17 +188,51 @@ 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
+       redef fun collect(mclasses) do
+               for mclass in mclasses do
+                       values[mclass] = mclass.collect_accessible_mattributes(model_view).length
+               end
+       end
+end
+
+# Class Metric: Number of MMethods
+class CNBM
+       super MClassMetric
+       super IntMetric
+       redef fun name do return "cnbm"
+       redef fun desc do return "number of accessible methods (inherited + local)"
 
 
-       init(mainmodule: MModule, model_view: ModelView) do
-               self.mainmodule = mainmodule
-               self.model_view = model_view
+       redef fun collect(mclasses) do
+               for mclass in mclasses do
+                       values[mclass] = mclass.collect_accessible_mmethods(model_view).length
+               end
        end
        end
+end
+
+# Class Metric: Number of Constructors
+class CNBI
+       super MClassMetric
+       super IntMetric
+       redef fun name do return "cnbi"
+       redef fun desc do return "number of accessible constructors (inherited + local)"
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_accessible_mattributes(model_view).length
+                       values[mclass] = mclass.collect_accessible_inits(model_view).length
+               end
+       end
+end
+
+# Class Metric: Number of Virtual Types
+class CNBV
+       super MClassMetric
+       super IntMetric
+       redef fun name do return "cnbv"
+       redef fun desc do return "number of accessible virtual types (inherited + local)"
+
+       redef fun collect(mclasses) do
+               for mclass in mclasses do
+                       values[mclass] = mclass.collect_accessible_vts(model_view).length
                end
        end
 end
                end
        end
 end
@@ -227,14 +244,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 +258,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 +272,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 +286,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