Merge: Reworked crypto.nit to introduce basic XOR attacks
[nit.git] / src / model / model_collect.nit
index 41352eb..2590b0d 100644 (file)
@@ -31,8 +31,93 @@ module model_collect
 
 import model_views
 
+redef class MEntity
+
+       # Collect modifier keywords like `redef`, `private` etc.
+       fun collect_modifiers: Array[String] do
+               return new Array[String]
+       end
+end
+
+redef class MPackage
+       redef fun collect_modifiers do
+               var res = super
+               res.add "package"
+               return res
+       end
+end
+
+redef class MGroup
+       redef fun collect_modifiers do
+               var res = super
+               res.add "group"
+               return res
+       end
+end
+
 redef class MModule
 
+       redef fun collect_modifiers do
+               var res = super
+               res.add "module"
+               return res
+       end
+
+       # Collect all transitive imports.
+       fun collect_ancestors(view: ModelView): Set[MModule] do
+               var res = new HashSet[MModule]
+               for mentity in in_importation.greaters do
+                       if mentity == self then continue
+                       if not view.accept_mentity(mentity) then continue
+                       res.add mentity
+               end
+               return res
+       end
+
+       # Collect direct imports.
+       fun collect_parents(view: ModelView): Set[MModule] do
+               var res = new HashSet[MModule]
+               for mentity in in_importation.direct_greaters do
+                       if mentity == self then continue
+                       if not view.accept_mentity(mentity) then continue
+                       res.add mentity
+               end
+               return res
+       end
+
+       # Collect direct children (modules that directly import `self`).
+       fun collect_children(view: ModelView): Set[MModule] do
+               var res = new HashSet[MModule]
+               for mentity in in_importation.direct_smallers do
+                       if mentity == self then continue
+                       if not view.accept_mentity(mentity) then continue
+                       res.add mentity
+               end
+               return res
+       end
+
+       # Collect all transitive children.
+       fun collect_descendants(view: ModelView): Set[MModule] do
+               var res = new HashSet[MModule]
+               for mentity in in_importation.smallers do
+                       if mentity == self then continue
+                       if not view.accept_mentity(mentity) then continue
+                       res.add mentity
+               end
+               return res
+       end
+
+       # Build the importation poset for `self`
+       fun importation_poset(view: ModelView): POSet[MModule] do
+               var mmodules = new HashSet[MModule]
+               mmodules.add self
+               mmodules.add_all collect_ancestors(view)
+               mmodules.add_all collect_parents(view)
+               mmodules.add_all collect_children(view)
+               mmodules.add_all collect_descendants(view)
+               return view.mmodules_poset(mmodules)
+       end
+
        # Collect mclassdefs introduced in `self` with `visibility >= to min_visibility`.
        fun collect_intro_mclassdefs(view: ModelView): Set[MClassDef] do
                var res = new HashSet[MClassDef]
@@ -78,6 +163,8 @@ end
 
 redef class MClass
 
+       redef fun collect_modifiers do return intro.collect_modifiers
+
        # Collect direct parents of `self` with `visibility >= to min_visibility`.
        fun collect_parents(view: ModelView): Set[MClass] do
                var res = new HashSet[MClass]
@@ -213,6 +300,15 @@ redef class MClass
                return set
        end
 
+       # Collect mmethods inherited by 'self' if accepted by `view`.
+       fun collect_inherited_mmethods(view: ModelView): Set[MMethod] do
+               var res = new HashSet[MMethod]
+               for mproperty in collect_inherited_mproperties(view) do
+                       if mproperty isa MMethod then res.add(mproperty)
+               end
+               return res
+       end
+
        # Collect mattributes introduced in 'self' with `visibility >= min_visibility`.
        fun collect_intro_mattributes(view: ModelView): Set[MAttribute] do
                var res = new HashSet[MAttribute]
@@ -258,6 +354,52 @@ redef class MClass
                set.add_all(collect_inherited_mattributes(view))
                return set
        end
+
+       # Collect init mmethods introduced in 'self' if accepted by `view`.
+       fun collect_intro_inits(view: ModelView): Set[MMethod] do
+               var res = new HashSet[MMethod]
+               for mproperty in collect_intro_mmethods(view) do
+                       if mproperty.is_init then res.add(mproperty)
+               end
+               return res
+       end
+
+       # Collect init mmethods redefined in 'self' if accepted by `view`.
+       fun collect_redef_inits(view: ModelView): Set[MMethod] do
+               var res = new HashSet[MMethod]
+               for mproperty in collect_redef_mmethods(view) do
+                       if mproperty.is_init then res.add(mproperty)
+               end
+               return res
+       end
+
+       # Collect init mmethods introduced and redefined in 'self' if accepted by `view`.
+       fun collect_local_inits(view: ModelView): Set[MMethod] do
+               var set = new HashSet[MMethod]
+               set.add_all collect_intro_inits(view)
+               set.add_all collect_redef_inits(view)
+               return set
+       end
+
+       # Collect init mmethods inherited by 'self'  if accepted by `view`.
+       fun collect_inherited_inits(view: ModelView): Set[MMethod] do
+               var res = new HashSet[MMethod]
+               for mproperty in collect_inherited_mmethods(view) do
+                       if mproperty.is_init then res.add(mproperty)
+               end
+               return res
+       end
+
+       # Collect all init mmethods accessible by 'self'  if accepted by `view`.
+       #
+       # This include introduced, redefined, inherited inits.
+       fun collect_accessible_inits(view: ModelView): Set[MMethod] do
+               var set = new HashSet[MMethod]
+               set.add_all(collect_intro_inits(view))
+               set.add_all(collect_redef_inits(view))
+               set.add_all(collect_inherited_inits(view))
+               return set
+       end
 end
 
 redef class MClassDef
@@ -294,9 +436,8 @@ redef class MClassDef
                return res
        end
 
-       # Collect modifiers like redef, private etc.
-       fun collect_modifiers: Array[String] do
-               var res = new Array[String]
+       redef fun collect_modifiers do
+               var res = super
                if not is_intro then
                        res.add "redef"
                else
@@ -307,10 +448,13 @@ redef class MClassDef
        end
 end
 
+redef class MProperty
+       redef fun collect_modifiers do return intro.collect_modifiers
+end
+
 redef class MPropDef
-       # Collect modifiers like redef, private, abstract, intern, fun etc.
-       fun collect_modifiers: Array[String] do
-               var res = new Array[String]
+       redef fun collect_modifiers do
+               var res = super
                if not is_intro then
                        res.add "redef"
                else
@@ -330,6 +474,8 @@ redef class MPropDef
                        else
                                res.add "fun"
                        end
+               else if mprop isa MAttributeDef then
+                       res.add "var"
                end
                return res
        end