From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: stefanha@redhat.com, John Snow <jsnow@redhat.com>
Subject: [PULL 03/61] docs/qapi-domain: add QAPI domain object registry
Date: Tue, 11 Mar 2025 12:30:39 +0100 [thread overview]
Message-ID: <20250311113137.1277125-4-armbru@redhat.com> (raw)
In-Reply-To: <20250311113137.1277125-1-armbru@redhat.com>
From: John Snow <jsnow@redhat.com>
This is the first step towards QAPI domain cross-references and a QAPI
reference index.
This patch just creates the object registry, and updates the
merge_domaindata stub method now that we have actual data we may need to
merge.
Note that how to handle merge conflict resolution is unhandled, as the
Sphinx python domain itself does not handle it either. I do not know how
to intentionally trigger it, so I've left an assertion instead if it
should ever come up ...
Signed-off-by: John Snow <jsnow@redhat.com>
Message-ID: <20250311034303.75779-6-jsnow@redhat.com>
Acked-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
docs/sphinx/qapi_domain.py | 77 +++++++++++++++++++++++++++++++++++++-
1 file changed, 75 insertions(+), 2 deletions(-)
diff --git a/docs/sphinx/qapi_domain.py b/docs/sphinx/qapi_domain.py
index a1983d9444..f3ece42bc2 100644
--- a/docs/sphinx/qapi_domain.py
+++ b/docs/sphinx/qapi_domain.py
@@ -9,10 +9,12 @@
AbstractSet,
Any,
Dict,
+ NamedTuple,
Tuple,
)
from sphinx.domains import Domain, ObjType
+from sphinx.locale import __
from sphinx.util import logging
@@ -22,22 +24,93 @@
logger = logging.getLogger(__name__)
+class ObjectEntry(NamedTuple):
+ docname: str
+ node_id: str
+ objtype: str
+ aliased: bool
+
+
class QAPIDomain(Domain):
"""QAPI language domain."""
name = "qapi"
label = "QAPI"
+ # This table associates cross-reference object types (key) with an
+ # ObjType instance, which defines the valid cross-reference roles
+ # for each object type.
+
+ # Actual table entries for module, command, event, etc will come in
+ # forthcoming commits.
object_types: Dict[str, ObjType] = {}
+
directives = {}
roles = {}
- initial_data: Dict[str, Dict[str, Tuple[Any]]] = {}
+
+ # Moved into the data property at runtime;
+ # this is the internal index of reference-able objects.
+ initial_data: Dict[str, Dict[str, Tuple[Any]]] = {
+ "objects": {}, # fullname -> ObjectEntry
+ }
+
indices = []
+ @property
+ def objects(self) -> Dict[str, ObjectEntry]:
+ ret = self.data.setdefault("objects", {})
+ return ret # type: ignore[no-any-return]
+
+ def note_object(
+ self,
+ name: str,
+ objtype: str,
+ node_id: str,
+ aliased: bool = False,
+ location: Any = None,
+ ) -> None:
+ """Note a QAPI object for cross reference."""
+ if name in self.objects:
+ other = self.objects[name]
+ if other.aliased and aliased is False:
+ # The original definition found. Override it!
+ pass
+ elif other.aliased is False and aliased:
+ # The original definition is already registered.
+ return
+ else:
+ # duplicated
+ logger.warning(
+ __(
+ "duplicate object description of %s, "
+ "other instance in %s, use :no-index: for one of them"
+ ),
+ name,
+ other.docname,
+ location=location,
+ )
+ self.objects[name] = ObjectEntry(
+ self.env.docname, node_id, objtype, aliased
+ )
+
+ def clear_doc(self, docname: str) -> None:
+ for fullname, obj in list(self.objects.items()):
+ if obj.docname == docname:
+ del self.objects[fullname]
+
def merge_domaindata(
self, docnames: AbstractSet[str], otherdata: Dict[str, Any]
) -> None:
- pass
+ for fullname, obj in otherdata["objects"].items():
+ if obj.docname in docnames:
+ # Sphinx's own python domain doesn't appear to bother to
+ # check for collisions. Assert they don't happen and
+ # we'll fix it if/when the case arises.
+ assert fullname not in self.objects, (
+ "bug - collision on merge?"
+ f" {fullname=} {obj=} {self.objects[fullname]=}"
+ )
+ self.objects[fullname] = obj
def resolve_any_xref(self, *args: Any, **kwargs: Any) -> Any:
# pylint: disable=unused-argument
--
2.48.1
next prev parent reply other threads:[~2025-03-11 11:51 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-11 11:30 [PULL 00/61] QAPI patches patches for 2025-03-11 Markus Armbruster
2025-03-11 11:30 ` [PULL 01/61] docs/sphinx: create QAPI domain extension stub Markus Armbruster
2025-03-11 11:30 ` [PULL 02/61] docs/sphinx: add compat.py module and nested_parse helper Markus Armbruster
2025-03-11 11:30 ` Markus Armbruster [this message]
2025-03-11 11:30 ` [PULL 04/61] docs/qapi-domain: add QAPI index Markus Armbruster
2025-03-11 11:30 ` [PULL 05/61] docs/qapi-domain: add resolve_any_xref() Markus Armbruster
2025-03-11 11:30 ` [PULL 06/61] docs/qapi-domain: add QAPI xref roles Markus Armbruster
2025-03-11 11:30 ` [PULL 07/61] docs/qapi-domain: add compatibility node classes Markus Armbruster
2025-03-11 11:30 ` [PULL 08/61] docs/qapi-domain: Add QAPIDescription abstract class Markus Armbruster
2025-03-11 11:30 ` [PULL 09/61] docs/qapi-domain: add qapi:module directive Markus Armbruster
2025-03-11 11:30 ` [PULL 10/61] docs/qapi-domain: add QAPIObject class Markus Armbruster
2025-03-11 11:30 ` [PULL 11/61] docs/qapi-domain: add qapi:command directive Markus Armbruster
2025-03-11 11:30 ` [PULL 12/61] docs/qapi-domain: add :since: directive option Markus Armbruster
2025-03-11 11:30 ` [PULL 13/61] docs/qapi-domain: add "Arguments:" field lists Markus Armbruster
2025-03-11 11:30 ` [PULL 14/61] docs/qapi-domain: add "Features:" " Markus Armbruster
2025-03-11 11:30 ` [PULL 15/61] docs/qapi-domain: add "Errors:" " Markus Armbruster
2025-03-11 11:30 ` [PULL 16/61] docs/qapi-domain: add "Return:" " Markus Armbruster
2025-03-11 11:30 ` [PULL 17/61] docs/qapi-domain: add qapi:enum directive Markus Armbruster
2025-03-11 11:30 ` [PULL 18/61] docs/qapi-domain: add qapi:alternate directive Markus Armbruster
2025-03-11 11:30 ` [PULL 19/61] docs/qapi-domain: add qapi:event directive Markus Armbruster
2025-03-11 11:30 ` [PULL 20/61] docs/qapi-domain: add qapi:object directive Markus Armbruster
2025-03-11 11:30 ` [PULL 21/61] docs/qapi-domain: add :deprecated: directive option Markus Armbruster
2025-03-11 11:30 ` [PULL 22/61] docs/qapi-domain: add :unstable: " Markus Armbruster
2025-03-11 11:30 ` [PULL 23/61] docs/qapi-domain: add :ifcond: " Markus Armbruster
2025-03-11 11:31 ` [PULL 24/61] docs/qapi-domain: add warnings for malformed field lists Markus Armbruster
2025-03-11 11:31 ` [PULL 25/61] docs/qapi-domain: add type cross-refs to " Markus Armbruster
2025-03-11 11:31 ` [PULL 26/61] docs/qapi-domain: add CSS styling Markus Armbruster
2025-03-11 11:31 ` [PULL 27/61] docs/qapi-domain: add XREF compatibility goop for Sphinx < 4.1 Markus Armbruster
2025-03-11 11:31 ` [PULL 28/61] docs/qapi-domain: warn when QAPI domain xrefs fail to resolve Markus Armbruster
2025-03-11 11:31 ` [PULL 29/61] docs/qapi-domain: Fix error context reporting in Sphinx 5.x and 6.x Markus Armbruster
2025-03-11 11:31 ` [PULL 30/61] qapi/parser: adjust info location for doc body section Markus Armbruster
2025-03-11 11:31 ` [PULL 31/61] qapi: clean up encoding of section kinds Markus Armbruster
2025-03-11 11:31 ` [PULL 32/61] qapi/schema: add __repr__ to QAPIDoc.Section Markus Armbruster
2025-03-11 11:31 ` [PULL 33/61] docs/qapidoc: add transmogrifier stub Markus Armbruster
2025-03-11 11:31 ` [PULL 34/61] docs/qapidoc: split old implementation into qapidoc_legacy.py Markus Armbruster
2025-03-11 11:31 ` [PULL 35/61] docs/qapidoc: Fix static typing on qapidoc.py Markus Armbruster
2025-03-11 11:31 ` [PULL 36/61] docs/qapidoc: add transmogrifier class stub Markus Armbruster
2025-03-11 11:31 ` [PULL 37/61] docs/qapidoc: add visit_module() method Markus Armbruster
2025-03-11 11:31 ` [PULL 38/61] qapi/source: allow multi-line QAPISourceInfo advancing Markus Armbruster
2025-03-11 11:31 ` [PULL 39/61] docs/qapidoc: add visit_freeform() method Markus Armbruster
2025-03-11 11:31 ` [PULL 40/61] docs/qapidoc: add preamble() method Markus Armbruster
2025-03-11 11:31 ` [PULL 41/61] docs/qapidoc: add visit_paragraph() method Markus Armbruster
2025-03-11 11:31 ` [PULL 42/61] docs/qapidoc: add visit_errors() method Markus Armbruster
2025-03-11 11:31 ` [PULL 43/61] docs/qapidoc: add format_type() method Markus Armbruster
2025-03-11 11:31 ` [PULL 44/61] docs/qapidoc: add add_field() and generate_field() helper methods Markus Armbruster
2025-03-11 11:31 ` [PULL 45/61] docs/qapidoc: add visit_feature() method Markus Armbruster
2025-03-11 11:31 ` [PULL 46/61] docs/qapidoc: prepare to record entity being transmogrified Markus Armbruster
2025-03-11 11:31 ` [PULL 47/61] docs/qapidoc: add visit_returns() method Markus Armbruster
2025-03-11 11:31 ` [PULL 48/61] docs/qapidoc: add visit_member() method Markus Armbruster
2025-03-11 11:31 ` [PULL 49/61] docs/qapidoc: add visit_sections() method Markus Armbruster
2025-03-11 11:31 ` [PULL 50/61] docs/qapidoc: add visit_entity() Markus Armbruster
2025-03-11 11:31 ` [PULL 51/61] docs/qapidoc: implement transmogrify() method Markus Armbruster
2025-03-11 11:31 ` [PULL 52/61] docs/qapidoc: process @foo into ``foo`` Markus Armbruster
2025-03-11 11:31 ` [PULL 53/61] docs/qapidoc: add intermediate output debugger Markus Armbruster
2025-03-11 11:31 ` [PULL 54/61] docs/qapidoc: Add "the members of" pointers Markus Armbruster
2025-03-11 11:31 ` [PULL 55/61] docs/qapidoc: generate entries for undocumented members Markus Armbruster
2025-03-11 11:31 ` [PULL 56/61] qapi/parser: add undocumented stub members to all_sections Markus Armbruster
2025-03-11 11:31 ` [PULL 57/61] docs: disambiguate cross-references Markus Armbruster
2025-03-11 11:31 ` [PULL 58/61] docs: enable qapidoc transmogrifier for QEMU QMP Reference Markus Armbruster
2025-03-11 11:31 ` [PULL 59/61] docs: add qapi-domain syntax documentation Markus Armbruster
2025-03-11 11:31 ` [PULL 60/61] MAINTAINERS: Add jsnow as maintainer for Sphinx documentation Markus Armbruster
2025-03-11 11:31 ` [PULL 61/61] scripts/qapi/backend: Clean up create_backend()'s failure mode Markus Armbruster
2025-03-13 7:04 ` [PULL 00/61] QAPI patches patches for 2025-03-11 Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250311113137.1277125-4-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).