1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2008 Jean Privat <jean@pryen.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 things from a `ModelView`
19 # This module introduce several usefull methods to list and count things from a
22 # First setup you view from a Model:
25 # var view = new ModelView(model, mainmodule)
28 # Then ask question using the view:
31 # print number of parents for `{my_class}`
32 # print my_class.collect_parents(view).count
37 # `model_collect` offers a flattened view of the model without considering any
39 # For this reason, `model_collect` lists all the definitions reachable from all
42 # This is usefull for tools that need a global view of a model like `nitdoc`,
43 # `nitx`, `nitmetrics` or `nituml`.
44 # It should not be used for compiling stuffs like computing VFT, where the listed
45 # entities could not be reachable depending on the modules really imported.
52 # FIXME used to bypass RTA limitation on type resolution
55 # Collect modifier keywords like `redef`, `private` etc
56 fun collect_modifiers
: Array[String] do return new Array[String]
58 # Collect `self` linearization anchored on `mainmodule`
59 fun collect_linearization
(mainmodule
: MModule): nullable Array[MEntity] do
63 # Collect `self` ancestors (direct and indirect)
65 # The concept of ancestor is abstract at this stage.
66 fun collect_ancestors
(view
: ModelView): Set[MENTITY] do
67 var done
= new HashSet[MENTITY]
68 var todo
= new Array[MENTITY]
70 todo
.add_all collect_parents
(view
)
71 while todo
.not_empty
do
72 var mentity
= todo
.pop
73 if mentity
== self or done
.has
(mentity
) then continue
75 todo
.add_all mentity
.collect_parents
(view
)
80 # Collect `self` parents (direct ancestors)
82 # The concept of parent is abstract at this stage.
83 fun collect_parents
(view
: ModelView): Set[MENTITY] is abstract
85 # Collect `self` children (direct descendants)
87 # The concept of child is abstract at this stage.
88 fun collect_children
(view
: ModelView): Set[MENTITY] is abstract
90 # Collect `self` descendants (direct and direct)
92 # The concept of descendant is abstract at this stage.
93 fun collect_descendants
(view
: ModelView): Set[MENTITY] do
94 var done
= new HashSet[MENTITY]
95 var todo
= new Array[MENTITY]
97 todo
.add_all collect_children
(view
)
98 while todo
.not_empty
do
99 var mentity
= todo
.pop
100 if mentity
== self or done
.has
(mentity
) then continue
102 todo
.add_all mentity
.collect_children
(view
)
107 # Build a poset representing `self` in it's own hierarchy
109 # The notion of hierarchy depends on the type of MEntity.
112 # * `MPackage`: package dependencies
113 # * `MGroup`: group dependencies
114 # * `MModule`: modules imports
115 # * `MClass`: class inheritance (all classdefs flattened)
116 # * `MClassDef`: classdef inheritance
117 # * `MProperty`: property definitions graph (all propdefs flattened)
118 # * `MPropDef`: property definitions graph
119 fun hierarchy_poset
(view
: ModelView): POSet[MENTITY] do
120 var poset
= new POSet[MENTITY]
121 var parents_done
= new HashSet[MENTITY]
122 var parents
= new Array[MENTITY]
124 while parents
.not_empty
do
125 var mentity
= parents
.pop
126 if parents_done
.has
(mentity
) then continue
127 parents_done
.add mentity
128 poset
.add_node mentity
129 for parent
in mentity
.collect_parents
(view
) do
130 poset
.add_edge
(mentity
, parent
)
134 var children_done
= new HashSet[MEntity]
135 var children
= new Array[MEntity]
137 while children
.not_empty
do
138 var mentity
= children
.pop
139 if children_done
.has
(mentity
) then continue
140 children_done
.add mentity
141 for child
in mentity
.collect_children
(view
) do
142 poset
.add_edge
(child
, mentity
)
152 # Collect all MPackages in `self`
153 fun collect_mpackages
(view
: ModelView): HashSet[MPackage] do
154 var res
= new HashSet[MPackage]
155 for mpackage
in mpackages
do
156 if not view
.accept_mentity
(mpackage
) then continue
162 # Collect all MModules in `self`
163 fun collect_mmodules
(view
: ModelView): HashSet[MModule] do
164 var res
= new HashSet[MModule]
165 for mpackage
in collect_mpackages
(view
) do
166 res
.add_all mpackage
.collect_all_mmodules
(view
)
171 # Collect all MClasses introduced in `self`
172 fun collect_intro_mclasses
(view
: ModelView): HashSet[MClass] do
173 var res
= new HashSet[MClass]
174 for mpackage
in collect_mpackages
(view
) do
175 res
.add_all mpackage
.collect_intro_mclasses
(view
)
180 # Collect all MProperties introduced in `self`
181 fun collect_intro_mproperties
(view
: ModelView): HashSet[MProperty] do
182 var res
= new HashSet[MProperty]
183 for mpackage
in collect_mpackages
(view
) do
184 res
.add_all mpackage
.collect_intro_mproperties
(view
)
192 redef fun collect_modifiers
do return super + ["package"]
194 # Collect all packages directly imported by `self`
195 redef fun collect_parents
(view
) do
196 var res
= new HashSet[MENTITY]
197 for mgroup
in mgroups
do
198 for parent
in mgroup
.collect_parents
(view
) do
199 var mpackage
= parent
.mpackage
200 if mpackage
== self or not view
.accept_mentity
(mpackage
) then continue
207 # Collect all packages that directly depends on `self`
208 redef fun collect_children
(view
) do
209 var res
= new HashSet[MENTITY]
210 for mpackage
in view
.mpackages
do
211 if mpackage
.collect_parents
(view
).has
(self) then res
.add mpackage
216 # Collect all groups contained in `self`
217 fun collect_all_mgroups
(view
: ModelView): HashSet[MGroup] do
218 var res
= new HashSet[MGroup]
219 for mgroup
in mgroups
do
220 if not view
.accept_mentity
(mgroup
) then continue
226 # Collect only groups contained in `self.root`
227 fun collect_mgroups
(view
: ModelView): HashSet[MGroup] do
228 var res
= new HashSet[MGroup]
230 if root
== null then return res
231 res
.add_all root
.collect_mgroups
(view
)
235 # Collect all modules contained in `self`
236 fun collect_all_mmodules
(view
: ModelView): HashSet[MModule] do
237 var res
= new HashSet[MModule]
238 for mgroup
in collect_mgroups
(view
) do
239 res
.add_all mgroup
.collect_mmodules
(view
)
244 # Collect only modules contained in `self.root`
245 fun collect_mmodules
(view
: ModelView): HashSet[MModule] do
246 var res
= new HashSet[MModule]
248 if root
== null then return res
249 res
.add_all root
.collect_mmodules
(view
)
253 # Collect all classes introduced in `self`
254 fun collect_intro_mclasses
(view
: ModelView): HashSet[MClass] do
255 var res
= new HashSet[MClass]
256 for mgroup
in mgroups
do
257 for mmodule
in collect_all_mmodules
(view
) do
258 res
.add_all mmodule
.collect_intro_mclasses
(view
)
264 # Collect all classes redefined or refined in `self`
265 fun collect_redef_mclasses
(view
: ModelView): Set[MClass] do
266 var res
= new HashSet[MClass]
267 for mgroup
in mgroups
do
268 for mmodule
in collect_all_mmodules
(view
) do
269 res
.add_all mmodule
.collect_redef_mclasses
(view
)
275 # Collect all properties introduced in `self`
276 fun collect_intro_mproperties
(view
: ModelView): HashSet[MProperty] do
277 var res
= new HashSet[MProperty]
278 for mgroup
in mgroups
do
279 for mmodule
in collect_all_mmodules
(view
) do
280 res
.add_all mmodule
.collect_intro_mproperties
(view
)
286 # Collect all properties redefined in `self`
287 fun collect_redef_mproperties
(view
: ModelView): HashSet[MProperty] do
288 var res
= new HashSet[MProperty]
289 for mgroup
in mgroups
do
290 for mmodule
in collect_all_mmodules
(view
) do
291 res
.add_all mmodule
.collect_redef_mproperties
(view
)
297 # Collect all attributes introduced in `self`
298 fun collect_intro_attributes
(view
: ModelView): Set[MAttribute] do
299 var res
= new HashSet[MAttribute]
300 for mgroup
in mgroups
do
301 for mmodule
in collect_all_mmodules
(view
) do
302 res
.add_all mmodule
.collect_intro_attributes
(view
)
308 # Collect all inits introduced in `self`
309 fun collect_intro_inits
(view
: ModelView): Set[MMethod] do
310 var res
= new HashSet[MMethod]
311 for mgroup
in mgroups
do
312 for mmodule
in collect_all_mmodules
(view
) do
313 res
.add_all mmodule
.collect_intro_inits
(view
)
319 # Collect all methods introduced in `self` excluding inits
321 # See `collect_intro_inits`.
322 fun collect_intro_methods
(view
: ModelView): Set[MMethod] do
323 var res
= new HashSet[MMethod]
324 for mgroup
in mgroups
do
325 for mmodule
in collect_all_mmodules
(view
) do
326 res
.add_all mmodule
.collect_intro_methods
(view
)
332 # Collect all virtual types introduced in `self`
333 fun collect_intro_vts
(view
: ModelView): Set[MVirtualTypeProp] do
334 var res
= new HashSet[MVirtualTypeProp]
335 for mgroup
in mgroups
do
336 for mmodule
in collect_all_mmodules
(view
) do
337 res
.add_all mmodule
.collect_intro_vts
(view
)
346 redef fun collect_modifiers
do return super + ["group"]
348 # Collect all groups directly import by `self`
349 redef fun collect_parents
(view
) do
350 var res
= new HashSet[MENTITY]
351 for mmodule
in mmodules
do
352 for parent
in mmodule
.collect_parents
(view
) do
353 var mgroup
= parent
.mgroup
354 if mgroup
== null or mgroup
== self then continue
355 if not view
.accept_mentity
(mgroup
) then continue
362 # Collect all group that directly import `self`
363 redef fun collect_children
(view
) do
364 var res
= new HashSet[MENTITY]
365 for mgroup
in view
.mgroups
do
366 if mgroup
== self or not view
.accept_mentity
(mgroup
) then continue
367 if mgroup
.collect_parents
(view
).has
(self) then res
.add mgroup
372 # Collect all groups contained in `self`
373 fun collect_mgroups
(view
: ModelView): HashSet[MENTITY] do
374 var res
= new HashSet[MENTITY]
375 for mgroup
in in_nesting
.direct_smallers
do
376 if not view
.accept_mentity
(mgroup
) then continue
382 # Collect all modules contained in `self`
383 fun collect_mmodules
(view
: ModelView): HashSet[MModule] do
384 var res
= new HashSet[MModule]
385 for mmodule
in mmodules
do
386 if not view
.accept_mentity
(mmodule
) then continue
395 redef fun collect_modifiers
do return super + ["module"]
397 # Collect all modules directly imported by `self`
398 redef fun collect_parents
(view
) do
399 var res
= new HashSet[MENTITY]
400 for mentity
in in_importation
.direct_greaters
do
401 if mentity
== self then continue
402 if not view
.accept_mentity
(mentity
) then continue
408 # Collect all modules that directly import `self`
409 redef fun collect_children
(view
) do
410 var res
= new HashSet[MENTITY]
411 for mentity
in in_importation
.direct_smallers
do
412 if mentity
== self then continue
413 if not view
.accept_mentity
(mentity
) then continue
419 # Collect all module descendants of `self` (direct and transitive imports)
420 redef fun collect_descendants
(view
) do
421 var res
= new HashSet[MENTITY]
422 for mentity
in in_importation
.smallers
do
423 if mentity
== self then continue
424 if not view
.accept_mentity
(mentity
) then continue
430 # Collect all class definitions introduced in `self`
431 fun collect_intro_mclassdefs
(view
: ModelView): Set[MClassDef] do
432 var res
= new HashSet[MClassDef]
433 for mclassdef
in mclassdefs
do
434 if not mclassdef
.is_intro
then continue
435 if not view
.accept_mentity
(mclassdef
) then continue
441 # Collect all class definitions refined in `self`
442 fun collect_redef_mclassdefs
(view
: ModelView): Set[MClassDef] do
443 var res
= new HashSet[MClassDef]
444 for mclassdef
in mclassdefs
do
445 if mclassdef
.is_intro
then continue
446 if not view
.accept_mentity
(mclassdef
) then continue
452 # Collect all class definitions introduced and refined in `self`
453 fun collect_local_mclassdefs
(view
: ModelView): Set[MClassDef] do
454 var res
= new HashSet[MClassDef]
455 res
.add_all collect_intro_mclassdefs
(view
)
456 res
.add_all collect_redef_mclassdefs
(view
)
460 # Collect all classes introduced in `self`
461 fun collect_intro_mclasses
(view
: ModelView): Set[MClass] do
462 var res
= new HashSet[MClass]
463 for mclass
in intro_mclasses
do
464 if not view
.accept_mentity
(mclass
) then continue
470 # Collect all classes refined in `self`
471 fun collect_redef_mclasses
(view
: ModelView): Set[MClass] do
472 var mclasses
= new HashSet[MClass]
473 for mclassdef
in mclassdefs
do
474 if not view
.accept_mentity
(mclassdef
.mclass
) then continue
475 if not mclassdef
.is_intro
then mclasses
.add
(mclassdef
.mclass
)
480 # Collect all classes introduced and refined in `self`
481 fun collect_local_mclasses
(view
: ModelView): Set[MClass] do
482 var res
= new HashSet[MClass]
483 res
.add_all collect_intro_mclasses
(view
)
484 res
.add_all collect_redef_mclasses
(view
)
488 # Collect all classes imported from `self` parents
489 fun collect_imported_mclasses
(view
: ModelView): Set[MClass] do
490 var res
= new HashSet[MClass]
491 for parent
in collect_parents
(view
) do
492 res
.add_all parent
.collect_intro_mclasses
(view
)
493 res
.add_all parent
.collect_redef_mclasses
(view
)
494 res
.add_all parent
.collect_imported_mclasses
(view
)
499 # Collect all properties introduced in `self`
500 fun collect_intro_mproperties
(view
: ModelView): Set[MProperty] do
501 var res
= new HashSet[MProperty]
502 for mclass
in collect_intro_mclasses
(view
) do
503 res
.add_all mclass
.collect_intro_mproperties
(view
)
508 # Collect properties redefined in `self`
509 fun collect_redef_mproperties
(view
: ModelView): Set[MProperty] do
510 var res
= new HashSet[MProperty]
511 for mclassdef
in mclassdefs
do
512 for mpropdef
in mclassdef
.collect_redef_mpropdefs
(view
) do
513 res
.add mpropdef
.mproperty
519 # Collect attributes introduced in `self`
520 fun collect_intro_attributes
(view
: ModelView): Set[MAttribute] do
521 var res
= new HashSet[MAttribute]
522 for mproperty
in collect_intro_mproperties
(view
) do
523 if mproperty
isa MAttribute then res
.add
(mproperty
)
528 # Collect all inits introduced in `self`
529 fun collect_intro_inits
(view
: ModelView): Set[MMethod] do
530 var res
= new HashSet[MMethod]
531 for mproperty
in collect_intro_mproperties
(view
) do
532 if mproperty
isa MMethod and mproperty
.is_init
then res
.add
(mproperty
)
537 # Collect methods introduced in `self` (without inits)
538 fun collect_intro_methods
(view
: ModelView): Set[MMethod] do
539 var res
= new HashSet[MMethod]
540 for mproperty
in collect_intro_mproperties
(view
) do
541 if mproperty
isa MMethod and not mproperty
.is_init
then res
.add
(mproperty
)
546 # Collect virtual types introduced in `self`
547 fun collect_intro_vts
(view
: ModelView): Set[MVirtualTypeProp] do
548 var res
= new HashSet[MVirtualTypeProp]
549 for mproperty
in collect_intro_mproperties
(view
) do
550 if mproperty
isa MVirtualTypeProp then res
.add
(mproperty
)
558 redef fun collect_modifiers
do return intro
.collect_modifiers
560 redef fun collect_linearization
(mainmodule
) do
561 var mclassdefs
= self.mclassdefs
.to_a
562 mainmodule
.linearize_mclassdefs
(mclassdefs
)
566 # Collect all direct parents of `self`
568 # This method uses a flattened hierarchy containing all the mclassdefs.
569 redef fun collect_parents
(view
) do
570 var res
= new HashSet[MENTITY]
571 for mclass
in in_hierarchy
(view
.mainmodule
).direct_greaters
do
572 if mclass
== self or not view
.accept_mentity
(mclass
) then continue
578 # Collect all direct children of `self`
580 # This method uses a flattened hierarchy containing all the mclassdefs.
581 redef fun collect_children
(view
) do
582 var res
= new HashSet[MENTITY]
583 for mclass
in in_hierarchy
(view
.mainmodule
).direct_smallers
do
584 if mclass
== self or not view
.accept_mentity
(mclass
) then continue
590 # Collect all class definitions of `self`
591 fun collect_mclassdefs
(view
: ModelView): Set[MClassDef] do
592 var res
= new HashSet[MClassDef]
593 for mclassdef
in mclassdefs
do
594 if not view
.accept_mentity
(mclassdef
) then continue
600 # Collect all property definitions that are introductions in `self`
601 fun collect_intro_mpropdefs
(view
: ModelView): Set[MPropDef] do
602 var set
= new HashSet[MPropDef]
603 for mclassdef
in mclassdefs
do
604 for mpropdef
in mclassdef
.mpropdefs
do
605 if not mpropdef
.is_intro
then continue
606 if not view
.accept_mentity
(mpropdef
) then continue
613 # Collect all properties introduced in `self`
614 fun collect_intro_mproperties
(view
: ModelView): Set[MProperty] do
615 var set
= new HashSet[MProperty]
616 for mclassdef
in mclassdefs
do
617 for mprop
in mclassdef
.intro_mproperties
do
618 if not view
.accept_mentity
(mprop
) then continue
625 # Collect all propierty definitions that are redefinition in `self`
626 fun collect_redef_mpropdefs
(view
: ModelView): Set[MPropDef] do
627 var set
= new HashSet[MPropDef]
628 for mclassdef
in mclassdefs
do
629 for mpropdef
in mclassdef
.mpropdefs
do
630 if mpropdef
.is_intro
then continue
631 if not view
.accept_mentity
(mpropdef
) then continue
638 # Collect all properties redefined in `self`
639 fun collect_redef_mproperties
(view
: ModelView): Set[MProperty] do
640 var set
= new HashSet[MProperty]
641 for mclassdef
in mclassdefs
do
642 for mpropdef
in mclassdef
.mpropdefs
do
643 if mpropdef
.mproperty
.intro_mclassdef
.mclass
== self then continue
644 if not view
.accept_mentity
(mpropdef
) then continue
645 set
.add
(mpropdef
.mproperty
)
651 # Collect all properties introduced and redefined in `self`
652 fun collect_local_mproperties
(view
: ModelView): Set[MProperty] do
653 var set
= new HashSet[MProperty]
654 set
.add_all collect_intro_mproperties
(view
)
655 set
.add_all collect_redef_mproperties
(view
)
659 # Collect all properties inehrited by `self`
660 fun collect_inherited_mproperties
(view
: ModelView): Set[MProperty] do
661 var set
= new HashSet[MProperty]
662 for parent
in collect_parents
(view
) do
663 set
.add_all
(parent
.collect_intro_mproperties
(view
))
664 set
.add_all
(parent
.collect_inherited_mproperties
(view
))
669 # Collect all properties accessible by `self`
671 # This include introduced, redefined, inherited properties.
672 fun collect_accessible_mproperties
(view
: ModelView): Set[MProperty] do
673 var set
= new HashSet[MProperty]
674 set
.add_all
(collect_intro_mproperties
(view
))
675 set
.add_all
(collect_redef_mproperties
(view
))
676 set
.add_all
(collect_inherited_mproperties
(view
))
680 # Collect all methods introduced in `self`
681 fun collect_intro_mmethods
(view
: ModelView): Set[MMethod] do
682 var res
= new HashSet[MMethod]
683 for mproperty
in collect_intro_mproperties
(view
) do
684 if mproperty
isa MMethod then res
.add
(mproperty
)
689 # Collect all methods redefined in `self`
690 fun collect_redef_mmethods
(view
: ModelView): Set[MMethod] do
691 var res
= new HashSet[MMethod]
692 for mproperty
in collect_redef_mproperties
(view
) do
693 if mproperty
isa MMethod then res
.add
(mproperty
)
698 # Collect all methods introduced and redefined in `self`
699 fun collect_local_mmethods
(view
: ModelView): Set[MMethod] do
700 var set
= new HashSet[MMethod]
701 set
.add_all collect_intro_mmethods
(view
)
702 set
.add_all collect_redef_mmethods
(view
)
706 # Collect all methods inherited by `self`
707 fun collect_inherited_mmethods
(view
: ModelView): Set[MMethod] do
708 var res
= new HashSet[MMethod]
709 for mproperty
in collect_inherited_mproperties
(view
) do
710 if mproperty
isa MMethod then res
.add
(mproperty
)
715 # Collect all methods accessible by `self`
717 # This include introduced, redefined, inherited methods.
718 fun collect_accessible_mmethods
(view
: ModelView): Set[MMethod] do
719 var set
= new HashSet[MMethod]
720 set
.add_all
(collect_intro_mmethods
(view
))
721 set
.add_all
(collect_redef_mmethods
(view
))
722 set
.add_all
(collect_inherited_mmethods
(view
))
726 # Collect all attributes introduced in `self`
727 fun collect_intro_mattributes
(view
: ModelView): Set[MAttribute] do
728 var res
= new HashSet[MAttribute]
729 for mproperty
in collect_intro_mproperties
(view
) do
730 if mproperty
isa MAttribute then res
.add
(mproperty
)
735 # Collect all attributes redefined in `self`
736 fun collect_redef_mattributes
(view
: ModelView): Set[MAttribute] do
737 var res
= new HashSet[MAttribute]
738 for mproperty
in collect_redef_mproperties
(view
) do
739 if mproperty
isa MAttribute then res
.add
(mproperty
)
744 # Collect all attributes introduced and redefined in `self`
745 fun collect_local_mattributes
(view
: ModelView): Set[MAttribute] do
746 var set
= new HashSet[MAttribute]
747 set
.add_all collect_intro_mattributes
(view
)
748 set
.add_all collect_redef_mattributes
(view
)
752 # Collect all attributes inherited by `self`
753 fun collect_inherited_mattributes
(view
: ModelView): Set[MAttribute] do
754 var res
= new HashSet[MAttribute]
755 for mproperty
in collect_inherited_mproperties
(view
) do
756 if mproperty
isa MAttribute then res
.add
(mproperty
)
761 # Collect all attributes accessible by `self`
763 # This include introduced, redefined, inherited mattributes.
764 fun collect_accessible_mattributes
(view
: ModelView): Set[MAttribute] do
765 var set
= new HashSet[MAttribute]
766 set
.add_all
(collect_intro_mattributes
(view
))
767 set
.add_all
(collect_redef_mattributes
(view
))
768 set
.add_all
(collect_inherited_mattributes
(view
))
772 # Collect all init methods introduced in `self`
773 fun collect_intro_inits
(view
: ModelView): Set[MMethod] do
774 var res
= new HashSet[MMethod]
775 for mproperty
in collect_intro_mmethods
(view
) do
776 if mproperty
.is_init
then res
.add
(mproperty
)
781 # Collect all init methods redefined in `self`
782 fun collect_redef_inits
(view
: ModelView): Set[MMethod] do
783 var res
= new HashSet[MMethod]
784 for mproperty
in collect_redef_mmethods
(view
) do
785 if mproperty
.is_init
then res
.add
(mproperty
)
790 # Collect all init methods introduced and redefined in `self`
791 fun collect_local_inits
(view
: ModelView): Set[MMethod] do
792 var set
= new HashSet[MMethod]
793 set
.add_all collect_intro_inits
(view
)
794 set
.add_all collect_redef_inits
(view
)
798 # Collect all init methods inherited by `self`
799 fun collect_inherited_inits
(view
: ModelView): Set[MMethod] do
800 var res
= new HashSet[MMethod]
801 for mproperty
in collect_inherited_mmethods
(view
) do
802 if mproperty
.is_init
then res
.add
(mproperty
)
807 # Collect all init methods accessible by `self`
809 # This include introduced, redefined, inherited inits.
810 fun collect_accessible_inits
(view
: ModelView): Set[MMethod] do
811 var set
= new HashSet[MMethod]
812 set
.add_all
(collect_intro_inits
(view
))
813 set
.add_all
(collect_redef_inits
(view
))
814 set
.add_all
(collect_inherited_inits
(view
))
818 # Collect all virtual types introduced in `self`
819 fun collect_intro_vts
(view
: ModelView): Set[MVirtualTypeProp] do
820 var res
= new HashSet[MVirtualTypeProp]
821 for mproperty
in collect_intro_mproperties
(view
) do
822 if mproperty
isa MVirtualTypeProp then res
.add
(mproperty
)
827 # Collect all virtual types redefined in `self`
828 fun collect_redef_vts
(view
: ModelView): Set[MVirtualTypeProp] do
829 var res
= new HashSet[MVirtualTypeProp]
830 for mproperty
in collect_intro_mproperties
(view
) do
831 if mproperty
isa MVirtualTypeProp then res
.add
(mproperty
)
836 # Collect all virtual types introduced or redefined in `self`
837 fun collect_local_vts
(view
: ModelView): Set[MVirtualTypeProp] do
838 var set
= new HashSet[MVirtualTypeProp]
839 set
.add_all collect_intro_vts
(view
)
840 set
.add_all collect_redef_vts
(view
)
844 # Collect all virtual types inherited by `self`
845 fun collect_inherited_vts
(view
: ModelView): Set[MVirtualTypeProp] do
846 var res
= new HashSet[MVirtualTypeProp]
847 for mproperty
in collect_inherited_mproperties
(view
) do
848 if mproperty
isa MVirtualTypeProp then res
.add
(mproperty
)
853 # Collect all virtual types accessible by `self`
855 # This include introduced, redefined, inherited virtual types.
856 fun collect_accessible_vts
(view
: ModelView): Set[MVirtualTypeProp] do
857 var set
= new HashSet[MVirtualTypeProp]
858 for mproperty
in collect_accessible_mproperties
(view
) do
859 if mproperty
isa MVirtualTypeProp then set
.add mproperty
865 redef class MClassDef
867 redef fun collect_modifiers
do
872 if mclass
.visibility
!= public_visibility
then
873 res
.add mclass
.visibility
.to_s
876 res
.add mclass
.kind
.to_s
880 redef fun collect_linearization
(mainmodule
) do
881 var mclassdefs
= new Array[MClassDef]
882 for mclassdef
in in_hierarchy
.as(not null).greaters
do
883 if mclassdef
.mclass
== self.mclass
then mclassdefs
.add mclassdef
885 mainmodule
.linearize_mclassdefs
(mclassdefs
)
889 redef fun collect_parents
(view
) do
890 var res
= new HashSet[MENTITY]
891 var hierarchy
= self.in_hierarchy
892 if hierarchy
== null then return res
893 for parent
in hierarchy
.direct_greaters
do
894 if parent
== self or not view
.accept_mentity
(parent
) then continue
900 redef fun collect_children
(view
) do
901 var res
= new HashSet[MENTITY]
902 var hierarchy
= self.in_hierarchy
903 if hierarchy
== null then return res
904 for child
in hierarchy
.direct_smallers
do
905 if child
== self or not view
.accept_mentity
(child
) then continue
911 # Collect all property definitions in `self`
912 fun collect_mpropdefs
(view
: ModelView): Set[MPropDef] do
913 var res
= new HashSet[MPropDef]
914 for mpropdef
in mpropdefs
do
915 if not view
.accept_mentity
(mpropdef
) then continue
921 # Collect all attribute definitions in `self`
922 fun collect_mattributedefs
(view
: ModelView): Set[MAttributeDef] do
923 var res
= new HashSet[MAttributeDef]
924 for mpropdef
in collect_mpropdefs
(view
) do
925 if not mpropdef
isa MAttributeDef then continue
931 # Collect all methods definitions in `self`
932 fun collect_mmethoddefs
(view
: ModelView): Set[MMethodDef] do
933 var res
= new HashSet[MMethodDef]
934 for mpropdef
in collect_mpropdefs
(view
) do
935 if not mpropdef
isa MMethodDef then continue
941 # Collect all virtual types definitions in `self`
942 fun collect_mtypedefs
(view
: ModelView): Set[MVirtualTypeDef] do
943 var res
= new HashSet[MVirtualTypeDef]
944 for mpropdef
in collect_mpropdefs
(view
) do
945 if not mpropdef
isa MVirtualTypeDef then continue
951 # Collect all property definitions that are introduction in `self`
952 fun collect_intro_mpropdefs
(view
: ModelView): Set[MPropDef] do
953 var res
= new HashSet[MPropDef]
954 for mpropdef
in mpropdefs
do
955 if not mpropdef
.is_intro
then continue
956 if not view
.accept_mentity
(mpropdef
) then continue
962 # Collect all property definitions that are redefinition in `self`
963 fun collect_redef_mpropdefs
(view
: ModelView): Set[MPropDef] do
964 var res
= new HashSet[MPropDef]
965 for mpropdef
in mpropdefs
do
966 if mpropdef
.is_intro
then continue
967 if not view
.accept_mentity
(mpropdef
) then continue
974 redef class MProperty
975 redef fun collect_modifiers
do return intro
.collect_modifiers
977 redef fun collect_linearization
(mainmodule
) do
978 var mpropdefs
= self.mpropdefs
.to_a
979 mainmodule
.linearize_mpropdefs
(mpropdefs
)
983 # Collect all property definitions of `self`
984 fun collect_mpropdefs
(view
: ModelView): Set[MPropDef] do
985 var res
= new HashSet[MPropDef]
986 for mpropdef
in mpropdefs
do
987 if not view
.accept_mentity
(mpropdef
) then continue
993 # Collect all direct super definitions of `self`
994 redef fun collect_parents
(view
) do
995 var res
= new HashSet[MENTITY]
996 for mpropdef
in mpropdefs
do
997 for parent
in mpropdef
.collect_parents
(view
) do
998 if not view
.accept_mentity
(parent
) then continue
999 res
.add parent
.mproperty
1005 # Collection all definitions that have `self` as a direct super definition
1006 redef fun collect_children
(view
) do
1007 var res
= new HashSet[MENTITY]
1008 for mpropdef
in mpropdefs
do
1009 for child
in mpropdef
.collect_parents
(view
) do
1010 if not view
.accept_mentity
(child
) then continue
1011 res
.add child
.mproperty
1018 redef class MPropDef
1020 redef fun collect_modifiers
do
1022 if not is_intro
then
1025 if mproperty
.visibility
!= public_visibility
then
1026 res
.add mproperty
.visibility
.to_s
1030 if mprop
isa MVirtualTypeDef then
1032 else if mprop
isa MMethodDef then
1033 if mprop
.is_abstract
then
1035 else if mprop
.is_intern
then
1038 if mprop
.mproperty
.is_init
then
1043 else if mprop
isa MAttributeDef then
1049 redef fun collect_linearization
(mainmodule
) do
1050 var mpropdefs
= new Array[MPropDef]
1052 while not mentity
.is_intro
do
1053 mpropdefs
.add mentity
1054 mentity
= mentity
.lookup_next_definition
(mainmodule
, mentity
.mclassdef
.bound_mtype
)
1056 mpropdefs
.add mentity
1057 mainmodule
.linearize_mpropdefs
(mpropdefs
)
1061 # Collect only the next definition of `self`
1062 redef fun collect_parents
(view
) do
1063 var res
= new HashSet[MENTITY]
1065 while not mpropdef
.is_intro
do
1066 mpropdef
= mpropdef
.lookup_next_definition
(mclassdef
.mmodule
, mclassdef
.bound_mtype
)
1072 # Collect all children definitions that directly depend on `self`
1073 redef fun collect_children
(view
) do
1074 var res
= new HashSet[MENTITY]
1075 for mpropdef
in mproperty
.collect_mpropdefs
(view
) do
1076 if mpropdef
.collect_parents
(view
).has
(self) then res
.add mpropdef