1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014 Alexandre Terrasa <alexandre@moz-code.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Collect common metrics about mclasses
18 module mclasses_metrics
21 import model
::model_collect
23 redef class ToolContext
25 # MClass related metrics phase
26 var mclasses_metrics_phase
: Phase = new MClassesMetricsPhase(self, null)
29 # Extract metrics about mclasses from model.
30 private class MClassesMetricsPhase
32 redef fun process_mainmodule
(mainmodule
, given_mmodules
)
34 if not toolcontext
.opt_mclasses
.value
and not toolcontext
.opt_all
.value
then return
35 var csv
= toolcontext
.opt_csv
.value
36 var out
= "{toolcontext.opt_dir.value or else "metrics"}/mclasses"
39 var model
= toolcontext
.modelbuilder
.model
40 var model_view
= new ModelView(model
, mainmodule
)
42 print toolcontext
.format_h1
("\n# MClasses metrics")
44 var metrics
= new MetricSet
45 metrics
.register
(new CNOA(model_view
))
46 metrics
.register
(new CNOP(model_view
))
47 metrics
.register
(new CNOC(model_view
))
48 metrics
.register
(new CNOD(model_view
))
49 metrics
.register
(new CDIT(model_view
))
50 metrics
.register
(new CNBP(model_view
))
51 metrics
.register
(new CNBA(model_view
))
52 metrics
.register
(new CNBI(model_view
))
53 metrics
.register
(new CNBM(model_view
))
54 metrics
.register
(new CNBV(model_view
))
55 metrics
.register
(new CNBIP(model_view
))
56 metrics
.register
(new CNBRP(model_view
))
57 metrics
.register
(new CNBHP(model_view
))
59 var mclasses
= new HashSet[MClass]
60 for mpackage
in model
.mpackages
do
62 print toolcontext
.format_h2
("\n ## package {mpackage}")
64 for mgroup
in mpackage
.mgroups
do
65 if mgroup
.mmodules
.is_empty
then continue
69 print toolcontext
.format_h3
(" `- group {mgroup.full_name}")
70 var mod_mclasses
= new HashSet[MClass]
71 for mmodule
in mgroup
.mmodules
do mod_mclasses
.add_all
(mmodule
.intro_mclasses
)
72 if mod_mclasses
.is_empty
then continue
73 mclasses
.add_all
(mod_mclasses
)
74 metrics
.collect
(new HashSet[MClass].from
(mod_mclasses
))
75 metrics
.to_console
(1, not toolcontext
.opt_nocolors
.value
)
76 if csv
then metrics
.to_csv
.write_to_file
("{out}/{mgroup}.csv")
79 if not mclasses
.is_empty
then
82 print toolcontext
.format_h2
("\n ## global metrics")
83 metrics
.collect
(mclasses
)
84 metrics
.to_console
(1, not toolcontext
.opt_nocolors
.value
)
85 if csv
then metrics
.to_csv
.write_to_file
("{out}/summary.csv")
90 # A metric about MClass
91 abstract class MClassMetric
93 redef type ELM: MClass
95 # Model view used to collect and filter entities
96 var model_view
: ModelView
99 # Class Metric: Number of Ancestors
103 redef fun name
do return "cnoa"
104 redef fun desc
do return "number of ancestor classes"
106 redef fun collect
(mclasses
) do
107 for mclass
in mclasses
do
108 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).greaters
.length
- 1
113 # Class Metric: Number of Parents
117 redef fun name
do return "cnop"
118 redef fun desc
do return "number of parent classes"
120 redef fun collect
(mclasses
) do
121 for mclass
in mclasses
do
122 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).direct_greaters
.length
127 # Class Metric: Number of Children
131 redef fun name
do return "cnoc"
132 redef fun desc
do return "number of child classes"
134 redef fun collect
(mclasses
) do
135 for mclass
in mclasses
do
136 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).direct_smallers
.length
141 # Class Metric: Number of Descendants
145 redef fun name
do return "cnod"
146 redef fun desc
do return "number of descendant classes"
148 redef fun collect
(mclasses
) do
149 for mclass
in mclasses
do
150 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).smallers
.length
- 1
155 # Class Metric: Depth in Inheritance Tree
159 redef fun name
do return "cdit"
160 redef fun desc
do return "depth in class tree"
162 redef fun collect
(mclasses
) do
163 for mclass
in mclasses
do
164 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).depth
169 # Class Metric: Number of MProperties
173 redef fun name
do return "cnbp"
174 redef fun desc
do return "number of accessible properties (inherited + local)"
176 redef fun collect
(mclasses
) do
177 for mclass
in mclasses
do
178 values
[mclass
] = mclass
.collect_accessible_mproperties
(model_view
).length
183 # Class Metric: Number of MAttributes
187 redef fun name
do return "cnba"
188 redef fun desc
do return "number of accessible attributes (inherited + local)"
190 redef fun collect
(mclasses
) do
191 for mclass
in mclasses
do
192 values
[mclass
] = mclass
.collect_accessible_mattributes
(model_view
).length
197 # Class Metric: Number of MMethods
201 redef fun name
do return "cnbm"
202 redef fun desc
do return "number of accessible methods (inherited + local)"
204 redef fun collect
(mclasses
) do
205 for mclass
in mclasses
do
206 values
[mclass
] = mclass
.collect_accessible_mmethods
(model_view
).length
211 # Class Metric: Number of Constructors
215 redef fun name
do return "cnbi"
216 redef fun desc
do return "number of accessible constructors (inherited + local)"
218 redef fun collect
(mclasses
) do
219 for mclass
in mclasses
do
220 values
[mclass
] = mclass
.collect_accessible_inits
(model_view
).length
225 # Class Metric: Number of Virtual Types
229 redef fun name
do return "cnbv"
230 redef fun desc
do return "number of accessible virtual types (inherited + local)"
232 redef fun collect
(mclasses
) do
233 for mclass
in mclasses
do
234 values
[mclass
] = mclass
.collect_accessible_vts
(model_view
).length
239 # Class Metric: Number of Introduced MProperties
243 redef fun name
do return "cnbip"
244 redef fun desc
do return "number of introduced properties"
246 redef fun collect
(mclasses
) do
247 for mclass
in mclasses
do
248 values
[mclass
] = mclass
.collect_intro_mproperties
(model_view
).length
253 # Class Metric: Number of Refined MProperties
257 redef fun name
do return "cnbrp"
258 redef fun desc
do return "number of redefined properties"
260 redef fun collect
(mclasses
) do
261 for mclass
in mclasses
do
262 values
[mclass
] = mclass
.collect_redef_mproperties
(model_view
).length
267 # Class Metric: Number of Inherited MProperties
271 redef fun name
do return "cnbhp"
272 redef fun desc
do return "number of inherited properties"
274 redef fun collect
(mclasses
) do
275 for mclass
in mclasses
do
276 values
[mclass
] = mclass
.collect_inherited_mproperties
(model_view
).length
281 # Class Metric: Number of Local MProperties (Intro + Redef)
285 redef fun name
do return "cnblp"
286 redef fun desc
do return "number of local properties (intro + redef)"
288 redef fun collect
(mclasses
) do
289 for mclass
in mclasses
do
290 values
[mclass
] = mclass
.collect_local_mproperties
(model_view
).length