docs/qapidoc: Fix static typing on qapidoc.py

Now that the legacy code is factored out, fix up the typing on the
remaining code in qapidoc.py. Add a type ignore to qapi_legacy.py to
prevent the errors there from bleeding out into qapidoc.py.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-ID: <20250311034303.75779-38-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-10 23:42:35 -04:00 committed by Markus Armbruster
parent 7640410d5c
commit 45d483a851
2 changed files with 26 additions and 15 deletions

View file

@ -24,17 +24,18 @@ The Sphinx documentation on writing extensions is at:
https://www.sphinx-doc.org/en/master/development/index.html https://www.sphinx-doc.org/en/master/development/index.html
""" """
from __future__ import annotations
import os import os
import sys import sys
from typing import List from typing import TYPE_CHECKING
from docutils import nodes from docutils import nodes
from docutils.parsers.rst import Directive, directives from docutils.parsers.rst import Directive, directives
from qapi.error import QAPIError from qapi.error import QAPIError
from qapi.gen import QAPISchemaVisitor from qapi.schema import QAPISchema, QAPISchemaVisitor
from qapi.schema import QAPISchema
from qapidoc_legacy import QAPISchemaGenRSTVisitor from qapidoc_legacy import QAPISchemaGenRSTVisitor # type: ignore
from sphinx import addnodes from sphinx import addnodes
from sphinx.directives.code import CodeBlock from sphinx.directives.code import CodeBlock
from sphinx.errors import ExtensionError from sphinx.errors import ExtensionError
@ -42,6 +43,15 @@ from sphinx.util.docutils import switch_source_input
from sphinx.util.nodes import nested_parse_with_titles from sphinx.util.nodes import nested_parse_with_titles
if TYPE_CHECKING:
from typing import Any, List, Sequence
from docutils.statemachine import StringList
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
__version__ = "1.0" __version__ = "1.0"
@ -53,11 +63,11 @@ class QAPISchemaGenDepVisitor(QAPISchemaVisitor):
schema file associated with each module in the QAPI input. schema file associated with each module in the QAPI input.
""" """
def __init__(self, env, qapidir): def __init__(self, env: Any, qapidir: str) -> None:
self._env = env self._env = env
self._qapidir = qapidir self._qapidir = qapidir
def visit_module(self, name): def visit_module(self, name: str) -> None:
if name != "./builtin": if name != "./builtin":
qapifile = self._qapidir + "/" + name qapifile = self._qapidir + "/" + name
self._env.note_dependency(os.path.abspath(qapifile)) self._env.note_dependency(os.path.abspath(qapifile))
@ -65,10 +75,10 @@ class QAPISchemaGenDepVisitor(QAPISchemaVisitor):
class NestedDirective(Directive): class NestedDirective(Directive):
def run(self): def run(self) -> Sequence[nodes.Node]:
raise NotImplementedError raise NotImplementedError
def do_parse(self, rstlist, node): def do_parse(self, rstlist: StringList, node: nodes.Node) -> None:
""" """
Parse rST source lines and add them to the specified node Parse rST source lines and add them to the specified node
@ -93,15 +103,15 @@ class QAPIDocDirective(NestedDirective):
} }
has_content = False has_content = False
def new_serialno(self): def new_serialno(self) -> str:
"""Return a unique new ID string suitable for use as a node's ID""" """Return a unique new ID string suitable for use as a node's ID"""
env = self.state.document.settings.env env = self.state.document.settings.env
return "qapidoc-%d" % env.new_serialno("qapidoc") return "qapidoc-%d" % env.new_serialno("qapidoc")
def transmogrify(self, schema) -> nodes.Element: def transmogrify(self, schema: QAPISchema) -> nodes.Element:
raise NotImplementedError raise NotImplementedError
def legacy(self, schema) -> nodes.Element: def legacy(self, schema: QAPISchema) -> nodes.Element:
vis = QAPISchemaGenRSTVisitor(self) vis = QAPISchemaGenRSTVisitor(self)
vis.visit_begin(schema) vis.visit_begin(schema)
for doc in schema.docs: for doc in schema.docs:
@ -109,9 +119,9 @@ class QAPIDocDirective(NestedDirective):
vis.symbol(doc, schema.lookup_entity(doc.symbol)) vis.symbol(doc, schema.lookup_entity(doc.symbol))
else: else:
vis.freeform(doc) vis.freeform(doc)
return vis.get_document_node() return vis.get_document_node() # type: ignore
def run(self): def run(self) -> Sequence[nodes.Node]:
env = self.state.document.settings.env env = self.state.document.settings.env
qapifile = env.config.qapidoc_srctree + "/" + self.arguments[0] qapifile = env.config.qapidoc_srctree + "/" + self.arguments[0]
qapidir = os.path.dirname(qapifile) qapidir = os.path.dirname(qapifile)
@ -185,7 +195,7 @@ class QMPExample(CodeBlock, NestedDirective):
) )
return node return node
def admonition_wrap(self, *content) -> List[nodes.Node]: def admonition_wrap(self, *content: nodes.Node) -> List[nodes.Node]:
title = "Example:" title = "Example:"
if "title" in self.options: if "title" in self.options:
title = f"{title} {self.options['title']}" title = f"{title} {self.options['title']}"
@ -231,7 +241,7 @@ class QMPExample(CodeBlock, NestedDirective):
return self.admonition_wrap(*content_nodes) return self.admonition_wrap(*content_nodes)
def setup(app): def setup(app: Sphinx) -> ExtensionMetadata:
"""Register qapi-doc directive with Sphinx""" """Register qapi-doc directive with Sphinx"""
app.add_config_value("qapidoc_srctree", None, "env") app.add_config_value("qapidoc_srctree", None, "env")
app.add_directive("qapi-doc", QAPIDocDirective) app.add_directive("qapi-doc", QAPIDocDirective)

View file

@ -1,4 +1,5 @@
# coding=utf-8 # coding=utf-8
# type: ignore
# #
# QEMU qapidoc QAPI file parsing extension # QEMU qapidoc QAPI file parsing extension
# #