Merge: curl: basic Unix domain socket support
[nit.git] / src / metrics / mclasses_metrics.nit
index 0951d10..158a448 100644 (file)
@@ -21,6 +21,8 @@ import metrics_base
 import model::model_collect
 
 redef class ToolContext
+
+       # MClass related metrics phase
        var mclasses_metrics_phase: Phase = new MClassesMetricsPhase(self, null)
 end
 
@@ -35,24 +37,25 @@ private class MClassesMetricsPhase
                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
-               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
@@ -86,9 +89,12 @@ private class MClassesMetricsPhase
 end
 
 # A metric about MClass
-interface MClassMetric
+abstract class MClassMetric
        super Metric
        redef type ELM: MClass
+
+       # Model view used to collect and filter entities
+       var model_view: ModelView
 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"
 
-       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
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).greaters.length - 1
                end
        end
 end
@@ -115,12 +118,9 @@ class CNOP
        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
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_greaters.length
                end
        end
 end
@@ -132,12 +132,9 @@ class CNOC
        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
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length
                end
        end
 end
@@ -149,12 +146,9 @@ class CNOD
        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
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).smallers.length - 1
                end
        end
 end
@@ -166,12 +160,9 @@ class CDIT
        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
+                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).depth
                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)"
 
-       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
@@ -205,17 +188,51 @@ class CNBA
        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
+
+# 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
-                       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
@@ -227,14 +244,6 @@ class CNBIP
        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
@@ -249,14 +258,6 @@ class CNBRP
        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
@@ -271,14 +272,6 @@ class CNBHP
        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
@@ -293,14 +286,6 @@ class CNBLP
        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