lib/core/stream: LineIterator use CachedIterator
[nit.git] / src / doc / commands / commands_parser.nit
index 6678bfa..52ec92b 100644 (file)
 # Used by both Nitx and the Markdown doc commands.
 module commands_parser
 
-import commands::commands_model
-import commands::commands_graph
-import commands::commands_usage
-import commands::commands_catalog
-import commands::commands_ini
-import commands::commands_main
+import commands_catalog
+import commands_graph
+import commands_ini
+import commands_main
+import commands_usage
 
 # Parse string commands to create DocQueries
 class CommandParser
@@ -256,6 +255,28 @@ redef class DocCommand
 
        # Initialize the command from the CommandParser data
        fun parser_init(arg: String, options: CmdOptions): CmdMessage do
+               var filter = cmd_filter
+               var opt_vis = options.opt_visibility("min-visibility")
+               if opt_vis != null then filter.min_visibility = opt_vis
+               var opt_fictive = options.opt_bool("no-fictive")
+               if opt_fictive != null then filter.accept_fictive = not opt_fictive
+               var opt_test = options.opt_bool("no-test")
+               if opt_test != null then filter.accept_test = not opt_test
+               var opt_redef = options.opt_bool("no-redef")
+               if opt_redef != null then filter.accept_redef = not opt_redef
+               var opt_extern = options.opt_bool("no-extern")
+               if opt_extern != null then filter.accept_extern = not opt_extern
+               var opt_example = options.opt_bool("no-example")
+               if opt_example != null then filter.accept_example = not opt_example
+               var opt_attr = options.opt_bool("no-attribute")
+               if opt_attr != null then filter.accept_attribute = not opt_attr
+               var opt_doc = options.opt_bool("no-empty-doc")
+               if opt_doc != null then filter.accept_empty_doc = not opt_doc
+               var opt_inh = options.opt_mentity(model, "inherit")
+               if opt_inh != null then filter.accept_inherited = opt_inh
+               var opt_match = options.opt_string("match")
+               if opt_match != null then filter.accept_full_name = opt_match
+               self.filter = filter
                return init_command
        end
 end
@@ -379,6 +400,15 @@ end
 class CmdOptions
        super HashMap[String,  String]
 
+       # Map String visiblity name to MVisibility object
+       var allowed_visibility: HashMap[String, MVisibility] is lazy do
+               var res = new HashMap[String, MVisibility]
+               res["public"] = public_visibility
+               res["protected"] = protected_visibility
+               res["private"] = private_visibility
+               return res
+       end
+
        # Get option value for `key` as String
        #
        # Return `null` if no option with that `key` or if value is empty.
@@ -411,6 +441,33 @@ class CmdOptions
                if value == "false" then return false
                return null
        end
+
+       # Get option as a MVisibility
+       #
+       # Return `null` if no option with that `key` or if the value is not in
+       # `allowed_visibility`.
+       fun opt_visibility(key: String): nullable MVisibility do
+               var value = opt_string(key)
+               if value == null then return null
+               if not allowed_visibility.keys.has(key) then return null
+               return allowed_visibility[value]
+       end
+
+       # Get option as a MEntity
+       #
+       # Lookup first by `MEntity::full_name` then by `MEntity::name`.
+       # Return `null` if the mentity name does not exist or return a conflict.
+       private fun opt_mentity(model: Model, key: String): nullable MEntity do
+               var value = opt_string(key)
+               if value == null or value.is_empty then return null
+
+               var mentity = model.mentity_by_full_name(value)
+               if mentity != null then return mentity
+
+               var mentities = model.mentities_by_name(value)
+               if mentities.is_empty or mentities.length > 1 then return null
+               return mentities.first
+       end
 end
 
 redef class Text