Merge: doc: fixed some typos and other misc. corrections
[nit.git] / src / metrics / codesmells_metrics.nit
index e335d8f..e9ec586 100644 (file)
@@ -33,8 +33,11 @@ class CodeSmellsMetricsPhase
 
        redef fun process_mainmodule(mainmodule, given_mmodules) do
                print toolcontext.format_h1("--- Code Smells Metrics ---")
-               self.set_all_average_metrics
-               var mclass_codesmell = new BadConceptonController
+
+               var model = toolcontext.modelbuilder.model
+               var filter = new ModelFilter(private_visibility)
+               self.set_all_average_metrics(model)
+               var mclass_codesmell = new BadConceptonController(model, filter)
                var collect = new Counter[MClassDef]
                var mclassdefs = new Array[MClassDef]
 
@@ -48,17 +51,21 @@ class CodeSmellsMetricsPhase
                end
        end
 
-       fun set_all_average_metrics do
+       fun set_all_average_metrics(model: Model) do
                var model_builder = toolcontext.modelbuilder
-               var model_view = model_builder.model.private_view
-               self.average_number_of_lines = model_view.get_avg_linenumber(model_builder)
-               self.average_number_of_parameter = model_view.get_avg_parameter
-               self.average_number_of_method = model_view.get_avg_method
-               self.average_number_of_attribute = model_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 model: Model
+
+       var filter: ModelFilter
+
        # Code smell list
        var bad_conception_elements = new Array[BadConceptionFinder]
 
@@ -79,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)
+                       var bad_conception_class = new BadConceptionFinder(mclassdef, phase, model, filter)
                        bad_conception_class.collect
                        bad_conception_elements.add(bad_conception_class)
                end
@@ -112,17 +119,19 @@ class BadConceptionFinder
        var mclassdef: MClassDef
        var array_badconception = new Array[BadConception]
        var phase: CodeSmellsMetricsPhase
+       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))
-               if phase.toolcontext.opt_long_method.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LongMethod(phase))
-               if phase.toolcontext.opt_long_params.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LongParameterList(phase))
-               if phase.toolcontext.opt_no_abstract_implementation.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new NoAbstractImplementation(phase))
-               if phase.toolcontext.opt_large_class.value or phase.toolcontext.opt_all.value then bad_conception_elements.add(new LargeClass(phase))
+               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)
@@ -153,6 +162,10 @@ end
 abstract class BadConception
        var phase: CodeSmellsMetricsPhase
 
+       var model: Model
+
+       var filter: ModelFilter
+
        var score = 0.0
 
        # Name
@@ -184,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(model_builder.model.private_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(model_builder.model.private_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
@@ -209,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(model_builder.model.private_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
@@ -250,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)
+               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
@@ -295,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)
+               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
@@ -335,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(model_builder.model.private_view).not_empty then
-                               bad_methods.add_all(mclassdef.collect_not_define_properties(model_builder.model.private_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
@@ -360,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
@@ -378,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
@@ -387,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
@@ -396,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) 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