# 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
# 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
redef class CmdComment
redef fun parser_init(mentity_name, options) do
- full_doc = not options.has_key("only-synopsis")
- fallback = not options.has_key("no-fallback")
+ var opt_full_doc = options.opt_bool("only-synopsis")
+ if opt_full_doc != null then full_doc = not opt_full_doc
+ var opt_fallback = options.opt_bool("no-fallback")
+ if opt_fallback != null then fallback = not opt_fallback
var opt_format = options.opt_string("format")
if opt_format != null then format = opt_format
return super
redef class CmdAncestors
redef fun parser_init(mentity_name, options) do
- if options.has_key("parents") and options["parents"] == "false" then parents = false
+ var opt_parents = options.opt_bool("no-parents")
+ if opt_parents != null then parents = not opt_parents
return super
end
end
redef class CmdDescendants
redef fun parser_init(mentity_name, options) do
- if options.has_key("children") and options["children"] == "false" then children = false
+ var opt_children = options.opt_bool("no-children")
+ if opt_children != null then children = not opt_children
return super
end
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.
if not value.is_int then return null
return value.to_i
end
+
+ # Get option value as bool
+ #
+ # Return `true` if the value with that `key` is empty or equals `"true"`.
+ # Return `false` if the value with that `key` equals `"false"`.
+ # Return `null` in any other case.
+ fun opt_bool(key: String): nullable Bool do
+ if not has_key(key) then return null
+ var value = self[key]
+ if value.is_empty or value == "true" then return true
+ 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