John Snow <[email protected]> writes:
> This class is a generic, top-level directive for documenting some kind
> of QAPI thingamajig that we expect to go into the Index. This class
> doesn't do much by itself, and it isn't yet associated with any
> particular directive.
>
> Only handle_signature() is defined in the base class; get_index_text and
> add_target_and_index are new methods defined here; they are based
> heavily on the layout and format of the Python domain's general object
> class.
>
> Signed-off-by: John Snow <[email protected]>
> ---
> docs/sphinx/qapi_domain.py | 65 ++++++++++++++++++++++++++++++++++++--
> 1 file changed, 63 insertions(+), 2 deletions(-)
>
> diff --git a/docs/sphinx/qapi_domain.py b/docs/sphinx/qapi_domain.py
> index 49d42c0921c..0365891f354 100644
> --- a/docs/sphinx/qapi_domain.py
> +++ b/docs/sphinx/qapi_domain.py
> @@ -14,11 +14,13 @@
> NamedTuple,
> Optional,
> Tuple,
> + cast,
> )
>
> from docutils import nodes
>
> -from sphinx.addnodes import pending_xref
> +from sphinx.addnodes import desc_signature, pending_xref
> +from sphinx.directives import ObjectDescription
> from sphinx.domains import (
> Domain,
> Index,
> @@ -28,7 +30,7 @@
> from sphinx.locale import _, __
> from sphinx.roles import XRefRole
> from sphinx.util import logging
> -from sphinx.util.nodes import make_refnode
> +from sphinx.util.nodes import make_id, make_refnode
>
>
> if TYPE_CHECKING:
> @@ -96,6 +98,65 @@ def process_link(
> return title, target
>
>
> +Signature = str
> +
> +
> +class QAPIDescription(ObjectDescription[Signature]):
> + """
> + Generic QAPI description.
> +
> + Abstract class, not instantiated directly.
> + """
> +
> + def handle_signature(self, sig: str, signode: desc_signature) ->
> Signature:
> + # Do nothing. The return value here is the "name" of the entity
> + # being documented; for QAPI, this is the same as the
> + # "signature", which is just a name.
> +
> + # Normally this method must also populate signode with nodes to
> + # render the signature; here we do nothing instead.
> + return sig
> +
> + def get_index_text(self, name: Signature) -> Tuple[str, str]:
> + """Return the text for the index entry of the object."""
> +
> + # NB: this is used for the global index, not the QAPI index.
> + return ("single", f"{name} (QMP {self.objtype})")
> +
> + def add_target_and_index(
> + self, name: Signature, sig: str, signode: desc_signature
> + ) -> None:
> + # name is the return value of handle_signature.
> + # sig is the original, raw text argument to handle_signature.
> + # For QAPI, these are identical, currently.
> +
> + assert self.objtype
> +
> + # If we're documenting a module, don't include the module as
> + # part of the FQN.
> + 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(self.env, self.state.document, self.objtype,
> fullname)
pycodestyle-3 points out:
docs/sphinx/qapi_domain.py:144:80: E501 line too long (80 > 79 characters)
> + signode["ids"].append(node_id)
> +
> + self.state.document.note_explicit_target(signode)
> + domain = cast(QAPIDomain, self.env.get_domain("qapi"))
> + domain.note_object(fullname, self.objtype, node_id, location=signode)
This one's pushing it, too :)
> +
> + if "no-index-entry" not in self.options:
> + arity, indextext = self.get_index_text(name)
> + assert self.indexnode is not None
> + if indextext:
> + self.indexnode["entries"].append(
> + (arity, indextext, node_id, "", None)
> + )
> +
> +
> class QAPIIndex(Index):
> """
> Index subclass to provide the QAPI definition index.