nitmetrics: use model filters
[nit.git] / src / metrics / mclasses_metrics.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2014 Alexandre Terrasa <alexandre@moz-code.org>
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16
17 # Collect common metrics about mclasses
18 module mclasses_metrics
19
20 import metrics_base
21 import model::model_collect
22
23 redef class ToolContext
24
25 # MClass related metrics phase
26 var mclasses_metrics_phase: Phase = new MClassesMetricsPhase(self, null)
27 end
28
29 # Extract metrics about mclasses from model.
30 private class MClassesMetricsPhase
31 super Phase
32 redef fun process_mainmodule(mainmodule, given_mmodules)
33 do
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"
37 out.mkdir
38
39 var model = toolcontext.modelbuilder.model
40 var filter = new ModelFilter(private_visibility)
41 var model_view = new ModelView(model, mainmodule, filter)
42
43 print toolcontext.format_h1("\n# MClasses metrics")
44
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))
59
60 var mclasses = new HashSet[MClass]
61 for mpackage in model.mpackages do
62
63 print toolcontext.format_h2("\n ## package {mpackage}")
64
65 for mgroup in mpackage.mgroups do
66 if mgroup.mmodules.is_empty then continue
67 metrics.clear
68
69 # Scalar metrics
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")
78 end
79 end
80 if not mclasses.is_empty then
81 metrics.clear
82 # Global metrics
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")
87 end
88 end
89 end
90
91 # A metric about MClass
92 abstract class MClassMetric
93 super Metric
94 redef type ELM: MClass
95
96 # Model view used to collect and filter entities
97 var model_view: ModelView
98 end
99
100 # Class Metric: Number of Ancestors
101 class CNOA
102 super MClassMetric
103 super IntMetric
104 redef fun name do return "cnoa"
105 redef fun desc do return "number of ancestor classes"
106
107 redef fun collect(mclasses) do
108 for mclass in mclasses do
109 values[mclass] = mclass.in_hierarchy(model_view.mainmodule).greaters.length - 1
110 end
111 end
112 end
113
114 # Class Metric: Number of Parents
115 class CNOP
116 super MClassMetric
117 super IntMetric
118 redef fun name do return "cnop"
119 redef fun desc do return "number of parent classes"
120
121 redef fun collect(mclasses) do
122 for mclass in mclasses do
123 values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_greaters.length
124 end
125 end
126 end
127
128 # Class Metric: Number of Children
129 class CNOC
130 super MClassMetric
131 super IntMetric
132 redef fun name do return "cnoc"
133 redef fun desc do return "number of child classes"
134
135 redef fun collect(mclasses) do
136 for mclass in mclasses do
137 values[mclass] = mclass.in_hierarchy(model_view.mainmodule).direct_smallers.length
138 end
139 end
140 end
141
142 # Class Metric: Number of Descendants
143 class CNOD
144 super MClassMetric
145 super IntMetric
146 redef fun name do return "cnod"
147 redef fun desc do return "number of descendant classes"
148
149 redef fun collect(mclasses) do
150 for mclass in mclasses do
151 values[mclass] = mclass.in_hierarchy(model_view.mainmodule).smallers.length - 1
152 end
153 end
154 end
155
156 # Class Metric: Depth in Inheritance Tree
157 class CDIT
158 super MClassMetric
159 super IntMetric
160 redef fun name do return "cdit"
161 redef fun desc do return "depth in class tree"
162
163 redef fun collect(mclasses) do
164 for mclass in mclasses do
165 values[mclass] = mclass.in_hierarchy(model_view.mainmodule).depth
166 end
167 end
168 end
169
170 # Class Metric: Number of MProperties
171 class CNBP
172 super MClassMetric
173 super IntMetric
174 redef fun name do return "cnbp"
175 redef fun desc do return "number of accessible properties (inherited + local)"
176
177 redef fun collect(mclasses) do
178 for mclass in mclasses do
179 values[mclass] = mclass.collect_accessible_mproperties(model_view).length
180 end
181 end
182 end
183
184 # Class Metric: Number of MAttributes
185 class CNBA
186 super MClassMetric
187 super IntMetric
188 redef fun name do return "cnba"
189 redef fun desc do return "number of accessible attributes (inherited + local)"
190
191 redef fun collect(mclasses) do
192 for mclass in mclasses do
193 values[mclass] = mclass.collect_accessible_mattributes(model_view).length
194 end
195 end
196 end
197
198 # Class Metric: Number of MMethods
199 class CNBM
200 super MClassMetric
201 super IntMetric
202 redef fun name do return "cnbm"
203 redef fun desc do return "number of accessible methods (inherited + local)"
204
205 redef fun collect(mclasses) do
206 for mclass in mclasses do
207 values[mclass] = mclass.collect_accessible_mmethods(model_view).length
208 end
209 end
210 end
211
212 # Class Metric: Number of Constructors
213 class CNBI
214 super MClassMetric
215 super IntMetric
216 redef fun name do return "cnbi"
217 redef fun desc do return "number of accessible constructors (inherited + local)"
218
219 redef fun collect(mclasses) do
220 for mclass in mclasses do
221 values[mclass] = mclass.collect_accessible_inits(model_view).length
222 end
223 end
224 end
225
226 # Class Metric: Number of Virtual Types
227 class CNBV
228 super MClassMetric
229 super IntMetric
230 redef fun name do return "cnbv"
231 redef fun desc do return "number of accessible virtual types (inherited + local)"
232
233 redef fun collect(mclasses) do
234 for mclass in mclasses do
235 values[mclass] = mclass.collect_accessible_vts(model_view).length
236 end
237 end
238 end
239
240 # Class Metric: Number of Introduced MProperties
241 class CNBIP
242 super MClassMetric
243 super IntMetric
244 redef fun name do return "cnbip"
245 redef fun desc do return "number of introduced properties"
246
247 redef fun collect(mclasses) do
248 for mclass in mclasses do
249 values[mclass] = mclass.collect_intro_mproperties(model_view).length
250 end
251 end
252 end
253
254 # Class Metric: Number of Refined MProperties
255 class CNBRP
256 super MClassMetric
257 super IntMetric
258 redef fun name do return "cnbrp"
259 redef fun desc do return "number of redefined properties"
260
261 redef fun collect(mclasses) do
262 for mclass in mclasses do
263 values[mclass] = mclass.collect_redef_mproperties(model_view).length
264 end
265 end
266 end
267
268 # Class Metric: Number of Inherited MProperties
269 class CNBHP
270 super MClassMetric
271 super IntMetric
272 redef fun name do return "cnbhp"
273 redef fun desc do return "number of inherited properties"
274
275 redef fun collect(mclasses) do
276 for mclass in mclasses do
277 values[mclass] = mclass.collect_inherited_mproperties(model_view).length
278 end
279 end
280 end
281
282 # Class Metric: Number of Local MProperties (Intro + Redef)
283 class CNBLP
284 super MClassMetric
285 super IntMetric
286 redef fun name do return "cnblp"
287 redef fun desc do return "number of local properties (intro + redef)"
288
289 redef fun collect(mclasses) do
290 for mclass in mclasses do
291 values[mclass] = mclass.collect_local_mproperties(model_view).length
292 end
293 end
294 end