lib: intro `prompt`, basic Apache 2.0 service to display a prompt
[nit.git] / src / metrics / mendel_metrics.nit
index 2709ef9..e16e75f 100644 (file)
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# The mndel model helps to understand class hierarchies
+# The Mendel model helps to understand class hierarchies.
 #
 # It provides metrics to extract interesting classes:
 #
 #
 # It provides metrics to extract interesting classes:
 #
@@ -38,9 +38,9 @@
 # * replacers that have less redefinitions that call super than not calling it
 #
 # For more details see
 # * replacers that have less redefinitions that call super than not calling it
 #
 # For more details see
-#  Mendel: A Model, Metrics and Rules to Understan Class Hierarchies
-#  S. Denier and Y. Gueheneuc
-#  in Proceedings of the 16th IEEE International Conference on Program Comprehension (OCPC'08)
+# “Mendel: A Model, Metrics and Rules to Understand Class Hierarchies,”
+# by S. Denier and Y. Gueheneuc,
+# in *Proceedings of the 16th IEEE International Conference on Program Comprehension* (OCPC'08).
 module mendel_metrics
 
 import metrics_base
 module mendel_metrics
 
 import metrics_base
@@ -67,7 +67,8 @@ private class MendelMetricsPhase
                print toolcontext.format_h1("\n# Mendel metrics")
 
                var model = toolcontext.modelbuilder.model
                print toolcontext.format_h1("\n# Mendel metrics")
 
                var model = toolcontext.modelbuilder.model
-               var model_view = model.protected_view
+               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
 
                var mclasses = new HashSet[MClass]
                for mclass in model_view.mclasses do
@@ -75,14 +76,14 @@ private class MendelMetricsPhase
                        mclasses.add(mclass)
                end
 
                        mclasses.add(mclass)
                end
 
-               var cnblp = new CNBLP(mainmodule, model_view)
-               var cnvi = new CNVI(mainmodule)
-               var cnvs = new CNVS(mainmodule)
+               var cnblp = new CNBLP(model_view)
+               var cnvi = new CNVI(model_view)
+               var cnvs = new CNVS(model_view)
 
                var metrics = new MetricSet
                metrics.register(cnblp, cnvi, cnvs)
                metrics.collect(mclasses)
 
                var metrics = new MetricSet
                metrics.register(cnblp, cnvi, cnvs)
                metrics.collect(mclasses)
-               if csv then metrics.to_csv.save("{out}/mendel.csv")
+               if csv then metrics.to_csv.write_to_file("{out}/mendel.csv")
 
                var threshold = cnblp.threshold
                print toolcontext.format_h4("\tlarge mclasses (threshold: {threshold})")
 
                var threshold = cnblp.threshold
                print toolcontext.format_h4("\tlarge mclasses (threshold: {threshold})")
@@ -110,7 +111,7 @@ private class MendelMetricsPhase
 
                if csv then
                        var csvh = new CsvDocument
 
                if csv then
                        var csvh = new CsvDocument
-                       csvh.format = new CsvFormat('"', ';', "\n")
+                       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
                        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
@@ -124,7 +125,7 @@ private class MendelMetricsPhase
                                var eq = mclass.is_equal(model_view).object_id
                                csvh.add_record(povr, ovr, pext, ext, pspe, spe, prep, rep, eq)
                        end
                                var eq = mclass.is_equal(model_view).object_id
                                csvh.add_record(povr, ovr, pext, ext, pspe, spe, prep, rep, eq)
                        end
-                       csvh.save("{out}/inheritance_behaviour.csv")
+                       csvh.write_to_file("{out}/inheritance_behaviour.csv")
                end
        end
 end
                end
        end
 end
@@ -137,14 +138,10 @@ class CBMS
        redef fun name do return "cbms"
        redef fun desc do return "branch mean size, mean number of introduction available among ancestors"
 
        redef fun name do return "cbms"
        redef fun desc do return "branch mean size, mean number of introduction available among ancestors"
 
-       # Mainmodule used to compute class hierarchy.
-       var mainmodule: MModule
-       private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
        redef fun collect(mclasses) do
                for mclass in mclasses do
        redef fun collect(mclasses) do
                for mclass in mclasses do
-                       var totc = mclass.collect_accessible_mproperties(protected_view).length
-                       var ditc = mclass.in_hierarchy(mainmodule).depth
+                       var totc = mclass.collect_accessible_mproperties(model_view).length
+                       var ditc = mclass.in_hierarchy(model_view.mainmodule).depth
                        values[mclass] = totc.to_f / (ditc + 1).to_f
                end
        end
                        values[mclass] = totc.to_f / (ditc + 1).to_f
                end
        end
@@ -160,8 +157,8 @@ class MBMS
 
        redef fun collect(mmodules) do
                for mmodule in mmodules do
 
        redef fun collect(mmodules) do
                for mmodule in mmodules do
-                       var totc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
-                       totc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+                       var totc = mmodule.collect_intro_mclassdefs(model_view).length
+                       totc += mmodule.collect_redef_mclassdefs(model_view).length
                        var ditc = mmodule.in_importation.depth
                        values[mmodule] = totc.to_f / (ditc + 1).to_f
                end
                        var ditc = mmodule.in_importation.depth
                        values[mmodule] = totc.to_f / (ditc + 1).to_f
                end
@@ -176,20 +173,16 @@ class CNVI
        redef fun name do return "cnvi"
        redef fun desc do return "class novelty index, contribution of the class to its branch in term of introductions"
 
        redef fun name do return "cnvi"
        redef fun desc do return "class novelty index, contribution of the class to its branch in term of introductions"
 
-       # Mainmodule used to compute class hierarchy.
-       var mainmodule: MModule
-       private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
        redef fun collect(mclasses) do
        redef fun collect(mclasses) do
-               var cbms = new CBMS(mainmodule)
+               var cbms = new CBMS(model_view)
                for mclass in mclasses do
                        # compute branch mean size
                for mclass in mclasses do
                        # compute branch mean size
-                       var parents = mclass.in_hierarchy(mainmodule).direct_greaters
+                       var parents = mclass.in_hierarchy(model_view.mainmodule).direct_greaters
                        if parents.length > 0 then
                                cbms.clear
                                cbms.collect(new HashSet[MClass].from(parents))
                                # compute class novelty index
                        if parents.length > 0 then
                                cbms.clear
                                cbms.collect(new HashSet[MClass].from(parents))
                                # compute class novelty index
-                               var locc = mclass.collect_accessible_mproperties(protected_view).length
+                               var locc = mclass.collect_accessible_mproperties(model_view).length
                                values[mclass] = locc.to_f / cbms.avg
                        else
                                values[mclass] = 0.0
                                values[mclass] = locc.to_f / cbms.avg
                        else
                                values[mclass] = 0.0
@@ -207,7 +200,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
        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
+               var mbms = new MBMS(model_view)
                for mmodule in mmodules do
                        # compute branch mean size
                        var parents = mmodule.in_importation.direct_greaters
                for mmodule in mmodules do
                        # compute branch mean size
                        var parents = mmodule.in_importation.direct_greaters
@@ -215,8 +208,8 @@ class MNVI
                                mbms.clear
                                mbms.collect(new HashSet[MModule].from(parents))
                                # compute module novelty index
                                mbms.clear
                                mbms.collect(new HashSet[MModule].from(parents))
                                # compute module novelty index
-                               var locc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
-                               locc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+                               var locc = mmodule.collect_intro_mclassdefs(model_view).length
+                               locc += mmodule.collect_redef_mclassdefs(model_view).length
                                values[mmodule] = locc.to_f / mbms.avg
                        else
                                values[mmodule] = 0.0
                                values[mmodule] = locc.to_f / mbms.avg
                        else
                                values[mmodule] = 0.0
@@ -233,15 +226,11 @@ class CNVS
        redef fun name do return "cnvs"
        redef fun desc do return "class novelty score, importance of the contribution of the class to its branch"
 
        redef fun name do return "cnvs"
        redef fun desc do return "class novelty score, importance of the contribution of the class to its branch"
 
-       # Mainmodule used to compute class hierarchy.
-       var mainmodule: MModule
-       private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
        redef fun collect(mclasses) do
        redef fun collect(mclasses) do
-               var cnvi = new CNVI(mainmodule)
+               var cnvi = new CNVI(model_view)
                cnvi.collect(mclasses)
                for mclass in mclasses do
                cnvi.collect(mclasses)
                for mclass in mclasses do
-                       var locc = mclass.collect_local_mproperties(protected_view).length
+                       var locc = mclass.collect_local_mproperties(model_view).length
                        values[mclass] = cnvi.values[mclass] * locc.to_f
                end
        end
                        values[mclass] = cnvi.values[mclass] * locc.to_f
                end
        end
@@ -256,11 +245,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
        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
+               var mnvi = new MNVI(model_view)
                mnvi.collect(mmodules)
                for mmodule in mmodules do
                mnvi.collect(mmodules)
                for mmodule in mmodules do
-                       var locc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
-                       locc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+                       var locc = mmodule.collect_intro_mclassdefs(model_view).length
+                       locc += mmodule.collect_redef_mclassdefs(model_view).length
                        values[mmodule] = mnvi.values[mmodule] * locc.to_f
                end
        end
                        values[mmodule] = mnvi.values[mmodule] * locc.to_f
                end
        end