import mclasses_metrics
redef class ToolContext
+
+ # Inheritance related metrics phase
var inheritance_metrics_phase: Phase = new InheritanceMetricsPhase(self, null)
end
var out = "{toolcontext.opt_dir.value or else "metrics"}/inheritance"
out.mkdir
+ var model = toolcontext.modelbuilder.model
+ var model_view = model.private_view
+
print toolcontext.format_h1("\n# Inheritance metrics")
var hmetrics = new MetricSet
hmetrics.register(new MIFI(mainmodule))
var cmetrics = new MetricSet
- cmetrics.register(new CNOAC(mainmodule))
- cmetrics.register(new CNOPC(mainmodule))
- cmetrics.register(new CNOCC(mainmodule))
- cmetrics.register(new CNODC(mainmodule))
- cmetrics.register(new CNOPI(mainmodule))
- cmetrics.register(new CNOCI(mainmodule))
- cmetrics.register(new CNODI(mainmodule))
- cmetrics.register(new CDITC(mainmodule))
- cmetrics.register(new CDITI(mainmodule))
+ cmetrics.register(new CNOAC(mainmodule, model_view))
+ cmetrics.register(new CNOPC(mainmodule, model_view))
+ cmetrics.register(new CNOCC(mainmodule, model_view))
+ cmetrics.register(new CNODC(mainmodule, model_view))
+ cmetrics.register(new CNOPI(mainmodule, model_view))
+ cmetrics.register(new CNOCI(mainmodule, model_view))
+ cmetrics.register(new CNODI(mainmodule, model_view))
+ cmetrics.register(new CDITC(mainmodule, model_view))
+ cmetrics.register(new CDITI(mainmodule, model_view))
- var model = toolcontext.modelbuilder.model
var mmodules = new HashSet[MModule]
var mclasses = new HashSet[MClass]
for mpackage in model.mpackages do
redef fun name do return "cnoac"
redef fun desc do return "number of class_kind ancestor"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnopc"
redef fun desc do return "number of class_kind parent"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnocc"
redef fun desc do return "number of class_kind children"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnodc"
redef fun desc do return "number of class_kind descendants"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnoai"
redef fun desc do return "number of interface_kind ancestor"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnopi"
redef fun desc do return "number of interface_kind parent"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnoci"
redef fun desc do return "number of interface_kind children"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cnodi"
redef fun desc do return "number of interface_kind descendants"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
var count = 0
redef fun name do return "cditc"
redef fun desc do return "depth in class tree following only class, abstract, extern kind"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.ditc(mainmodule)
redef fun name do return "cditi"
redef fun desc do return "depth in class tree following only interface_kind"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.diti(mainmodule)
# model redef
redef class MClass
-
+
# Class Depth in Inheritance Tree
#
# Following the longest path composed only of extends edges from self to Object
import model::model_collect
redef class ToolContext
+
+ # MClass related metrics phase
var mclasses_metrics_phase: Phase = new MClassesMetricsPhase(self, null)
end
print toolcontext.format_h1("\n# MClasses metrics")
var metrics = new MetricSet
- metrics.register(new CNOA(mainmodule))
- metrics.register(new CNOP(mainmodule))
- metrics.register(new CNOC(mainmodule))
- metrics.register(new CNOD(mainmodule))
- metrics.register(new CDIT(mainmodule))
+ metrics.register(new CNOA(mainmodule, model_view))
+ metrics.register(new CNOP(mainmodule, model_view))
+ metrics.register(new CNOC(mainmodule, model_view))
+ metrics.register(new CNOD(mainmodule, model_view))
+ metrics.register(new CDIT(mainmodule, model_view))
metrics.register(new CNBP(mainmodule, model_view))
metrics.register(new CNBA(mainmodule, model_view))
metrics.register(new CNBIP(mainmodule, model_view))
end
# A metric about MClass
-interface MClassMetric
+abstract class MClassMetric
super Metric
redef type ELM: MClass
+
+ # Main module used for class linearization
+ var mainmodule: MModule
+
+ # Model view used to collect and filter entities
+ var model_view: ModelView
end
# Class Metric: Number of Ancestors
redef fun name do return "cnoa"
redef fun desc do return "number of ancestor classes"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.in_hierarchy(mainmodule).greaters.length - 1
redef fun name do return "cnop"
redef fun desc do return "number of parent classes"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.in_hierarchy(mainmodule).direct_greaters.length
redef fun name do return "cnoc"
redef fun desc do return "number of child classes"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.in_hierarchy(mainmodule).direct_smallers.length
redef fun name do return "cnod"
redef fun desc do return "number of descendant classes"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.in_hierarchy(mainmodule).smallers.length - 1
redef fun name do return "cdit"
redef fun desc do return "depth in class tree"
- var mainmodule: MModule
- init(mainmodule: MModule) do self.mainmodule = mainmodule
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.in_hierarchy(mainmodule).depth
redef fun name do return "cnbp"
redef fun desc do return "number of accessible properties (inherited + local)"
- var mainmodule: MModule
- var model_view: ModelView
-
- init(mainmodule: MModule, model_view: ModelView) do
- self.mainmodule = mainmodule
- self.model_view = model_view
- end
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.collect_accessible_mproperties(model_view).length
redef fun name do return "cnba"
redef fun desc do return "number of accessible attributes (inherited + local)"
- var mainmodule: MModule
- var model_view: ModelView
-
- init(mainmodule: MModule, model_view: ModelView) do
- self.mainmodule = mainmodule
- self.model_view = model_view
- end
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.collect_accessible_mattributes(model_view).length
redef fun name do return "cnbip"
redef fun desc do return "number of introduced properties"
- var mainmodule: MModule
- var model_view: ModelView
-
- init(mainmodule: MModule, model_view: ModelView) do
- self.mainmodule = mainmodule
- self.model_view = model_view
- end
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.collect_intro_mproperties(model_view).length
redef fun name do return "cnbrp"
redef fun desc do return "number of redefined properties"
- var mainmodule: MModule
- var model_view: ModelView
-
- init(mainmodule: MModule, model_view: ModelView) do
- self.mainmodule = mainmodule
- self.model_view = model_view
- end
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.collect_redef_mproperties(model_view).length
redef fun name do return "cnbhp"
redef fun desc do return "number of inherited properties"
- var mainmodule: MModule
- var model_view: ModelView
-
- init(mainmodule: MModule, model_view: ModelView) do
- self.mainmodule = mainmodule
- self.model_view = model_view
- end
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.collect_inherited_mproperties(model_view).length
redef fun name do return "cnblp"
redef fun desc do return "number of local properties (intro + redef)"
- var mainmodule: MModule
- var model_view: ModelView
-
- init(mainmodule: MModule, model_view: ModelView) do
- self.mainmodule = mainmodule
- self.model_view = model_view
- end
-
redef fun collect(mclasses) do
for mclass in mclasses do
values[mclass] = mclass.collect_local_mproperties(model_view).length
end
var cnblp = new CNBLP(mainmodule, model_view)
- var cnvi = new CNVI(mainmodule)
- var cnvs = new CNVS(mainmodule)
+ var cnvi = new CNVI(mainmodule, model_view)
+ var cnvs = new CNVS(mainmodule, model_view)
var metrics = new MetricSet
metrics.register(cnblp, cnvi, cnvs)
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
- var totc = mclass.collect_accessible_mproperties(protected_view).length
+ var totc = mclass.collect_accessible_mproperties(model_view).length
var ditc = mclass.in_hierarchy(mainmodule).depth
values[mclass] = totc.to_f / (ditc + 1).to_f
end
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
- var cbms = new CBMS(mainmodule)
+ var cbms = new CBMS(mainmodule, model_view)
for mclass in mclasses do
# compute branch mean size
var parents = mclass.in_hierarchy(mainmodule).direct_greaters
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
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
- var cnvi = new CNVI(mainmodule)
+ var cnvi = new CNVI(mainmodule, model_view)
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
# rta redef
redef class RapidTypeAnalysis
- var cnli = new CNLI
- var cnlc = new CNLC
+
+ # Class Live Instances
+ var cnli: CNLI is lazy do return new CNLI(mainmodule, modelbuilder.model.protected_view)
+
+ # Class Live Casts
+ var cnlc: CNLC is lazy do return new CNLC(mainmodule, modelbuilder.model.protected_view)
+
+ # Type Live Instances
var tnli = new TNLI
+
+ # Rtpe Live Casts
var tnlc = new TNLC
redef fun add_new(recv, mtype) do
return depth + 1
end
end
-