nitmetrics: remove ModelView dependency
authorAlexandre Terrasa <alexandre@moz-code.org>
Tue, 15 May 2018 01:49:46 +0000 (21:49 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Wed, 30 May 2018 14:53:16 +0000 (10:53 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/metrics/codesmells_metrics.nit
src/metrics/inheritance_metrics.nit
src/metrics/mclassdef_collect.nit
src/metrics/mclasses_metrics.nit
src/metrics/mendel_metrics.nit
src/metrics/method_analyze_metrics.nit
src/metrics/mmodules_metrics.nit
src/metrics/nullables_metrics.nit
src/metrics/rta_metrics.nit

index cd98e85..e9ec586 100644 (file)
@@ -34,10 +34,10 @@ class CodeSmellsMetricsPhase
        redef fun process_mainmodule(mainmodule, given_mmodules) do
                print toolcontext.format_h1("--- Code Smells Metrics ---")
 
+               var model = toolcontext.modelbuilder.model
                var filter = new ModelFilter(private_visibility)
-               var view = new ModelView(toolcontext.modelbuilder.model, mainmodule, filter)
-               self.set_all_average_metrics(view)
-               var mclass_codesmell = new BadConceptonController(view)
+               self.set_all_average_metrics(model)
+               var mclass_codesmell = new BadConceptonController(model, filter)
                var collect = new Counter[MClassDef]
                var mclassdefs = new Array[MClassDef]
 
@@ -51,18 +51,20 @@ class CodeSmellsMetricsPhase
                end
        end
 
-       fun set_all_average_metrics(view: ModelView) do
+       fun set_all_average_metrics(model: Model) do
                var model_builder = toolcontext.modelbuilder
-               self.average_number_of_lines = view.get_avg_linenumber(model_builder)
-               self.average_number_of_parameter = view.get_avg_parameter
-               self.average_number_of_method = view.get_avg_method
-               self.average_number_of_attribute = view.get_avg_attribut
+               self.average_number_of_lines = model.get_avg_linenumber(model_builder)
+               self.average_number_of_parameter = model.get_avg_parameter
+               self.average_number_of_method = model.get_avg_method
+               self.average_number_of_attribute = model.get_avg_attribut
        end
 end
 
 class BadConceptonController
 
-       var view: ModelView
+       var model: Model
+
+       var filter: ModelFilter
 
        # Code smell list
        var bad_conception_elements = new Array[BadConceptionFinder]
@@ -84,7 +86,7 @@ class BadConceptonController
        # Collect method take Array of mclassdef to find the code smells for every class
        fun collect(mclassdefs: Array[MClassDef],phase: CodeSmellsMetricsPhase) do
                for mclassdef in mclassdefs do
-                       var bad_conception_class = new BadConceptionFinder(mclassdef, phase, view)
+                       var bad_conception_class = new BadConceptionFinder(mclassdef, phase, model, filter)
                        bad_conception_class.collect
                        bad_conception_elements.add(bad_conception_class)
                end
@@ -117,18 +119,19 @@ class BadConceptionFinder
        var mclassdef: MClassDef
        var array_badconception = new Array[BadConception]
        var phase: CodeSmellsMetricsPhase
-       var view: ModelView
+       var model: Model
+       var filter: ModelFilter
        var score = 0.0
 
        # Collect code smell with selected toolcontext option
        fun collect do
                var bad_conception_elements = new Array[BadConception]
                # Check toolcontext option
-               if phase.toolcontext.opt_feature_envy.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new FeatureEnvy(phase, view))
-               if phase.toolcontext.opt_long_method.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LongMethod(phase, view))
-               if phase.toolcontext.opt_long_params.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LongParameterList(phase, view))
-               if phase.toolcontext.opt_no_abstract_implementation.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new NoAbstractImplementation(phase, view))
-               if phase.toolcontext.opt_large_class.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LargeClass(phase, view))
+               if phase.toolcontext.opt_feature_envy.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new FeatureEnvy(phase, model, filter))
+               if phase.toolcontext.opt_long_method.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LongMethod(phase, model, filter))
+               if phase.toolcontext.opt_long_params.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LongParameterList(phase, model, filter))
+               if phase.toolcontext.opt_no_abstract_implementation.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new NoAbstractImplementation(phase, model, filter))
+               if phase.toolcontext.opt_large_class.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LargeClass(phase, model, filter))
                # Collected all code smell if their state is true
                for bad_conception_element in bad_conception_elements do
                        if bad_conception_element.collect(self.mclassdef,phase.toolcontext.modelbuilder) then array_badconception.add(bad_conception_element)
@@ -159,7 +162,9 @@ end
 abstract class BadConception
        var phase: CodeSmellsMetricsPhase
 
-       var view: ModelView
+       var model: Model
+
+       var filter: ModelFilter
 
        var score = 0.0
 
@@ -192,9 +197,9 @@ class LargeClass
        redef fun desc do return "Large class"
 
        redef fun collect(mclassdef, model_builder): Bool do
-               self.number_attribut = mclassdef.collect_intro_and_redef_mattributes(view).length
+               self.number_attribut = mclassdef.collect_intro_and_redef_mattributes(filter).length
                # Get the number of methods (Accessor include) (subtract the get and set of attibutes with (numberAtribut*2))
-               self.number_method = mclassdef.collect_intro_and_redef_methods(view).length
+               self.number_method = mclassdef.collect_intro_and_redef_methods(filter).length
                self.score_rate
                return self.number_method.to_f > phase.average_number_of_method and self.number_attribut.to_f > phase.average_number_of_attribute
        end
@@ -217,7 +222,7 @@ class LongParameterList
        redef fun desc do return "Long parameter list"
 
        redef fun collect(mclassdef, model_builder): Bool do
-               for meth in mclassdef.collect_intro_and_redef_mpropdefs(view) do
+               for meth in mclassdef.collect_intro_and_redef_mpropdefs(filter) do
                        var threshold_value = 4
                        # Get the threshold value from the toolcontext command
                        if phase.toolcontext.opt_long_params_threshold.value != 0 then threshold_value = phase.toolcontext.opt_long_params_threshold.value
@@ -258,7 +263,7 @@ class FeatureEnvy
        redef fun desc do return "Feature envy"
 
        redef fun collect(mclassdef, model_builder): Bool do
-               var mmethoddefs = call_analyze_methods(mclassdef,model_builder, view)
+               var mmethoddefs = call_analyze_methods(mclassdef,model_builder, filter)
                for mmethoddef in mmethoddefs do
                        var max_class_call = mmethoddef.class_call.max
                        # Check if the class with the maximum call is >= auto-call and the maximum call class is != of this class
@@ -303,7 +308,7 @@ class LongMethod
        redef fun desc do return "Long method"
 
        redef fun collect(mclassdef, model_builder): Bool do
-               var mmethoddefs = call_analyze_methods(mclassdef,model_builder, view)
+               var mmethoddefs = call_analyze_methods(mclassdef,model_builder, filter)
                var threshold_value = phase.average_number_of_lines.to_i
                # Get the threshold value from the toolcontext command
                if phase.toolcontext.opt_long_method_threshold.value != 0 then threshold_value = phase.toolcontext.opt_long_method_threshold.value
@@ -343,8 +348,8 @@ class NoAbstractImplementation
 
        redef fun collect(mclassdef, model_builder): Bool do
                if not mclassdef.mclass.is_abstract and not mclassdef.mclass.is_interface then
-                       if mclassdef.collect_abstract_methods(view).not_empty then
-                               bad_methods.add_all(mclassdef.collect_not_define_properties(view))
+                       if mclassdef.collect_abstract_methods(filter).not_empty then
+                               bad_methods.add_all(mclassdef.collect_not_define_properties(filter))
                        end
                end
                self.score_rate
@@ -368,11 +373,12 @@ class NoAbstractImplementation
        end
 end
 
-redef class ModelView
+redef class Model
        fun get_avg_parameter: Float do
                var counter = new Counter[MMethodDef]
-               for mclassdef in mclassdefs do
-                       for method in mclassdef.collect_intro_and_redef_mpropdefs(self) do
+               var filter = new ModelFilter
+               for mclassdef in collect_mclassdefs(filter) do
+                       for method in mclassdef.collect_intro_and_redef_mpropdefs(filter) do
                        # check if the property is a method definition
                                if not method isa MMethodDef then continue
                                #Check if method has a signature
@@ -386,8 +392,9 @@ redef class ModelView
 
        fun get_avg_attribut: Float do
                var counter = new Counter[MClassDef]
-               for mclassdef in mclassdefs do
-                       var number_attributs = mclassdef.collect_intro_and_redef_mattributes(self).length
+               var filter = new ModelFilter
+               for mclassdef in collect_mclassdefs(filter) do
+                       var number_attributs = mclassdef.collect_intro_and_redef_mattributes(filter).length
                        if number_attributs != 0 then counter[mclassdef] = number_attributs
                end
                return counter.avg + counter.std_dev
@@ -395,8 +402,9 @@ redef class ModelView
 
        fun get_avg_method: Float do
                var counter = new Counter[MClassDef]
-               for mclassdef in mclassdefs do
-                       var number_methodes = mclassdef.collect_intro_and_redef_methods(self).length
+               var filter = new ModelFilter
+               for mclassdef in collect_mclassdefs(filter) do
+                       var number_methodes = mclassdef.collect_intro_and_redef_methods(filter).length
                        if number_methodes != 0 then counter[mclassdef] = number_methodes
                end
                return counter.avg + counter.std_dev
@@ -404,15 +412,16 @@ redef class ModelView
 
        fun get_avg_linenumber(model_builder: ModelBuilder): Float do
                var methods_analyse_metrics = new Counter[MClassDef]
-               for mclassdef in mclassdefs do
+               var filter = new ModelFilter
+               for mclassdef in collect_mclassdefs(filter) do
                        var result = 0
                        var count = 0
-                       for mmethoddef in call_analyze_methods(mclassdef,model_builder, self) do
+                       for mmethoddef in call_analyze_methods(mclassdef,model_builder, filter) do
                                result += mmethoddef.line_number
                                if mmethoddef.line_number == 0 then continue
                                count += 1
                        end
-                       if not mclassdef.collect_local_mproperties(self).length != 0 then continue
+                       if not mclassdef.collect_local_mproperties(filter).length != 0 then continue
                        if count == 0 then continue
                        methods_analyse_metrics[mclassdef] = (result/count).to_i
                end
index 29a15ce..527ece8 100644 (file)
@@ -38,28 +38,28 @@ private class InheritanceMetricsPhase
                out.mkdir
 
                var model = toolcontext.modelbuilder.model
-               var model_view = new ModelView(model, mainmodule)
+               var filter = new ModelFilter(min_visibility = private_visibility)
 
                print toolcontext.format_h1("\n# Inheritance metrics")
 
                var hmetrics = new MetricSet
-               hmetrics.register(new MDUI(model_view))
-               hmetrics.register(new MDUIC(model_view))
-               hmetrics.register(new MDUII(model_view))
-               hmetrics.register(new MIF(model_view))
-               hmetrics.register(new MIFC(model_view))
-               hmetrics.register(new MIFI(model_view))
+               hmetrics.register(new MDUI(model, mainmodule))
+               hmetrics.register(new MDUIC(model, mainmodule))
+               hmetrics.register(new MDUII(model, mainmodule))
+               hmetrics.register(new MIF(model, mainmodule))
+               hmetrics.register(new MIFC(model, mainmodule))
+               hmetrics.register(new MIFI(model, mainmodule))
 
                var cmetrics = new MetricSet
-               cmetrics.register(new CNOAC(model_view))
-               cmetrics.register(new CNOPC(model_view))
-               cmetrics.register(new CNOCC(model_view))
-               cmetrics.register(new CNODC(model_view))
-               cmetrics.register(new CNOPI(model_view))
-               cmetrics.register(new CNOCI(model_view))
-               cmetrics.register(new CNODI(model_view))
-               cmetrics.register(new CDITC(model_view))
-               cmetrics.register(new CDITI(model_view))
+               cmetrics.register(new CNOAC(model, mainmodule, filter))
+               cmetrics.register(new CNOPC(model, mainmodule, filter))
+               cmetrics.register(new CNOCC(model, mainmodule, filter))
+               cmetrics.register(new CNODC(model, mainmodule, filter))
+               cmetrics.register(new CNOPI(model, mainmodule, filter))
+               cmetrics.register(new CNOCI(model, mainmodule, filter))
+               cmetrics.register(new CNODI(model, mainmodule, filter))
+               cmetrics.register(new CDITC(model, mainmodule, filter))
+               cmetrics.register(new CDITI(model, mainmodule, filter))
 
                var mmodules = new HashSet[MModule]
                var mclasses = new HashSet[MClass]
@@ -116,7 +116,7 @@ class MDUI
                for mmodule in mmodules do
                        var count = 0
                        for mclass in mmodule.intro_mclasses do
-                               if mclass.in_hierarchy(model_view.mainmodule).greaters.length > 2 then count += 1
+                               if mclass.in_hierarchy(mainmodule).greaters.length > 2 then count += 1
                        end
                        if mmodule.intro_mclasses.is_empty then
                                values[mmodule] = 0.0
@@ -142,7 +142,7 @@ class MDUIC
                        var nb = 0
                        for mclass in mmodule.intro_mclasses do
                                if mclass.kind == abstract_kind or mclass.kind == concrete_kind or mclass.kind == extern_kind then
-                                       if mclass.in_hierarchy(model_view.mainmodule).greaters.length > 2 then count += 1
+                                       if mclass.in_hierarchy(mainmodule).greaters.length > 2 then count += 1
                                end
                                nb += 1
                        end
@@ -170,7 +170,7 @@ class MDUII
                        var nb = 0
                        for mclass in mmodule.intro_mclasses do
                                if mclass.kind == interface_kind then
-                                       if mclass.in_hierarchy(model_view.mainmodule).greaters.length > 2 then count += 1
+                                       if mclass.in_hierarchy(mainmodule).greaters.length > 2 then count += 1
                                end
                                nb += 1
                        end
@@ -196,7 +196,7 @@ class MIF
                for mmodule in mmodules do
                        var count = 0
                        for mclass in mmodule.intro_mclasses do
-                               if mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length > 0 then count += 1
+                               if mclass.in_hierarchy(mainmodule).direct_smallers.length > 0 then count += 1
                        end
                        if mmodule.intro_mclasses.is_empty then
                                values[mmodule] = 0.0
@@ -222,7 +222,7 @@ class MIFC
                        var nb = 0
                        for mclass in mmodule.intro_mclasses do
                                if mclass.kind == abstract_kind or mclass.kind == concrete_kind or mclass.kind == extern_kind then
-                                       if mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length > 0 then count += 1
+                                       if mclass.in_hierarchy(mainmodule).direct_smallers.length > 0 then count += 1
                                end
                                nb += 1
                        end
@@ -250,7 +250,7 @@ class MIFI
                        var nb = 0
                        for mclass in mmodule.intro_mclasses do
                                if mclass.kind == interface_kind then
-                                       if mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length > 0 then count += 1
+                                       if mclass.in_hierarchy(mainmodule).direct_smallers.length > 0 then count += 1
                                end
                                nb += 1
                        end
@@ -275,7 +275,7 @@ class CNOAC
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).greaters do
+                       for parent in mclass.in_hierarchy(mainmodule).greaters do
                                if parent == mclass then continue
                                if parent.kind == abstract_kind or parent.kind == concrete_kind or parent.kind == extern_kind then
                                        count += 1
@@ -298,7 +298,7 @@ class CNOPC
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).direct_greaters do
+                       for parent in mclass.in_hierarchy(mainmodule).direct_greaters do
                                if parent == mclass then continue
                                if parent.kind == abstract_kind or parent.kind == concrete_kind or parent.kind == extern_kind then
                                        count += 1
@@ -321,7 +321,7 @@ class CNOCC
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).direct_smallers do
+                       for parent in mclass.in_hierarchy(mainmodule).direct_smallers do
                                if parent == mclass then continue
                                if parent.kind == abstract_kind or parent.kind == concrete_kind or parent.kind == extern_kind then
                                        count += 1
@@ -344,7 +344,7 @@ class CNODC
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).smallers do
+                       for parent in mclass.in_hierarchy(mainmodule).smallers do
                                if parent == mclass then continue
                                if parent.kind == abstract_kind or parent.kind == concrete_kind or parent.kind == extern_kind then
                                        count += 1
@@ -367,7 +367,7 @@ class CNOAA
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).greaters do
+                       for parent in mclass.in_hierarchy(mainmodule).greaters do
                                if parent == mclass then continue
                                if parent.kind == abstract_kind then
                                        count += 1
@@ -390,7 +390,7 @@ class CNOAI
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).greaters do
+                       for parent in mclass.in_hierarchy(mainmodule).greaters do
                                if parent == mclass then continue
                                if parent.kind == interface_kind then
                                        count += 1
@@ -413,7 +413,7 @@ class CNOPI
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).direct_greaters do
+                       for parent in mclass.in_hierarchy(mainmodule).direct_greaters do
                                if parent == mclass then continue
                                if parent.kind == interface_kind then
                                        count += 1
@@ -436,7 +436,7 @@ class CNOCI
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).direct_smallers do
+                       for parent in mclass.in_hierarchy(mainmodule).direct_smallers do
                                if parent == mclass then continue
                                if parent.kind == interface_kind then
                                        count += 1
@@ -459,7 +459,7 @@ class CNODI
        redef fun collect(mclasses) do
                for mclass in mclasses do
                        var count = 0
-                       for parent in mclass.in_hierarchy(model_view.mainmodule).smallers do
+                       for parent in mclass.in_hierarchy(mainmodule).smallers do
                                if parent == mclass then continue
                                if parent.kind == interface_kind then
                                        count += 1
@@ -481,7 +481,7 @@ class CDITC
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.ditc(model_view.mainmodule)
+                       values[mclass] = mclass.ditc(mainmodule)
                end
        end
 end
@@ -497,7 +497,7 @@ class CDITI
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.diti(model_view.mainmodule)
+                       values[mclass] = mclass.diti(mainmodule)
                end
        end
 end
index 84537ce..98a4412 100644 (file)
@@ -18,155 +18,154 @@ module mclassdef_collect
 # We usualy need specific phases
 # NOTE: `frontend` is sufficent in most case (it is often too much)
 import frontend
-import model_views
 import model_collect
 
 redef class MClassDef
        # Collect all mproperties introduced in 'self' with `visibility >= min_visibility`.
-       fun collect_intro_mproperties(view: ModelView): Set[MProperty] do
+       fun collect_intro_mproperties(filter: ModelFilter): Set[MProperty] do
                var set = new HashSet[MProperty]
                        for mprop in self.intro_mproperties do
-                               if not view.accept_mentity(mprop) then continue
+                               if not filter.accept_mentity(mprop) then continue
                                set.add(mprop)
                        end
                return set
        end
 
        # Collect mmethods introduced in 'self' with `visibility >= min_visibility`.
-       fun collect_intro_mmethods(view: ModelView): Set[MMethod] do
+       fun collect_intro_mmethods(filter: ModelFilter): Set[MMethod] do
                var res = new HashSet[MMethod]
-               for mproperty in collect_intro_mproperties(view) do
-                       if not view.accept_mentity(mproperty) then continue
+               for mproperty in collect_intro_mproperties(filter) do
+                       if not filter.accept_mentity(mproperty) then continue
                        if mproperty isa MMethod then res.add(mproperty)
                end
                return res
        end
 
        # Collect mmethods redefined in 'self' with `visibility >= min_visibility`.
-       fun collect_redef_mmethods(view: ModelView): Set[MMethod] do
+       fun collect_redef_mmethods(filter: ModelFilter): Set[MMethod] do
                var res = new HashSet[MMethod]
-               for mproperty in collect_redef_mproperties(view) do
-                       if not view.accept_mentity(mproperty) then continue
+               for mproperty in collect_redef_mproperties(filter) do
+                       if not filter.accept_mentity(mproperty) then continue
                        if mproperty isa MMethod then res.add(mproperty)
                end
                return res
        end
 
        # Collect mattributes redefined in 'self' with `visibility >= min_visibility`.
-       fun collect_redef_mattributes(view: ModelView): Set[MAttribute] do
+       fun collect_redef_mattributes(filter: ModelFilter): Set[MAttribute] do
                var res = new HashSet[MAttribute]
-               for mproperty in collect_redef_mproperties(view) do
-                       if not view.accept_mentity(mproperty) then continue
+               for mproperty in collect_redef_mproperties(filter) do
+                       if not filter.accept_mentity(mproperty) then continue
                        if mproperty isa MAttribute then res.add(mproperty)
                end
                return res
        end
 
        # Collect mattributes introduced in 'self' with `visibility >= min_visibility`.
-       fun collect_intro_mattributes(view: ModelView): Set[MAttribute] do
+       fun collect_intro_mattributes(filter: ModelFilter): Set[MAttribute] do
                var res = new HashSet[MAttribute]
-               for mproperty in collect_intro_mproperties(view) do
-                       if not view.accept_mentity(mproperty) then continue
+               for mproperty in collect_intro_mproperties(filter) do
+                       if not filter.accept_mentity(mproperty) then continue
                        if mproperty isa MAttribute then res.add(mproperty)
                end
                return res
        end
 
        # Collect all mproperties redefined in 'self' with `visibility >= min_visibility`.
-       fun collect_redef_mproperties(view: ModelView): Set[MProperty] do
+       fun collect_redef_mproperties(filter: ModelFilter): Set[MProperty] do
                var set = new HashSet[MProperty]
                for mpropdef in self.mpropdefs do
-                       if not view.accept_mentity(mpropdef) then continue
+                       if not filter.accept_mentity(mpropdef) then continue
                        if mpropdef.mproperty.intro_mclassdef.mclass == self then continue
                                set.add(mpropdef.mproperty)
                        end
                return set
        end
 
-       # Collect mmethods inherited by 'self' if accepted by `view`.
-       fun collect_inherited_mmethods(view: ModelView): Set[MMethod] do
+       # Collect mmethods inherited by 'self' if accepted by `filter`.
+       fun collect_inherited_mmethods(mainmodule: MModule, filter: ModelFilter): Set[MMethod] do
                var res = new HashSet[MMethod]
-               for mproperty in collect_inherited_mproperties(view) do
-                       if not view.accept_mentity(mproperty) then continue
+               for mproperty in collect_inherited_mproperties(mainmodule, filter) do
+                       if not filter.accept_mentity(mproperty) then continue
                        if mproperty isa MMethod then res.add(mproperty)
                end
                return res
        end
 
        # Collect mproperties introduced and redefined in 'self' with `visibility >= min_visibility`.
-       fun collect_local_mproperties(view: ModelView): Set[MProperty] do
+       fun collect_local_mproperties(filter: ModelFilter): Set[MProperty] do
                var set = new HashSet[MProperty]
-               set.add_all collect_intro_mproperties(view)
-               set.add_all collect_redef_mproperties(view)
+               set.add_all collect_intro_mproperties(filter)
+               set.add_all collect_redef_mproperties(filter)
                return set
        end
 
        # Collect all mproperties inehrited by 'self' with `visibility >= min_visibility`.
-       fun collect_inherited_mproperties(view: ModelView): Set[MProperty] do
+       fun collect_inherited_mproperties(mainmodule: MModule, filter: ModelFilter): Set[MProperty] do
                var set = new HashSet[MProperty]
-               for parent in collect_parents(view) do
-                       set.add_all(parent.collect_intro_mproperties(view))
-                       set.add_all(parent.collect_inherited_mproperties(view))
+               for parent in collect_parents(mainmodule, filter) do
+                       set.add_all(parent.collect_intro_mproperties(filter))
+                       set.add_all(parent.collect_inherited_mproperties(mainmodule, filter))
                end
                return set
        end
 
        # Collect mattributes inherited by 'self' with `visibility >= min_visibility`.
-       fun collect_inherited_mattributes(view: ModelView): Set[MAttribute] do
+       fun collect_inherited_mattributes(mainmodule: MModule, filter: ModelFilter): Set[MAttribute] do
                var res = new HashSet[MAttribute]
-               for mproperty in collect_inherited_mproperties(view) do
-                       if not view.accept_mentity(mproperty) then continue
+               for mproperty in collect_inherited_mproperties(mainmodule, filter) do
+                       if not filter.accept_mentity(mproperty) then continue
                        if mproperty isa MAttribute then res.add(mproperty)
                end
                return res
        end
 
        # Collect all mmethod inehrited,intro and redef
-       fun collect_all_methods(view: ModelView): Set[MMethod] do
+       fun collect_all_methods(mainmodule: MModule, filter: ModelFilter): Set[MMethod] do
                var set = new HashSet[MMethod]
-               set.add_all collect_intro_mmethods(view)
-               set.add_all collect_redef_mmethods(view)
-               set.add_all collect_inherited_mmethods(view)
+               set.add_all collect_intro_mmethods(filter)
+               set.add_all collect_redef_mmethods(filter)
+               set.add_all collect_inherited_mmethods(mainmodule, filter)
                return set
        end
 
        # Collect all mattributs inehrited,intro and redef
-       fun collect_all_mattributes(view: ModelView): Set[MAttribute] do
+       fun collect_all_mattributes(mainmodule: MModule, filter: ModelFilter): Set[MAttribute] do
                var set = new HashSet[MAttribute]
-               set.add_all collect_redef_mattributes(view)
-               set.add_all collect_intro_mattributes(view)
-               set.add_all collect_inherited_mattributes(view)
+               set.add_all collect_redef_mattributes(filter)
+               set.add_all collect_intro_mattributes(filter)
+               set.add_all collect_inherited_mattributes(mainmodule, filter)
                return set
        end
 
        # Collect intro and redef mmethods
-       fun collect_intro_and_redef_methods(view: ModelView): Set[MMethod] do
+       fun collect_intro_and_redef_methods(filter: ModelFilter): Set[MMethod] do
                var set = new HashSet[MMethod]
-               set.add_all collect_intro_mmethods(view)
-               set.add_all collect_redef_mmethods(view)
+               set.add_all collect_intro_mmethods(filter)
+               set.add_all collect_redef_mmethods(filter)
                return set
        end
 
        # Collect intro and redef mattributs
-       fun collect_intro_and_redef_mattributes(view: ModelView): Set[MAttribute] do
+       fun collect_intro_and_redef_mattributes(filter: ModelFilter): Set[MAttribute] do
                var set = new HashSet[MAttribute]
-               set.add_all collect_redef_mattributes(view)
-               set.add_all collect_intro_mattributes(view)
+               set.add_all collect_redef_mattributes(filter)
+               set.add_all collect_intro_mattributes(filter)
                return set
        end
 
        # Collect intro and redef mpropdefs
-       fun collect_intro_and_redef_mpropdefs(view: ModelView): Set[MPropDef] do
+       fun collect_intro_and_redef_mpropdefs(filter: ModelFilter): Set[MPropDef] do
                var set = new HashSet[MPropDef]
-               set.add_all collect_intro_mpropdefs(view)
-               set.add_all collect_redef_mpropdefs(view)
+               set.add_all collect_intro_mpropdefs(filter)
+               set.add_all collect_redef_mpropdefs(filter)
                return set
        end
 
        # Collect intro abstract mmethodDef
-       fun collect_abstract_methods(view: ModelView): Set[MMethodDef] do
+       fun collect_abstract_methods(filter: ModelFilter): Set[MMethodDef] do
                var set = new HashSet[MMethodDef]
-               var mpropdefs = collect_intro_mpropdefs(view)
+               var mpropdefs = collect_intro_mpropdefs(filter)
                for mpropdef in mpropdefs do
                        if mpropdef isa MMethodDef then
                                if mpropdef.is_abstract then set.add(mpropdef)
@@ -176,9 +175,9 @@ redef class MClassDef
        end
 
        # Collect not defined properties
-       fun collect_not_define_properties(view: ModelView):Set[MMethodDef] do
+       fun collect_not_define_properties(filter: ModelFilter):Set[MMethodDef] do
                var set = new HashSet[MMethodDef]
-               for mpropdef in collect_abstract_methods(view) do
+               for mpropdef in collect_abstract_methods(filter) do
                        var redef_count = 0
                        for mprop in mpropdef.mproperty.mpropdefs do
                                if mprop.is_abstract then continue
index 158a448..2404a38 100644 (file)
@@ -38,24 +38,23 @@ private class MClassesMetricsPhase
 
                var model = toolcontext.modelbuilder.model
                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(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))
+               metrics.register(new CNOA(model, mainmodule, filter))
+               metrics.register(new CNOP(model, mainmodule, filter))
+               metrics.register(new CNOC(model, mainmodule, filter))
+               metrics.register(new CNOD(model, mainmodule, filter))
+               metrics.register(new CDIT(model, mainmodule, filter))
+               metrics.register(new CNBP(model, mainmodule, filter))
+               metrics.register(new CNBA(model, mainmodule, filter))
+               metrics.register(new CNBI(model, mainmodule, filter))
+               metrics.register(new CNBM(model, mainmodule, filter))
+               metrics.register(new CNBV(model, mainmodule, filter))
+               metrics.register(new CNBIP(model, mainmodule, filter))
+               metrics.register(new CNBRP(model, mainmodule, filter))
+               metrics.register(new CNBHP(model, mainmodule, filter))
 
                var mclasses = new HashSet[MClass]
                for mpackage in model.mpackages do
@@ -93,8 +92,14 @@ abstract class MClassMetric
        super Metric
        redef type ELM: MClass
 
-       # Model view used to collect and filter entities
-       var model_view: ModelView
+       # Model used to collect and filter entities
+       var model: Model
+
+       # Mainmodule for class linearization
+       var mainmodule: MModule
+
+       # Filter to apply
+       var filter: nullable ModelFilter
 end
 
 # Class Metric: Number of Ancestors
@@ -106,7 +111,7 @@ class CNOA
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).greaters.length - 1
+                       values[mclass] = mclass.in_hierarchy(mainmodule).greaters.length - 1
                end
        end
 end
@@ -120,7 +125,7 @@ class CNOP
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_greaters.length
+                       values[mclass] = mclass.in_hierarchy(mainmodule).direct_greaters.length
                end
        end
 end
@@ -134,7 +139,7 @@ class CNOC
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length
+                       values[mclass] = mclass.in_hierarchy(mainmodule).direct_smallers.length
                end
        end
 end
@@ -148,7 +153,7 @@ class CNOD
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).smallers.length - 1
+                       values[mclass] = mclass.in_hierarchy(mainmodule).smallers.length - 1
                end
        end
 end
@@ -162,7 +167,7 @@ class CDIT
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.in_hierarchy(model_view.mainmodule).depth
+                       values[mclass] = mclass.in_hierarchy(mainmodule).depth
                end
        end
 end
@@ -176,7 +181,7 @@ class CNBP
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_accessible_mproperties(model_view).length
+                       values[mclass] = mclass.collect_accessible_mproperties(mainmodule, filter).length
                end
        end
 end
@@ -190,7 +195,7 @@ class CNBA
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_accessible_mattributes(model_view).length
+                       values[mclass] = mclass.collect_accessible_mattributes(mainmodule, filter).length
                end
        end
 end
@@ -204,7 +209,7 @@ class CNBM
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_accessible_mmethods(model_view).length
+                       values[mclass] = mclass.collect_accessible_mmethods(mainmodule, filter).length
                end
        end
 end
@@ -218,7 +223,7 @@ class CNBI
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_accessible_inits(model_view).length
+                       values[mclass] = mclass.collect_accessible_inits(mainmodule, filter).length
                end
        end
 end
@@ -232,7 +237,7 @@ class CNBV
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_accessible_vts(model_view).length
+                       values[mclass] = mclass.collect_accessible_vts(mainmodule, filter).length
                end
        end
 end
@@ -246,7 +251,7 @@ class CNBIP
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_intro_mproperties(model_view).length
+                       values[mclass] = mclass.collect_intro_mproperties(filter).length
                end
        end
 end
@@ -260,7 +265,7 @@ class CNBRP
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_redef_mproperties(model_view).length
+                       values[mclass] = mclass.collect_redef_mproperties(filter).length
                end
        end
 end
@@ -274,7 +279,7 @@ class CNBHP
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_inherited_mproperties(model_view).length
+                       values[mclass] = mclass.collect_inherited_mproperties(mainmodule, filter).length
                end
        end
 end
@@ -288,7 +293,7 @@ class CNBLP
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       values[mclass] = mclass.collect_local_mproperties(model_view).length
+                       values[mclass] = mclass.collect_local_mproperties(filter).length
                end
        end
 end
index e16e75f..2fe74a2 100644 (file)
@@ -68,17 +68,16 @@ private class MendelMetricsPhase
 
                var model = toolcontext.modelbuilder.model
                var filter = new ModelFilter(min_visibility = protected_visibility)
-               var model_view = new ModelView(model, mainmodule, filter)
 
                var mclasses = new HashSet[MClass]
-               for mclass in model_view.mclasses do
+               for mclass in model.collect_mclasses(filter) do
                        if mclass.is_interface then continue
                        mclasses.add(mclass)
                end
 
-               var cnblp = new CNBLP(model_view)
-               var cnvi = new CNVI(model_view)
-               var cnvs = new CNVS(model_view)
+               var cnblp = new CNBLP(model, mainmodule, filter)
+               var cnvi = new CNVI(model, mainmodule, filter)
+               var cnvs = new CNVS(model, mainmodule, filter)
 
                var metrics = new MetricSet
                metrics.register(cnblp, cnvi, cnvs)
@@ -114,15 +113,15 @@ private class MendelMetricsPhase
                        csvh.separator = ';'
                        csvh.header = ["povr", "ovr", "pext", "ext", "pspe", "spe", "prep", "rep", "eq"]
                        for mclass in mclasses do
-                               var povr = mclass.is_pure_overrider(model_view).object_id
-                               var ovr = mclass.is_overrider(model_view).object_id
-                               var pext = mclass.is_pure_extender(model_view).object_id
-                               var ext = mclass.is_extender(model_view).object_id
-                               var pspe = mclass.is_pure_specializer(model_view).object_id
-                               var spe = mclass.is_pure_specializer(model_view).object_id
-                               var prep = mclass.is_pure_replacer(model_view).object_id
-                               var rep = mclass.is_replacer(model_view).object_id
-                               var eq = mclass.is_equal(model_view).object_id
+                               var povr = mclass.is_pure_overrider(filter).object_id
+                               var ovr = mclass.is_overrider(filter).object_id
+                               var pext = mclass.is_pure_extender(filter).object_id
+                               var ext = mclass.is_extender(filter).object_id
+                               var pspe = mclass.is_pure_specializer(filter).object_id
+                               var spe = mclass.is_pure_specializer(filter).object_id
+                               var prep = mclass.is_pure_replacer(filter).object_id
+                               var rep = mclass.is_replacer(filter).object_id
+                               var eq = mclass.is_equal(filter).object_id
                                csvh.add_record(povr, ovr, pext, ext, pspe, spe, prep, rep, eq)
                        end
                        csvh.write_to_file("{out}/inheritance_behaviour.csv")
@@ -140,8 +139,8 @@ class CBMS
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       var totc = mclass.collect_accessible_mproperties(model_view).length
-                       var ditc = mclass.in_hierarchy(model_view.mainmodule).depth
+                       var totc = mclass.collect_accessible_mproperties(mainmodule, filter).length
+                       var ditc = mclass.in_hierarchy(mainmodule).depth
                        values[mclass] = totc.to_f / (ditc + 1).to_f
                end
        end
@@ -157,8 +156,8 @@ class MBMS
 
        redef fun collect(mmodules) do
                for mmodule in mmodules do
-                       var totc = mmodule.collect_intro_mclassdefs(model_view).length
-                       totc += mmodule.collect_redef_mclassdefs(model_view).length
+                       var totc = mmodule.collect_intro_mclassdefs(filter).length
+                       totc += mmodule.collect_redef_mclassdefs(filter).length
                        var ditc = mmodule.in_importation.depth
                        values[mmodule] = totc.to_f / (ditc + 1).to_f
                end
@@ -174,15 +173,15 @@ class CNVI
        redef fun desc do return "class novelty index, contribution of the class to its branch in term of introductions"
 
        redef fun collect(mclasses) do
-               var cbms = new CBMS(model_view)
+               var cbms = new CBMS(model, mainmodule, filter)
                for mclass in mclasses do
                        # compute branch mean size
-                       var parents = mclass.in_hierarchy(model_view.mainmodule).direct_greaters
+                       var parents = mclass.in_hierarchy(mainmodule).direct_greaters
                        if parents.length > 0 then
                                cbms.clear
                                cbms.collect(new HashSet[MClass].from(parents))
                                # compute class novelty index
-                               var locc = mclass.collect_accessible_mproperties(model_view).length
+                               var locc = mclass.collect_accessible_mproperties(mainmodule, filter).length
                                values[mclass] = locc.to_f / cbms.avg
                        else
                                values[mclass] = 0.0
@@ -200,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(model_view)
+               var mbms = new MBMS(model, mainmodule, filter)
                for mmodule in mmodules do
                        # compute branch mean size
                        var parents = mmodule.in_importation.direct_greaters
@@ -208,8 +207,8 @@ class MNVI
                                mbms.clear
                                mbms.collect(new HashSet[MModule].from(parents))
                                # compute module novelty index
-                               var locc = mmodule.collect_intro_mclassdefs(model_view).length
-                               locc += mmodule.collect_redef_mclassdefs(model_view).length
+                               var locc = mmodule.collect_intro_mclassdefs(filter).length
+                               locc += mmodule.collect_redef_mclassdefs(filter).length
                                values[mmodule] = locc.to_f / mbms.avg
                        else
                                values[mmodule] = 0.0
@@ -227,10 +226,10 @@ class CNVS
        redef fun desc do return "class novelty score, importance of the contribution of the class to its branch"
 
        redef fun collect(mclasses) do
-               var cnvi = new CNVI(model_view)
+               var cnvi = new CNVI(model, mainmodule, filter)
                cnvi.collect(mclasses)
                for mclass in mclasses do
-                       var locc = mclass.collect_local_mproperties(model_view).length
+                       var locc = mclass.collect_local_mproperties(filter).length
                        values[mclass] = cnvi.values[mclass] * locc.to_f
                end
        end
@@ -245,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(model_view)
+               var mnvi = new MNVI(model, mainmodule, filter)
                mnvi.collect(mmodules)
                for mmodule in mmodules do
-                       var locc = mmodule.collect_intro_mclassdefs(model_view).length
-                       locc += mmodule.collect_redef_mclassdefs(model_view).length
+                       var locc = mmodule.collect_intro_mclassdefs(filter).length
+                       locc += mmodule.collect_redef_mclassdefs(filter).length
                        values[mmodule] = mnvi.values[mmodule] * locc.to_f
                end
        end
@@ -257,11 +256,11 @@ end
 
 redef class MClass
        # the set of redefition that call to super
-       fun extended_mproperties(view: ModelView): Set[MProperty] do
+       fun extended_mproperties(filter: ModelFilter): Set[MProperty] do
                var set = new HashSet[MProperty]
                for mclassdef in mclassdefs do
                        for mpropdef in mclassdef.mpropdefs do
-                               if not view.accept_mentity(mpropdef) then continue
+                               if not filter.accept_mentity(mpropdef) then continue
                                if not mpropdef.has_supercall then continue
                                if mpropdef.mproperty.intro_mclassdef.mclass != self then set.add(mpropdef.mproperty)
                        end
@@ -270,11 +269,11 @@ redef class MClass
        end
 
        # the set of redefition that do not call to super
-       fun overriden_mproperties(view: ModelView): Set[MProperty] do
+       fun overriden_mproperties(filter: ModelFilter): Set[MProperty] do
                var set = new HashSet[MProperty]
                for mclassdef in mclassdefs do
                        for mpropdef in mclassdef.mpropdefs do
-                               if not view.accept_mentity(mpropdef) then continue
+                               if not filter.accept_mentity(mpropdef) then continue
                                if mpropdef.has_supercall then continue
                                if mpropdef.mproperty.intro_mclassdef.mclass != self then set.add(mpropdef.mproperty)
                        end
@@ -283,78 +282,78 @@ redef class MClass
        end
 
        # pure overriders contain only redefinitions
-       private fun is_pure_overrider(view: ModelView): Bool do
-               var news = collect_intro_mproperties(view).length
-               var locs = collect_local_mproperties(view).length
+       private fun is_pure_overrider(filter: ModelFilter): Bool do
+               var news = collect_intro_mproperties(filter).length
+               var locs = collect_local_mproperties(filter).length
                if news == 0 and locs > 0 then return true
                return false
        end
 
        # overriders contain more definitions than introductions
-       private fun is_overrider(view: ModelView): Bool do
-               var rdfs = collect_redef_mproperties(view).length
-               var news = collect_intro_mproperties(view).length
-               var locs = collect_local_mproperties(view).length
+       private fun is_overrider(filter: ModelFilter): Bool do
+               var rdfs = collect_redef_mproperties(filter).length
+               var news = collect_intro_mproperties(filter).length
+               var locs = collect_local_mproperties(filter).length
                if rdfs >= news and locs > 0 then return true
                return false
        end
 
        # pure extenders contain only introductions
-       private fun is_pure_extender(view: ModelView): Bool do
-               var rdfs = collect_redef_mproperties(view).length
-               var locs = collect_local_mproperties(view).length
+       private fun is_pure_extender(filter: ModelFilter): Bool do
+               var rdfs = collect_redef_mproperties(filter).length
+               var locs = collect_local_mproperties(filter).length
                if rdfs == 0 and locs > 0 then return true
                return false
        end
 
        # extenders contain more introduction than redefinitions
-       private fun is_extender(view: ModelView): Bool do
-               var rdfs = collect_redef_mproperties(view).length
-               var news = collect_intro_mproperties(view).length
-               var locs = collect_local_mproperties(view).length
+       private fun is_extender(filter: ModelFilter): Bool do
+               var rdfs = collect_redef_mproperties(filter).length
+               var news = collect_intro_mproperties(filter).length
+               var locs = collect_local_mproperties(filter).length
                if news > rdfs and locs > 0 then return true
                return false
        end
 
        # pure specializers always call to super in its redefinitions
-       private fun is_pure_specializer(view: ModelView): Bool do
-               var ovrs = overriden_mproperties(view).length
-               var rdfs = collect_redef_mproperties(view).length
+       private fun is_pure_specializer(filter: ModelFilter): Bool do
+               var ovrs = overriden_mproperties(filter).length
+               var rdfs = collect_redef_mproperties(filter).length
                if ovrs == 0 and rdfs > 0 then return true
                return false
        end
 
        # specializers have more redefinitions that call super than not calling it
-       private fun is_specializer(view: ModelView): Bool do
-               var spcs = extended_mproperties(view).length
-               var ovrs = overriden_mproperties(view).length
-               var rdfs = collect_redef_mproperties(view).length
+       private fun is_specializer(filter: ModelFilter): Bool do
+               var spcs = extended_mproperties(filter).length
+               var ovrs = overriden_mproperties(filter).length
+               var rdfs = collect_redef_mproperties(filter).length
                if spcs > ovrs and rdfs > 0 then return true
                return false
        end
 
        # pure replacers never call to super in its redefinitions
-       private fun is_pure_replacer(view: ModelView): Bool do
-               var spcs = extended_mproperties(view).length
-               var rdfs = collect_redef_mproperties(view).length
+       private fun is_pure_replacer(filter: ModelFilter): Bool do
+               var spcs = extended_mproperties(filter).length
+               var rdfs = collect_redef_mproperties(filter).length
                if spcs == 0 and rdfs > 0 then return true
                return false
        end
 
        # replacers have less redefinitions that call super than not calling it
-       private fun is_replacer(view: ModelView): Bool do
-               var spcs = extended_mproperties(view).length
-               var ovrs = overriden_mproperties(view).length
-               var rdfs = collect_redef_mproperties(view).length
+       private fun is_replacer(filter: ModelFilter): Bool do
+               var spcs = extended_mproperties(filter).length
+               var ovrs = overriden_mproperties(filter).length
+               var rdfs = collect_redef_mproperties(filter).length
                if ovrs > spcs and rdfs > 0 then return true
                return false
        end
 
        # equals contain as redifinition than introduction
-       private fun is_equal(view: ModelView): Bool do
-               var spcs = extended_mproperties(view).length
-               var ovrs = overriden_mproperties(view).length
-               var rdfs = collect_redef_mproperties(view).length
+       private fun is_equal(filter: ModelFilter): Bool do
+               var spcs = extended_mproperties(filter).length
+               var ovrs = overriden_mproperties(filter).length
+               var rdfs = collect_redef_mproperties(filter).length
                if spcs == ovrs and rdfs > 0 then return true
                return false
        end
index 73333a0..bb0612f 100644 (file)
@@ -21,9 +21,9 @@ import nitsmell_toolcontext
 import mclassdef_collect
 
 
-fun call_analyze_methods(mclassdef: MClassDef, model_builder: ModelBuilder, view: ModelView): Array[MMethodDef] do
+fun call_analyze_methods(mclassdef: MClassDef, model_builder: ModelBuilder, filter: ModelFilter): Array[MMethodDef] do
        var mmethoddefs = new Array[MMethodDef]
-       for m_prop in mclassdef.collect_intro_and_redef_mpropdefs(view) do
+       for m_prop in mclassdef.collect_intro_and_redef_mpropdefs(filter) do
                var n_prop = model_builder.mpropdef2node(m_prop)
                #Check if the property is a method definition
                if n_prop isa AMethPropdef and m_prop isa MMethodDef then
index 3a6227f..b740912 100644 (file)
@@ -37,21 +37,20 @@ private class MModulesMetricsPhase
                out.mkdir
 
                var model = toolcontext.modelbuilder.model
-               var model_view = new ModelView(model, mainmodule)
 
                print toolcontext.format_h1("\n# MModules metrics")
 
                var metrics = new MetricSet
-               metrics.register(new MNOA(model_view))
-               metrics.register(new MNOP(model_view))
-               metrics.register(new MNOC(model_view))
-               metrics.register(new MNOD(model_view))
-               metrics.register(new MDIT(model_view))
-               metrics.register(new MNBI(model_view))
-               metrics.register(new MNBR(model_view))
-               metrics.register(new MNBCC(model_view))
-               metrics.register(new MNBAC(model_view))
-               metrics.register(new MNBIC(model_view))
+               metrics.register(new MNOA(model, mainmodule))
+               metrics.register(new MNOP(model, mainmodule))
+               metrics.register(new MNOC(model, mainmodule))
+               metrics.register(new MNOD(model, mainmodule))
+               metrics.register(new MDIT(model, mainmodule))
+               metrics.register(new MNBI(model, mainmodule))
+               metrics.register(new MNBR(model, mainmodule))
+               metrics.register(new MNBCC(model, mainmodule))
+               metrics.register(new MNBAC(model, mainmodule))
+               metrics.register(new MNBIC(model, mainmodule))
 
                var mmodules = new HashSet[MModule]
                for mpackage in model.mpackages do
@@ -86,7 +85,13 @@ abstract class MModuleMetric
        redef type ELM: MModule
 
        # Model view used to collect and filter entities
-       var model_view: ModelView
+       var model: Model
+
+       # Mainmodule used for linearization
+       var mainmodule: MModule
+
+       # Filter to apply on model if any
+       var filter: nullable ModelFilter
 end
 
 # Module Metric: Number of Ancestors
@@ -171,7 +176,7 @@ class MNBD
        redef fun collect(mmodules) do
                for mmodule in mmodules do
                        values[mmodule] = 0
-                       for a in mmodule.collect_ancestors(model_view) do
+                       for a in mmodule.collect_ancestors(mainmodule, filter) do
                                values[mmodule] += a.intro_mclasses.length
                        end
                end
index a7634f1..0cae25d 100644 (file)
@@ -41,11 +41,10 @@ private class NullablesMetricsPhase
 
                var model = toolcontext.modelbuilder.model
                var filter = new ModelFilter(private_visibility)
-               var model_view = new ModelView(model, mainmodule, filter)
 
                var metrics = new MetricSet
-               metrics.register(new CNBA(model_view))
-               metrics.register(new CNBNA(model_view))
+               metrics.register(new CNBA(model, mainmodule, filter))
+               metrics.register(new CNBNA(model, mainmodule, filter))
 
                var mclasses = new HashSet[MClass]
                for mpackage in model.mpackages do
@@ -89,7 +88,7 @@ class CNBNA
 
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       var all = mclass.collect_accessible_mattributes(model_view)
+                       var all = mclass.collect_accessible_mattributes(mainmodule, filter)
                        for mattr in all do
                                if mattr.is_nullable then values.inc(mclass)
                        end
index 94a4dca..dc3077e 100644 (file)
@@ -39,25 +39,24 @@ private class RTAMetricsPhase
 
                var model = toolcontext.modelbuilder.model
                var filter = new ModelFilter(min_visibility = protected_visibility)
-               var model_view = new ModelView(model, mainmodule, filter)
 
                print toolcontext.format_h1("\n# RTA metrics")
 
                print toolcontext.format_h2("\n ## Live instances by mainmodules")
                var mmetrics = new MetricSet
-               mmetrics.register(new MNLC(model_view, toolcontext.modelbuilder))
-               mmetrics.register(new MNLT(model_view, toolcontext.modelbuilder))
-               mmetrics.register(new MNCT(model_view, toolcontext.modelbuilder))
-               mmetrics.register(new MNLI(model_view, toolcontext.modelbuilder))
-               mmetrics.register(new MNLM(model_view, toolcontext.modelbuilder))
-               mmetrics.register(new MNLMD(model_view, toolcontext.modelbuilder))
-               mmetrics.register(new MNLDD(model_view, toolcontext.modelbuilder))
+               mmetrics.register(new MNLC(model, mainmodule, filter, toolcontext.modelbuilder))
+               mmetrics.register(new MNLT(model, mainmodule, filter, toolcontext.modelbuilder))
+               mmetrics.register(new MNCT(model, mainmodule, filter, toolcontext.modelbuilder))
+               mmetrics.register(new MNLI(model, mainmodule, filter, toolcontext.modelbuilder))
+               mmetrics.register(new MNLM(model, mainmodule, filter, toolcontext.modelbuilder))
+               mmetrics.register(new MNLMD(model, mainmodule, filter, toolcontext.modelbuilder))
+               mmetrics.register(new MNLDD(model, mainmodule, filter, 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")
 
                var mtypes = new HashSet[MType]
-               var analysis = new MetricsRapidTypeAnalysis(toolcontext.modelbuilder, mainmodule, model_view)
+               var analysis = new MetricsRapidTypeAnalysis(toolcontext.modelbuilder, mainmodule)
                analysis.run_analysis
                mtypes.add_all(analysis.live_types)
                mtypes.add_all(analysis.live_cast_types)
@@ -140,7 +139,7 @@ class MNLI
 
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        values[mainmodule] = analysis.tnli.sum
                end
@@ -156,7 +155,7 @@ class MNLT
 
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        values[mainmodule] = analysis.live_types.length
                end
@@ -172,7 +171,7 @@ class MNCT
 
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        values[mainmodule] = analysis.live_cast_types.length
                end
@@ -189,7 +188,7 @@ class MNLC
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var live = new HashSet[MClass]
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        for mtype in analysis.live_types do
                                live.add(mtype.mclass)
@@ -208,7 +207,7 @@ class MNLM
 
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        values[mainmodule] = analysis.live_methods.length
                end
@@ -224,7 +223,7 @@ class MNLMD
 
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        values[mainmodule] = analysis.live_methoddefs.length
                end
@@ -241,7 +240,7 @@ class MNLDD
        redef fun collect(mainmodules) do
                for mainmodule in mainmodules do
                        var dead = 0
-                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule, model_view)
+                       var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
                        analysis.run_analysis
                        for mmethod in analysis.live_methods do
                                for mdef in mmethod.mpropdefs do
@@ -356,14 +355,11 @@ end
 class MetricsRapidTypeAnalysis
        super RapidTypeAnalysis
 
-       # Model view used to linearize classes
-       var view: ModelView
-
        # Class Live Instances
-       var cnli: CNLI is lazy do return new CNLI(view)
+       var cnli: CNLI is lazy do return new CNLI(modelbuilder.model, mainmodule)
 
        # Class Live Casts
-       var cnlc: CNLC is lazy do return new CNLC(view)
+       var cnlc: CNLC is lazy do return new CNLC(modelbuilder.model, mainmodule)
 
        # Type Live Instances
        var tnli = new TNLI