model/model_contract: Move contract model representation
[nit.git] / src / model / model_visitor.nit
index 3d8a4c7..d733912 100644 (file)
 # ~~~
 module model_visitor
 
-import model
+import model_filters
 
 # The abstract model visitor template.
 #
 # Specific visitor must implement the `visit` method to perform the work.
 abstract class ModelVisitor
+
        # Visit the entity `e`.
        #
        # This method setups `current_entity` and call `visit`.
        # If `e` is null, nothing is done.
        fun enter_visit(e: nullable MEntity) do
                if e == null then return
+               if not accept_mentity(e) then return
                var old_entity = current_entity
                current_entity = e
                visit(e)
@@ -66,6 +68,32 @@ abstract class ModelVisitor
        #
        # It should not be called directly but used by `enter_visit`
        protected fun visit(e: MEntity) is abstract
+
+       # Filters to apply when visiting the model.
+       #
+       # See ModelFilters for configuration.
+       var filter: ModelFilter is lazy, writable, optional do
+               return new ModelFilter(
+                       min_visibility = protected_visibility,
+                       accept_fictive = false,
+                       accept_test = false,
+                       accept_example = false,
+                       accept_redef = true,
+                       accept_extern = true,
+                       accept_attribute = true,
+                       accept_empty_doc = true
+               )
+       end
+
+       # Should we accept this `mentity` from the view?
+       #
+       # If no `override_filter` is passed then use `self.filter`.
+       fun accept_mentity(mentity: MEntity, override_filter: nullable ModelFilter): Bool do
+               if override_filter != null then
+                       return override_filter.accept_mentity(mentity)
+               end
+               return filter.accept_mentity(mentity)
+       end
 end
 
 redef class MEntity