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 filter
= new ModelFilter(private_visibility
)
41 var model_view
= new ModelView(model
, mainmodule
, filter
)
43 print toolcontext
.format_h1
("\n# MClasses metrics")
45 var metrics
= new MetricSet
46 metrics
.register
(new CNOA(model_view
))
47 metrics
.register
(new CNOP(model_view
))
48 metrics
.register
(new CNOC(model_view
))
49 metrics
.register
(new CNOD(model_view
))
50 metrics
.register
(new CDIT(model_view
))
51 metrics
.register
(new CNBP(model_view
))
52 metrics
.register
(new CNBA(model_view
))
53 metrics
.register
(new CNBI(model_view
))
54 metrics
.register
(new CNBM(model_view
))
55 metrics
.register
(new CNBV(model_view
))
56 metrics
.register
(new CNBIP(model_view
))
57 metrics
.register
(new CNBRP(model_view
))
58 metrics
.register
(new CNBHP(model_view
))
60 var mclasses
= new HashSet[MClass]
61 for mpackage
in model
.mpackages
do
63 print toolcontext
.format_h2
("\n ## package {mpackage}")
65 for mgroup
in mpackage
.mgroups
do
66 if mgroup
.mmodules
.is_empty
then continue
70 print toolcontext
.format_h3
(" `- group {mgroup.full_name}")
71 var mod_mclasses
= new HashSet[MClass]
72 for mmodule
in mgroup
.mmodules
do mod_mclasses
.add_all
(mmodule
.intro_mclasses
)
73 if mod_mclasses
.is_empty
then continue
74 mclasses
.add_all
(mod_mclasses
)
75 metrics
.collect
(new HashSet[MClass].from
(mod_mclasses
))
76 metrics
.to_console
(1, not toolcontext
.opt_nocolors
.value
)
77 if csv
then metrics
.to_csv
.write_to_file
("{out}/{mgroup}.csv")
80 if not mclasses
.is_empty
then
83 print toolcontext
.format_h2
("\n ## global metrics")
84 metrics
.collect
(mclasses
)
85 metrics
.to_console
(1, not toolcontext
.opt_nocolors
.value
)
86 if csv
then metrics
.to_csv
.write_to_file
("{out}/summary.csv")
91 # A metric about MClass
92 abstract class MClassMetric
94 redef type ELM: MClass
96 # Model view used to collect and filter entities
97 var model_view
: ModelView
100 # Class Metric: Number of Ancestors
104 redef fun name
do return "cnoa"
105 redef fun desc
do return "number of ancestor classes"
107 redef fun collect
(mclasses
) do
108 for mclass
in mclasses
do
109 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).greaters
.length
- 1
114 # Class Metric: Number of Parents
118 redef fun name
do return "cnop"
119 redef fun desc
do return "number of parent classes"
121 redef fun collect
(mclasses
) do
122 for mclass
in mclasses
do
123 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).direct_greaters
.length
128 # Class Metric: Number of Children
132 redef fun name
do return "cnoc"
133 redef fun desc
do return "number of child classes"
135 redef fun collect
(mclasses
) do
136 for mclass
in mclasses
do
137 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).direct_smallers
.length
142 # Class Metric: Number of Descendants
146 redef fun name
do return "cnod"
147 redef fun desc
do return "number of descendant classes"
149 redef fun collect
(mclasses
) do
150 for mclass
in mclasses
do
151 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).smallers
.length
- 1
156 # Class Metric: Depth in Inheritance Tree
160 redef fun name
do return "cdit"
161 redef fun desc
do return "depth in class tree"
163 redef fun collect
(mclasses
) do
164 for mclass
in mclasses
do
165 values
[mclass
] = mclass
.in_hierarchy
(model_view
.mainmodule
).depth
170 # Class Metric: Number of MProperties
174 redef fun name
do return "cnbp"
175 redef fun desc
do return "number of accessible properties (inherited + local)"
177 redef fun collect
(mclasses
) do
178 for mclass
in mclasses
do
179 values
[mclass
] = mclass
.collect_accessible_mproperties
(model_view
).length
184 # Class Metric: Number of MAttributes
188 redef fun name
do return "cnba"
189 redef fun desc
do return "number of accessible attributes (inherited + local)"
191 redef fun collect
(mclasses
) do
192 for mclass
in mclasses
do
193 values
[mclass
] = mclass
.collect_accessible_mattributes
(model_view
).length
198 # Class Metric: Number of MMethods
202 redef fun name
do return "cnbm"
203 redef fun desc
do return "number of accessible methods (inherited + local)"
205 redef fun collect
(mclasses
) do
206 for mclass
in mclasses
do
207 values
[mclass
] = mclass
.collect_accessible_mmethods
(model_view
).length
212 # Class Metric: Number of Constructors
216 redef fun name
do return "cnbi"
217 redef fun desc
do return "number of accessible constructors (inherited + local)"
219 redef fun collect
(mclasses
) do
220 for mclass
in mclasses
do
221 values
[mclass
] = mclass
.collect_accessible_inits
(model_view
).length
226 # Class Metric: Number of Virtual Types
230 redef fun name
do return "cnbv"
231 redef fun desc
do return "number of accessible virtual types (inherited + local)"
233 redef fun collect
(mclasses
) do
234 for mclass
in mclasses
do
235 values
[mclass
] = mclass
.collect_accessible_vts
(model_view
).length
240 # Class Metric: Number of Introduced MProperties
244 redef fun name
do return "cnbip"
245 redef fun desc
do return "number of introduced properties"
247 redef fun collect
(mclasses
) do
248 for mclass
in mclasses
do
249 values
[mclass
] = mclass
.collect_intro_mproperties
(model_view
).length
254 # Class Metric: Number of Refined MProperties
258 redef fun name
do return "cnbrp"
259 redef fun desc
do return "number of redefined properties"
261 redef fun collect
(mclasses
) do
262 for mclass
in mclasses
do
263 values
[mclass
] = mclass
.collect_redef_mproperties
(model_view
).length
268 # Class Metric: Number of Inherited MProperties
272 redef fun name
do return "cnbhp"
273 redef fun desc
do return "number of inherited properties"
275 redef fun collect
(mclasses
) do
276 for mclass
in mclasses
do
277 values
[mclass
] = mclass
.collect_inherited_mproperties
(model_view
).length
282 # Class Metric: Number of Local MProperties (Intro + Redef)
286 redef fun name
do return "cnblp"
287 redef fun desc
do return "number of local properties (intro + redef)"
289 redef fun collect
(mclasses
) do
290 for mclass
in mclasses
do
291 values
[mclass
] = mclass
.collect_local_mproperties
(model_view
).length