qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Thomas Huth" <thuth@redhat.com>,
	"Yanan Wang" <wangyanan55@huawei.com>,
	"Fabiano Rosas" <farosas@suse.de>,
	"Zhao Liu" <zhao1.liu@intel.com>,
	"Lukas Straub" <lukasstraub2@web.de>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Michael Roth" <michael.roth@amd.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Peter Xu" <peterx@redhat.com>, "Eric Blake" <eblake@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Jason Wang" <jasowang@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"John Snow" <jsnow@redhat.com>
Subject: [PATCH 38/42] docs/qapi: add branch support to inliner
Date: Wed,  5 Feb 2025 18:12:04 -0500	[thread overview]
Message-ID: <20250205231208.1480762-39-jsnow@redhat.com> (raw)
In-Reply-To: <20250205231208.1480762-1-jsnow@redhat.com>

Well, kind of. Anything beyond simple member definitions aren't
included; including ifcond, details sections, features, etc. Definitely
the most "WIP" part of this entire patch series.

Signed-off-by: John Snow <jsnow@redhat.com>
---
 docs/sphinx/qapidoc.py | 57 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)

diff --git a/docs/sphinx/qapidoc.py b/docs/sphinx/qapidoc.py
index 755eb0fa0ec..86c13520d94 100644
--- a/docs/sphinx/qapidoc.py
+++ b/docs/sphinx/qapidoc.py
@@ -44,6 +44,7 @@
 from qapi.schema import (
     QAPISchema,
     QAPISchemaArrayType,
+    QAPISchemaBranches,
     QAPISchemaCommand,
     QAPISchemaEntity,
     QAPISchemaEnumMember,
@@ -68,6 +69,20 @@
 logger = logging.getLogger(__name__)
 
 
+# These classes serve as pseudo-sections that this generator uses to
+# flatten and inline arg sections from multiple entities.
+class BranchStart(QAPIDoc.Section):
+    def __init__(self, key: str, value: str, info: QAPISourceInfo):
+        super().__init__(info, QAPIDoc.Kind.META)
+        self.key = key
+        self.value = value
+
+
+class BranchEnd(QAPIDoc.Section):
+    def __init__(self, info: QAPISourceInfo):
+        super().__init__(info, QAPIDoc.Kind.META)
+
+
 def dedent(text: str) -> str:
     # Adjust indentation to make description text parse as paragraph.
 
@@ -105,6 +120,7 @@ def categorize(section: QAPIDoc.Section) -> "Optional[DocRegion]":
     QAPIDoc.Kind.SINCE: None,
     QAPIDoc.Kind.TODO: None,
     QAPIDoc.Kind.DETAIL: DocRegion.DETAIL,
+    QAPIDoc.Kind.META: DocRegion.MEMBER,
 }
 
 
@@ -226,6 +242,15 @@ def _get_inline_target(
             return ent.base
         return None
 
+    def _variants(ent) -> Optional[QAPISchemaBranches]:
+        if isinstance(ent, QAPISchemaObjectType):
+            return ent.branches
+        return None
+
+    def _memb_filter(sec: QAPIDoc.Section) -> bool:
+        # meta grabs branch start/end markers, too.
+        return sec.kind in (QAPIDoc.Kind.MEMBER, QAPIDoc.Kind.META)
+
     # Let's do this thing!
 
     if ent is None:
@@ -241,7 +266,22 @@ def _get_inline_target(
     # Now, stitch the results together!
     sections.absorb(inlined)
 
-    # FIXME: Branches should be handled about here O:-)
+    # Now, pick up member sections from branches, if any.
+    # FIXME: Anything other than members are unhandled/ignored here...!
+    branch_sections = []
+    if variants := _variants(ent):
+        for variant in variants.variants:
+            branch_sections.append(
+                BranchStart(
+                    variants.tag_member.name, variant.name, variants.info
+                )
+            )
+            var_sections = inline(variant.type)
+            branch_sections.extend(filter(_memb_filter, var_sections))
+            branch_sections.append(BranchEnd(variants.info))
+
+    # Inject branches *after* the member section.
+    sections.partitions[DocRegion.MEMBER].extend(branch_sections)
 
     # Pseudo-feature: document the OOB property.
     if isinstance(ent, QAPISchemaCommand) and ent.allow_oob:
@@ -485,6 +525,21 @@ def visit_sections(self, ent: QAPISchemaEntity) -> None:
 
         # Add sections *in the order they are documented*:
         for section in sections:
+            if isinstance(section, BranchStart):
+                self.ensure_blank_line()
+                self.add_line(
+                    f".. qapi:branch:: {section.key} {section.value}",
+                    section.info,
+                )
+                self.ensure_blank_line()
+                self.indent += 1
+                continue
+
+            if isinstance(section, BranchEnd):
+                self.ensure_blank_line()
+                self.indent -= 1
+                continue
+
             if section.kind.name in ("INTRO", "DETAIL"):
                 self.visit_paragraph(section)
             elif section.kind == QAPIDoc.Kind.MEMBER:
-- 
2.48.1



  parent reply	other threads:[~2025-02-05 23:19 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-05 23:11 [PATCH 00/42] docs: add sphinx-domain rST generator to qapidoc John Snow
2025-02-05 23:11 ` [PATCH 01/42] docs/qapidoc: support header-less freeform sections John Snow
2025-02-11 14:51   ` Markus Armbruster
2025-02-11 17:21     ` John Snow
2025-02-05 23:11 ` [PATCH 02/42] qapi/parser: adjust info location for doc body section John Snow
2025-02-05 23:11 ` [PATCH 03/42] docs/qapidoc: remove example section support John Snow
2025-02-05 23:11 ` [PATCH 04/42] qapi: expand tags to all doc sections John Snow
2025-02-05 23:11 ` [PATCH 05/42] qapi/schema: add __repr__ to QAPIDoc.Section John Snow
2025-02-05 23:11 ` [PATCH 06/42] docs/qapidoc: add transmogrifier stub John Snow
2025-02-05 23:11 ` [PATCH 07/42] docs/qapidoc: add transmogrifier class stub John Snow
2025-02-05 23:11 ` [PATCH 08/42] docs/qapidoc: add visit_module() method John Snow
2025-02-05 23:11 ` [PATCH 09/42] qapi/source: allow multi-line QAPISourceInfo advancing John Snow
2025-02-05 23:11 ` [PATCH 10/42] docs/qapidoc: add visit_freeform() method John Snow
2025-02-05 23:11 ` [PATCH 11/42] docs/qapidoc: add preamble() method John Snow
2025-02-05 23:11 ` [PATCH 12/42] docs/qapidoc: add visit_paragraph() method John Snow
2025-02-05 23:11 ` [PATCH 13/42] docs/qapidoc: add visit_errors() method John Snow
2025-02-05 23:11 ` [PATCH 14/42] docs/qapidoc: add format_type() method John Snow
2025-02-05 23:11 ` [PATCH 15/42] docs/qapidoc: add add_field() and generate_field() helper methods John Snow
2025-02-05 23:11 ` [PATCH 16/42] docs/qapidoc: add visit_feature() method John Snow
2025-02-05 23:11 ` [PATCH 17/42] docs/qapidoc: prepare to record entity being transmogrified John Snow
2025-02-05 23:11 ` [PATCH 18/42] docs/qapidoc: add visit_returns() method John Snow
2025-02-05 23:11 ` [PATCH 19/42] docs/qapidoc: add visit_member() method John Snow
2025-02-05 23:11 ` [PATCH 20/42] docs/qapidoc: add visit_sections() method John Snow
2025-02-05 23:11 ` [PATCH 21/42] docs/qapidoc: add visit_entity() John Snow
2025-02-05 23:11 ` [PATCH 22/42] docs/qapidoc: implement transmogrify() method John Snow
2025-02-05 23:11 ` [PATCH 23/42] docs: disambiguate cross-references John Snow
2025-02-05 23:11 ` [PATCH 24/42] docs/qapidoc: add transmogrifier test document John Snow
2025-02-05 23:11 ` [PATCH 25/42] docs/qapidoc: generate entries for undocumented members John Snow
2025-02-05 23:11 ` [PATCH 26/42] qapi/parser: add undocumented stub members to all_sections John Snow
2025-02-05 23:11 ` [PATCH 27/42] qapi: differentiate "intro" and "detail" sections John Snow
2025-02-11 15:00   ` Markus Armbruster
2025-02-18 20:30     ` John Snow
2025-02-05 23:11 ` [PATCH 28/42] qapi/parser: prohibit untagged sections between tagged sections John Snow
2025-02-12  9:06   ` Markus Armbruster
2025-02-18 21:36     ` John Snow
2025-02-19  7:58       ` Markus Armbruster
2025-02-17 11:53   ` Markus Armbruster
2025-02-05 23:11 ` [PATCH 29/42] qapi: Add "Details:" disambiguation marker John Snow
2025-02-12  9:37   ` Markus Armbruster
2025-02-18 22:22     ` John Snow
2025-02-17 10:51   ` Markus Armbruster
2025-02-18 22:23     ` John Snow
2025-02-17 11:55   ` Markus Armbruster
2025-02-18 22:26     ` John Snow
2025-02-19  9:04       ` Markus Armbruster
2025-02-17 12:13   ` Markus Armbruster
2025-02-18 22:48     ` John Snow
2025-02-19 12:49       ` Markus Armbruster
2025-02-05 23:11 ` [PATCH 30/42] docs/qapidoc: add minimalistic inliner John Snow
2025-02-05 23:11 ` [PATCH 31/42] docs/qapidoc: autogenerate undocumented return docs John Snow
2025-02-05 23:11 ` [PATCH 32/42] docs/qapidoc: Add generated returns documentation to inliner John Snow
2025-02-05 23:11 ` [PATCH 33/42] docs/qmp: add target to Out-of-band execution section John Snow
2025-02-05 23:12 ` [PATCH 34/42] docs/qapidoc: document the "out-of-band" pseudofeature John Snow
2025-02-05 23:12 ` [PATCH 35/42] docs/qapidoc: generate out-of-band pseudofeature sections John Snow
2025-02-05 23:12 ` [PATCH 36/42] qapi/parser: add "meta" kind to QAPIDoc.Kind John Snow
2025-02-05 23:12 ` [PATCH 37/42] qapi/schema: add __iter__ method to QAPISchemaVariants John Snow
2025-02-05 23:12 ` John Snow [this message]
2025-02-05 23:12 ` [PATCH 39/42] qapi/schema: add doc_visible property to QAPISchemaDefinition John Snow
2025-02-05 23:12 ` [PATCH 40/42] docs/qapidoc: cull (most) un-named entities from docs John Snow
2025-02-05 23:12 ` [PATCH 41/42] qapi: resolve filenames in info structures John Snow
2025-02-05 23:12 ` [PATCH 42/42] docs/qapidoc: add intermediate output debugger John Snow
2025-02-14 12:05 ` [PATCH 00/42] docs: add sphinx-domain rST generator to qapidoc Markus Armbruster
2025-02-18 20:01   ` John Snow
2025-02-19 13:22     ` Markus Armbruster
2025-02-20 20:32       ` John Snow
2025-02-21  6:41         ` Markus Armbruster
2025-02-21 18:08           ` John Snow

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=20250205231208.1480762-39-jsnow@redhat.com \
    --to=jsnow@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=farosas@suse.de \
    --cc=jasowang@redhat.com \
    --cc=lukasstraub2@web.de \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=michael.roth@amd.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    --cc=wangyanan55@huawei.com \
    --cc=zhao1.liu@intel.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).