From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: John Snow <jsnow@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Eduardo Habkost <ehabkost@redhat.com>,
Cleber Rosa <crosa@redhat.com>
Subject: [PATCH v3 43/47] qapi/types.py: add type hint annotations
Date: Thu, 24 Sep 2020 20:28:56 -0400 [thread overview]
Message-ID: <20200925002900.465855-44-jsnow@redhat.com> (raw)
In-Reply-To: <20200925002900.465855-1-jsnow@redhat.com>
Annotations do not change runtime behavior.
This commit *only* adds annotations.
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
---
scripts/qapi/mypy.ini | 5 ---
scripts/qapi/types.py | 86 ++++++++++++++++++++++++++++++++-----------
2 files changed, 64 insertions(+), 27 deletions(-)
diff --git a/scripts/qapi/mypy.ini b/scripts/qapi/mypy.ini
index 9ce8b56f22..3babc380a8 100644
--- a/scripts/qapi/mypy.ini
+++ b/scripts/qapi/mypy.ini
@@ -29,11 +29,6 @@ disallow_untyped_defs = False
disallow_incomplete_defs = False
check_untyped_defs = False
-[mypy-qapi.types]
-disallow_untyped_defs = False
-disallow_incomplete_defs = False
-check_untyped_defs = False
-
[mypy-qapi.visit]
disallow_untyped_defs = False
disallow_incomplete_defs = False
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index cc6dad4c89..b65188bac3 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -13,6 +13,8 @@
# See the COPYING file in the top-level directory.
"""
+from typing import List, Optional
+
from .common import (
c_enum_const,
c_name,
@@ -21,14 +23,25 @@
mcgen,
)
from .gen import QAPISchemaModularCVisitor, ifcontext
-from .schema import QAPISchemaEnumMember, QAPISchemaObjectType
+from .schema import (
+ QAPISchema,
+ QAPISchemaEnumMember,
+ QAPISchemaFeature,
+ QAPISchemaObjectType,
+ QAPISchemaObjectTypeMember,
+ QAPISchemaType,
+ QAPISchemaVariants,
+)
+from .source import QAPISourceInfo
# variants must be emitted before their container; track what has already
# been output
objects_seen = set()
-def gen_enum_lookup(name, members, prefix=None):
+def gen_enum_lookup(name: str,
+ members: List[QAPISchemaEnumMember],
+ prefix: Optional[str] = None) -> str:
ret = mcgen('''
const QEnumLookup %(c_name)s_lookup = {
@@ -53,7 +66,9 @@ def gen_enum_lookup(name, members, prefix=None):
return ret
-def gen_enum(name, members, prefix=None):
+def gen_enum(name: str,
+ members: List[QAPISchemaEnumMember],
+ prefix: Optional[str] = None) -> str:
# append automatically generated _MAX value
enum_members = members + [QAPISchemaEnumMember('_MAX', None)]
@@ -87,7 +102,7 @@ def gen_enum(name, members, prefix=None):
return ret
-def gen_fwd_object_or_array(name):
+def gen_fwd_object_or_array(name: str) -> str:
return mcgen('''
typedef struct %(c_name)s %(c_name)s;
@@ -95,7 +110,7 @@ def gen_fwd_object_or_array(name):
c_name=c_name(name))
-def gen_array(name, element_type):
+def gen_array(name: str, element_type: QAPISchemaType) -> str:
return mcgen('''
struct %(c_name)s {
@@ -106,7 +121,7 @@ def gen_array(name, element_type):
c_name=c_name(name), c_type=element_type.c_type())
-def gen_struct_members(members):
+def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
ret = ''
for memb in members:
ret += gen_if(memb.ifcond)
@@ -123,7 +138,10 @@ def gen_struct_members(members):
return ret
-def gen_object(name, ifcond, base, members, variants):
+def gen_object(name: str, ifcond: List[str],
+ base: Optional[QAPISchemaObjectType],
+ members: List[QAPISchemaObjectTypeMember],
+ variants: Optional[QAPISchemaVariants]) -> str:
if name in objects_seen:
return ''
objects_seen.add(name)
@@ -177,7 +195,7 @@ def gen_object(name, ifcond, base, members, variants):
return ret
-def gen_upcast(name, base):
+def gen_upcast(name: str, base: QAPISchemaObjectType) -> str:
# C makes const-correctness ugly. We have to cast away const to let
# this function work for both const and non-const obj.
return mcgen('''
@@ -190,7 +208,7 @@ def gen_upcast(name, base):
c_name=c_name(name), base=base.c_name())
-def gen_variants(variants):
+def gen_variants(variants: QAPISchemaVariants) -> str:
ret = mcgen('''
union { /* union tag is @%(c_name)s */
''',
@@ -214,7 +232,7 @@ def gen_variants(variants):
return ret
-def gen_type_cleanup_decl(name):
+def gen_type_cleanup_decl(name: str) -> str:
ret = mcgen('''
void qapi_free_%(c_name)s(%(c_name)s *obj);
@@ -224,7 +242,7 @@ def gen_type_cleanup_decl(name):
return ret
-def gen_type_cleanup(name):
+def gen_type_cleanup(name: str) -> str:
ret = mcgen('''
void qapi_free_%(c_name)s(%(c_name)s *obj)
@@ -246,12 +264,12 @@ def gen_type_cleanup(name):
class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
- def __init__(self, prefix):
+ def __init__(self, prefix: str):
super().__init__(
prefix, 'qapi-types', ' * Schema-defined QAPI types',
' * Built-in QAPI types', __doc__)
- def _begin_system_module(self, name):
+ def _begin_system_module(self, name: None) -> None:
self._genc.preamble_add(mcgen('''
#include "qemu/osdep.h"
#include "qapi/dealloc-visitor.h"
@@ -262,7 +280,7 @@ def _begin_system_module(self, name):
#include "qapi/util.h"
'''))
- def _begin_user_module(self, name):
+ def _begin_user_module(self, name: str) -> None:
types = self._module_basename('qapi-types', name)
visit = self._module_basename('qapi-visit', name)
self._genc.preamble_add(mcgen('''
@@ -276,27 +294,43 @@ def _begin_user_module(self, name):
#include "qapi/qapi-builtin-types.h"
'''))
- def visit_begin(self, schema):
+ def visit_begin(self, schema: QAPISchema) -> None:
# gen_object() is recursive, ensure it doesn't visit the empty type
objects_seen.add(schema.the_empty_object_type.name)
- def _gen_type_cleanup(self, name):
+ def _gen_type_cleanup(self, name: str) -> None:
self._genh.add(gen_type_cleanup_decl(name))
self._genc.add(gen_type_cleanup(name))
- def visit_enum_type(self, name, info, ifcond, features, members, prefix):
+ def visit_enum_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: List[str],
+ features: List[QAPISchemaFeature],
+ members: List[QAPISchemaEnumMember],
+ prefix: Optional[str]) -> None:
with ifcontext(ifcond, self._genh, self._genc):
self._genh.preamble_add(gen_enum(name, members, prefix))
self._genc.add(gen_enum_lookup(name, members, prefix))
- def visit_array_type(self, name, info, ifcond, element_type):
+ def visit_array_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: List[str],
+ element_type: QAPISchemaType) -> None:
with ifcontext(ifcond, self._genh, self._genc):
self._genh.preamble_add(gen_fwd_object_or_array(name))
self._genh.add(gen_array(name, element_type))
self._gen_type_cleanup(name)
- def visit_object_type(self, name, info, ifcond, features,
- base, members, variants):
+ def visit_object_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: List[str],
+ features: List[QAPISchemaFeature],
+ base: Optional[QAPISchemaObjectType],
+ members: List[QAPISchemaObjectTypeMember],
+ variants: Optional[QAPISchemaVariants]) -> None:
# Nothing to do for the special empty builtin
if name == 'q_empty':
return
@@ -312,7 +346,12 @@ def visit_object_type(self, name, info, ifcond, features,
# implicit types won't be directly allocated/freed
self._gen_type_cleanup(name)
- def visit_alternate_type(self, name, info, ifcond, features, variants):
+ def visit_alternate_type(self,
+ name: str,
+ info: QAPISourceInfo,
+ ifcond: List[str],
+ features: List[QAPISchemaFeature],
+ variants: QAPISchemaVariants) -> None:
with ifcontext(ifcond, self._genh):
self._genh.preamble_add(gen_fwd_object_or_array(name))
self._genh.add(gen_object(name, ifcond, None,
@@ -321,7 +360,10 @@ def visit_alternate_type(self, name, info, ifcond, features, variants):
self._gen_type_cleanup(name)
-def gen_types(schema, output_dir, prefix, opt_builtins):
+def gen_types(schema: QAPISchema,
+ output_dir: str,
+ prefix: str,
+ opt_builtins: bool) -> None:
vis = QAPISchemaGenTypeVisitor(prefix)
schema.visit(vis)
vis.write(output_dir, opt_builtins)
--
2.26.2
next prev parent reply other threads:[~2020-09-25 1:07 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-25 0:28 [PATCH v3 00/47] qapi: static typing conversion, pt1 John Snow
2020-09-25 0:28 ` [PATCH v3 01/47] [DO-NOT-MERGE] docs: replace single backtick (`) with double-backtick (``) John Snow
2020-09-29 2:47 ` Cleber Rosa
2020-09-25 0:28 ` [PATCH v3 02/47] [DO-NOT-MERGE] docs: repair broken references John Snow
2020-09-29 2:48 ` Cleber Rosa
2020-09-29 3:14 ` Cleber Rosa
2020-09-29 15:30 ` John Snow
2020-09-29 18:16 ` John Snow
2020-09-25 0:28 ` [PATCH v3 03/47] [DO-NOT-MERGE] docs/sphinx: change default role to "any" John Snow
2020-09-29 3:30 ` Cleber Rosa
2020-09-29 15:33 ` John Snow
2020-09-29 18:20 ` John Snow
2020-09-25 0:28 ` [PATCH v3 04/47] qapi: modify docstrings to be sphinx-compatible John Snow
2020-09-29 3:39 ` Cleber Rosa
2020-09-29 15:37 ` John Snow
2020-09-25 0:28 ` [PATCH v3 05/47] qapi/doc.py: Change code templates from function to string John Snow
2020-09-25 8:59 ` Markus Armbruster
2020-09-25 14:23 ` John Snow
2020-09-29 3:51 ` Cleber Rosa
2020-09-29 18:25 ` John Snow
2020-09-25 0:28 ` [PATCH v3 06/47] [DO-NOT-MERGE] docs: enable sphinx-autodoc for scripts/qapi John Snow
2020-09-29 4:00 ` Cleber Rosa
2020-09-29 18:30 ` John Snow
2020-09-25 0:28 ` [PATCH v3 07/47] qapi-gen: Separate arg-parsing from generation John Snow
2020-09-29 4:02 ` Cleber Rosa
2020-09-25 0:28 ` [PATCH v3 08/47] qapi: move generator entrypoint into module John Snow
2020-09-25 0:28 ` [PATCH v3 09/47] [DO-NOT-MERGE] docs: add scripts/qapi/main to python manual John Snow
2020-09-25 0:28 ` [PATCH v3 10/47] qapi: Prefer explicit relative imports John Snow
2020-09-25 0:28 ` [PATCH v3 11/47] qapi: Remove wildcard includes John Snow
2020-09-25 0:28 ` [PATCH v3 12/47] qapi: enforce import order/styling with isort John Snow
2020-09-25 9:20 ` Markus Armbruster
2020-09-25 15:26 ` John Snow
2020-09-28 12:13 ` Markus Armbruster
2020-09-28 14:34 ` John Snow
2020-09-29 4:13 ` Cleber Rosa
2020-09-29 4:15 ` Cleber Rosa
2020-09-25 0:28 ` [PATCH v3 13/47] qapi: delint using flake8 John Snow
2020-09-25 0:28 ` [PATCH v3 14/47] qapi: add pylintrc John Snow
2020-09-25 0:28 ` [PATCH v3 15/47] qapi/common.py: Remove python compatibility workaround John Snow
2020-09-25 0:28 ` [PATCH v3 16/47] qapi/common.py: Add indent manager John Snow
2020-09-25 0:28 ` [PATCH v3 17/47] qapi/common.py: delint with pylint John Snow
2020-09-25 0:28 ` [PATCH v3 18/47] qapi/common.py: Replace one-letter 'c' variable John Snow
2020-09-25 0:28 ` [PATCH v3 19/47] qapi/common.py: check with pylint John Snow
2020-09-25 0:28 ` [PATCH v3 20/47] qapi/common.py: add type hint annotations John Snow
2020-09-25 0:28 ` [PATCH v3 21/47] qapi/common.py: Convert comments into docstrings, and elaborate John Snow
2020-09-25 0:28 ` [PATCH v3 22/47] qapi/common.py: move build_params into gen.py John Snow
2020-09-25 0:28 ` [PATCH v3 23/47] qapi: establish mypy type-checking baseline John Snow
2020-09-29 4:17 ` Cleber Rosa
2020-09-25 0:28 ` [PATCH v3 24/47] qapi/events.py: add type hint annotations John Snow
2020-09-25 0:28 ` [PATCH v3 25/47] qapi/events.py: Move comments into docstrings John Snow
2020-09-25 0:28 ` [PATCH v3 26/47] qapi/commands.py: Don't re-bind to variable of different type John Snow
2020-09-25 0:28 ` [PATCH v3 27/47] qapi/commands.py: add type hint annotations John Snow
2020-09-25 0:28 ` [PATCH v3 28/47] qapi/commands.py: enable checking with mypy John Snow
2020-09-25 0:28 ` [PATCH v3 29/47] qapi/source.py: add type hint annotations John Snow
2020-09-29 4:18 ` Cleber Rosa
2020-09-25 0:28 ` [PATCH v3 30/47] qapi/source.py: delint with pylint John Snow
2020-09-25 0:28 ` [PATCH v3 31/47] qapi/gen.py: Fix edge-case of _is_user_module John Snow
2020-09-29 4:22 ` Cleber Rosa
2020-09-25 0:28 ` [PATCH v3 32/47] qapi/gen.py: add type hint annotations John Snow
2020-09-25 0:28 ` [PATCH v3 33/47] qapi/gen.py: Enable checking with mypy John Snow
2020-09-25 0:28 ` [PATCH v3 34/47] qapi/gen.py: Remove unused parameter John Snow
2020-09-25 0:28 ` [PATCH v3 35/47] qapi/gen.py: update write() to be more idiomatic John Snow
2020-09-25 0:28 ` [PATCH v3 36/47] qapi/gen.py: delint with pylint John Snow
2020-09-25 0:28 ` [PATCH v3 37/47] qapi/introspect.py: assert obj is a dict when features are given John Snow
2020-09-25 0:28 ` [PATCH v3 38/47] qapi/instrospect.py: add preliminary type hint annotations John Snow
2020-09-25 0:28 ` [PATCH v3 39/47] qapi/introspect.py: add _gen_features helper John Snow
2020-09-25 0:28 ` [PATCH v3 40/47] qapi/introspect.py: Unify return type of _make_tree() John Snow
2020-09-25 0:28 ` [PATCH v3 41/47] qapi/introspect.py: replace 'extra' dict with 'comment' argument John Snow
2020-09-25 0:28 ` [PATCH v3 42/47] qapi/introspect.py: create a typed 'Node' data structure John Snow
2020-09-25 0:28 ` John Snow [this message]
2020-09-25 0:28 ` [PATCH v3 44/47] qapi/types.py: remove one-letter variables John Snow
2020-09-25 0:28 ` [PATCH v3 45/47] qapi/visit.py: assert tag_member contains a QAPISchemaEnumType John Snow
2020-09-25 0:28 ` [PATCH v3 46/47] qapi/visit.py: remove unused parameters from gen_visit_object John Snow
2020-09-25 0:29 ` [PATCH v3 47/47] qapi/visit.py: add type hint annotations John Snow
2020-09-28 15:17 ` [PATCH v3 00/47] qapi: static typing conversion, pt1 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=20200925002900.465855-44-jsnow@redhat.com \
--to=jsnow@redhat.com \
--cc=armbru@redhat.com \
--cc=crosa@redhat.com \
--cc=ehabkost@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).