docs/qapi_domain: add namespace support to FQN

This patch adds a namespace component to the "Fully Qualified Name", in
the form of "domain:module.name". As there are no namespace directives
or options yet, this component will simply be empty as of this patch.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-ID: <20250313044312.189276-4-jsnow@redhat.com>
Acked-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
John Snow 2025-03-13 00:43:04 -04:00 committed by Markus Armbruster
parent e36afc7bcc
commit 74d40b011c

View file

@ -178,15 +178,18 @@ class QAPIDescription(ParserFix):
# NB: this is used for the global index, not the QAPI index. # NB: this is used for the global index, not the QAPI index.
return ("single", f"{name} (QMP {self.objtype})") return ("single", f"{name} (QMP {self.objtype})")
def _get_context(self) -> str: def _get_context(self) -> Tuple[str, str]:
namespace = self.options.get(
"namespace", self.env.ref_context.get("qapi:namespace", "")
)
modname = self.options.get( modname = self.options.get(
"module", self.env.ref_context.get("qapi:module", "") "module", self.env.ref_context.get("qapi:module", "")
) )
assert isinstance(modname, str)
return modname return namespace, modname
def _get_fqn(self, name: Signature) -> str: def _get_fqn(self, name: Signature) -> str:
modname = self._get_context() namespace, modname = self._get_context()
# If we're documenting a module, don't include the module as # If we're documenting a module, don't include the module as
# part of the FQN; we ARE the module! # part of the FQN; we ARE the module!
@ -195,6 +198,8 @@ class QAPIDescription(ParserFix):
if modname: if modname:
name = f"{modname}.{name}" name = f"{modname}.{name}"
if namespace:
name = f"{namespace}:{name}"
return name return name
def add_target_and_index( def add_target_and_index(
@ -227,13 +232,18 @@ class QAPIDescription(ParserFix):
) )
@staticmethod @staticmethod
def split_fqn(name: str) -> Tuple[str, str]: def split_fqn(name: str) -> Tuple[str, str, str]:
if ":" in name:
ns, name = name.split(":")
else:
ns = ""
if "." in name: if "." in name:
module, name = name.split(".") module, name = name.split(".")
else: else:
module = "" module = ""
return (module, name) return (ns, module, name)
def _object_hierarchy_parts( def _object_hierarchy_parts(
self, sig_node: desc_signature self, sig_node: desc_signature
@ -251,7 +261,7 @@ class QAPIDescription(ParserFix):
return "" return ""
config = self.env.app.config config = self.env.app.config
modname, name = toc_parts namespace, modname, name = toc_parts
if config.toc_object_entries_show_parents == "domain": if config.toc_object_entries_show_parents == "domain":
ret = name ret = name
@ -259,6 +269,10 @@ class QAPIDescription(ParserFix):
"qapi:module", "" "qapi:module", ""
): ):
ret = f"{modname}.{name}" ret = f"{modname}.{name}"
if namespace and namespace != self.env.ref_context.get(
"qapi:namespace", ""
):
ret = f"{namespace}:{ret}"
return ret return ret
if config.toc_object_entries_show_parents == "hide": if config.toc_object_entries_show_parents == "hide":
return name return name
@ -334,10 +348,15 @@ class QAPIObject(QAPIDescription):
As such, the only argument here is "sig", which is just the QAPI As such, the only argument here is "sig", which is just the QAPI
definition name. definition name.
""" """
modname = self._get_context() # No module or domain info allowed in the signature!
assert ":" not in sig
assert "." not in sig
namespace, modname = self._get_context()
signode["fullname"] = self._get_fqn(sig) signode["fullname"] = self._get_fqn(sig)
signode["namespace"] = namespace
signode["module"] = modname signode["module"] = modname
sig_prefix = self.get_signature_prefix() sig_prefix = self.get_signature_prefix()
if sig_prefix: if sig_prefix:
signode += addnodes.desc_annotation( signode += addnodes.desc_annotation(