X-Git-Url: http://nitlanguage.org diff --git a/src/metrics/rta_metrics.nit b/src/metrics/rta_metrics.nit index 7feb836..46d319a 100644 --- a/src/metrics/rta_metrics.nit +++ b/src/metrics/rta_metrics.nit @@ -17,20 +17,18 @@ # Metrics from RTA module rta_metrics -import modelbuilder private import rapid_type_analysis -private import metrics_base +import metrics_base import mmodules_metrics import mclasses_metrics -import frontend redef class ToolContext - var rta_metrics_phase = new RTAMetricsPhase(self, null) + var rta_metrics_phase: Phase = new RTAMetricsPhase(self, null) end private class RTAMetricsPhase super Phase - redef fun process_mainmodule(mainmodule) + redef fun process_mainmodule(mainmodule, given_mmodules) do if not toolcontext.opt_rta.value and not toolcontext.opt_all.value then return var csv = toolcontext.opt_csv.value @@ -50,7 +48,7 @@ private class RTAMetricsPhase mmetrics.register(new MNLDD(toolcontext.modelbuilder)) mmetrics.collect(new HashSet[MModule].from([mainmodule])) mmetrics.to_console(1, not toolcontext.opt_nocolors.value) - if csv then mmetrics.to_csv.save("{out}/{mainmodule}.csv") + if csv then mmetrics.to_csv.write_to_file("{out}/{mainmodule}.csv") var mtypes = new HashSet[MType] var analysis = new RapidTypeAnalysis(toolcontext.modelbuilder, mainmodule) @@ -63,14 +61,14 @@ private class RTAMetricsPhase cmetrics.register(analysis.cnli) cmetrics.register(analysis.cnlc) cmetrics.to_console(1, not toolcontext.opt_nocolors.value) - if csv then cmetrics.to_csv.save("{out}/mclasses.csv") + if csv then cmetrics.to_csv.write_to_file("{out}/mclasses.csv") print toolcontext.format_h2("\n ## Total live instances by mtypes") var tmetrics = new MetricSet tmetrics.register(analysis.tnli) tmetrics.register(analysis.tnlc) tmetrics.to_console(1, not toolcontext.opt_nocolors.value) - if csv then tmetrics.to_csv.save("{out}/mtypes.csv") + if csv then tmetrics.to_csv.write_to_file("{out}/mtypes.csv") print toolcontext.format_h2("\n ## MType complexity") var gmetrics = new MetricSet @@ -78,7 +76,41 @@ private class RTAMetricsPhase gmetrics.register(new TDGS) gmetrics.collect(mtypes) gmetrics.to_console(1, not toolcontext.opt_nocolors.value) - if csv then gmetrics.to_csv.save("{out}/complexity.csv") + if csv then gmetrics.to_csv.write_to_file("{out}/complexity.csv") + + callsite_info(analysis) + + # dump type and method infos + if csv then + analysis.live_types_to_csv.write_to_file("{out}/rta_types.csv") + analysis.live_methods_to_tree.write_to_file("{out}/rta_methods.dat") + end + end + + fun callsite_info(rta: RapidTypeAnalysis) + do + print toolcontext.format_h2("\n ## Callsites") + print "* {rta.live_callsites.length} live callsites" + + var csep = new Counter[MPropDef] + var cglo = new Counter[MPropDef] + var morphisme = new Counter[Int] + for cs in rta.live_callsites do + csep.inc(cs.mpropdef) + var targets = rta.live_targets(cs) + for d in targets do + cglo.inc(d) + end + morphisme.inc(targets.length) + end + + print toolcontext.format_h3("MMethodDef locally designated (by number of CallSites)") + csep.print_summary + csep.print_elements(5) + + print toolcontext.format_h3("MMethodDef possibly invoked at runtime (by number of CallSites)") + cglo.print_summary + cglo.print_elements(5) end end @@ -342,7 +374,7 @@ redef class RapidTypeAnalysis super tnlc.values.inc(mtype) - if mtype isa MNullableType then mtype = mtype.mtype + mtype = mtype.undecorate if mtype isa MClassType then cnlc.values.inc(mtype.mclass) end @@ -353,8 +385,7 @@ end redef class MType private fun signature_depth: Int do - var mtype = self - if mtype isa MNullableType then mtype = mtype.mtype + var mtype = self.undecorate if not mtype isa MGenericType then return 0 var depth = 0