docs/qapi-domain: always store fully qualified name in signode

Currently, only the definition name is stored in the tree metadata; but
the node property is confusingly called "fullname". Rectify this by
always storing the FQN in the tree metadata.

... While we're here, re-organize the code in preparation for namespace
support to make it a bit easier to add additional components of the
FQN. With this change, there is now extremely little code left that's
taken directly from the Python domain :)

Signed-off-by: John Snow <jsnow@redhat.com>
Message-ID: <20250313044312.189276-3-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:03 -04:00 committed by Markus Armbruster
parent 8fad366260
commit e36afc7bcc

View file

@ -178,6 +178,25 @@ 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:
modname = self.options.get(
"module", self.env.ref_context.get("qapi:module", "")
)
assert isinstance(modname, str)
return modname
def _get_fqn(self, name: Signature) -> str:
modname = self._get_context()
# If we're documenting a module, don't include the module as
# part of the FQN; we ARE the module!
if self.objtype == "module":
modname = ""
if modname:
name = f"{modname}.{name}"
return name
def add_target_and_index( def add_target_and_index(
self, name: Signature, sig: str, signode: desc_signature self, name: Signature, sig: str, signode: desc_signature
) -> None: ) -> None:
@ -187,14 +206,8 @@ class QAPIDescription(ParserFix):
assert self.objtype assert self.objtype
# If we're documenting a module, don't include the module as if not (fullname := signode.get("fullname", "")):
# part of the FQN. fullname = self._get_fqn(name)
modname = ""
if self.objtype != "module":
modname = self.options.get(
"module", self.env.ref_context.get("qapi:module")
)
fullname = (modname + "." if modname else "") + name
node_id = make_id( node_id = make_id(
self.env, self.state.document, self.objtype, fullname self.env, self.state.document, self.objtype, fullname
@ -213,18 +226,21 @@ class QAPIDescription(ParserFix):
(arity, indextext, node_id, "", None) (arity, indextext, node_id, "", None)
) )
@staticmethod
def split_fqn(name: str) -> Tuple[str, str]:
if "." in name:
module, name = name.split(".")
else:
module = ""
return (module, name)
def _object_hierarchy_parts( def _object_hierarchy_parts(
self, sig_node: desc_signature self, sig_node: desc_signature
) -> Tuple[str, ...]: ) -> Tuple[str, ...]:
if "fullname" not in sig_node: if "fullname" not in sig_node:
return () return ()
modname = sig_node.get("module") return self.split_fqn(sig_node["fullname"])
fullname = sig_node["fullname"]
if modname:
return (modname, *fullname.split("."))
return tuple(fullname.split("."))
def _toc_entry_name(self, sig_node: desc_signature) -> str: def _toc_entry_name(self, sig_node: desc_signature) -> str:
# This controls the name in the TOC and on the sidebar. # This controls the name in the TOC and on the sidebar.
@ -235,13 +251,19 @@ class QAPIDescription(ParserFix):
return "" return ""
config = self.env.app.config config = self.env.app.config
*parents, name = toc_parts modname, name = toc_parts
if config.toc_object_entries_show_parents == "domain": if config.toc_object_entries_show_parents == "domain":
return sig_node.get("fullname", name) ret = name
if modname and modname != self.env.ref_context.get(
"qapi:module", ""
):
ret = f"{modname}.{name}"
return ret
if config.toc_object_entries_show_parents == "hide": if config.toc_object_entries_show_parents == "hide":
return name return name
if config.toc_object_entries_show_parents == "all": if config.toc_object_entries_show_parents == "all":
return ".".join(parents + [name]) return sig_node.get("fullname", name)
return "" return ""
@ -312,11 +334,9 @@ 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.options.get( modname = self._get_context()
"module", self.env.ref_context.get("qapi:module")
)
signode["fullname"] = sig signode["fullname"] = self._get_fqn(sig)
signode["module"] = modname signode["module"] = modname
sig_prefix = self.get_signature_prefix() sig_prefix = self.get_signature_prefix()
if sig_prefix: if sig_prefix: