import mclasses_metrics
redef class ToolContext
+
+ # RTA related metrics phase
var rta_metrics_phase: Phase = new RTAMetricsPhase(self, null)
end
var out = "{toolcontext.opt_dir.value or else "metrics"}/rta"
out.mkdir
+ var model = toolcontext.modelbuilder.model
+ var filter = new ModelFilter(min_visibility = protected_visibility)
+
print toolcontext.format_h1("\n# RTA metrics")
print toolcontext.format_h2("\n ## Live instances by mainmodules")
var mmetrics = new MetricSet
- mmetrics.register(new MNLC(toolcontext.modelbuilder))
- mmetrics.register(new MNLT(toolcontext.modelbuilder))
- mmetrics.register(new MNCT(toolcontext.modelbuilder))
- mmetrics.register(new MNLI(toolcontext.modelbuilder))
- mmetrics.register(new MNLM(toolcontext.modelbuilder))
- mmetrics.register(new MNLMD(toolcontext.modelbuilder))
- mmetrics.register(new MNLDD(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 RapidTypeAnalysis(toolcontext.modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(toolcontext.modelbuilder, mainmodule)
analysis.run_analysis
mtypes.add_all(analysis.live_types)
mtypes.add_all(analysis.live_cast_types)
# Summary metrics
+# RTA related metric that needs a `modelbuilder`
+class RTAMetric
+ super MModuleMetric
+
+ # Modelbuilder used to access AST
+ var modelbuilder: ModelBuilder
+end
+
# MModule Metric: Number of Live Types
class MNLI
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnli"
redef fun desc do return "number of live instances in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
values[mainmodule] = analysis.tnli.sum
end
# MModule Metric: Number of Live Types
class MNLT
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnlt"
redef fun desc do return "number of live mtypes in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
values[mainmodule] = analysis.live_types.length
end
# MModule Metric: Number of Live Cast Types
class MNCT
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnct"
redef fun desc do return "number of live cast mtypes in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
values[mainmodule] = analysis.live_cast_types.length
end
# MModule Metric: Number of Live Classes
class MNLC
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnlc"
redef fun desc do return "number of live mclasses in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
var live = new HashSet[MClass]
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
for mtype in analysis.live_types do
live.add(mtype.mclass)
# MModule Metric: Number of Live Methods
class MNLM
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnlm"
redef fun desc do return "number of live methods in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
values[mainmodule] = analysis.live_methods.length
end
# MModule Metric: Number of Live MethodDefs
class MNLMD
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnlmd"
redef fun desc do return "number of live method definitions in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
values[mainmodule] = analysis.live_methoddefs.length
end
# MModule Metric: Number of Dead MethodDefs
class MNLDD
- super MModuleMetric
+ super RTAMetric
super IntMetric
redef fun name do return "mnldd"
redef fun desc do return "number of dead method definitions in a mmodule"
- var modelbuilder: ModelBuilder
- init(modelbuilder: ModelBuilder) do self.modelbuilder = modelbuilder
-
redef fun collect(mainmodules) do
for mainmodule in mainmodules do
var dead = 0
- var analysis = new RapidTypeAnalysis(modelbuilder, mainmodule)
+ var analysis = new MetricsRapidTypeAnalysis(modelbuilder, mainmodule)
analysis.run_analysis
for mmethod in analysis.live_methods do
for mdef in mmethod.mpropdefs do
# rta redef
-redef class RapidTypeAnalysis
+# Custom RTA analyzer
+class MetricsRapidTypeAnalysis
+ super RapidTypeAnalysis
# Class Live Instances
- var cnli: CNLI is lazy do return new CNLI(mainmodule, modelbuilder.model.protected_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(mainmodule, modelbuilder.model.protected_view)
+ var cnlc: CNLC is lazy do return new CNLC(modelbuilder.model, mainmodule)
# Type Live Instances
var tnli = new TNLI