[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 43/47] qapi/types.py: add type hint annotations
From: |
John Snow |
Subject: |
[PATCH v3 43/47] qapi/types.py: add type hint annotations |
Date: |
Thu, 24 Sep 2020 20:28:56 -0400 |
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
- Re: [PATCH v3 23/47] qapi: establish mypy type-checking baseline, (continued)
- [PATCH v3 33/47] qapi/gen.py: Enable checking with mypy, John Snow, 2020/09/24
- [PATCH v3 25/47] qapi/events.py: Move comments into docstrings, John Snow, 2020/09/24
- [PATCH v3 16/47] qapi/common.py: Add indent manager, John Snow, 2020/09/24
- [PATCH v3 22/47] qapi/common.py: move build_params into gen.py, John Snow, 2020/09/24
- [PATCH v3 35/47] qapi/gen.py: update write() to be more idiomatic, John Snow, 2020/09/24
- [PATCH v3 27/47] qapi/commands.py: add type hint annotations, John Snow, 2020/09/24
- [PATCH v3 36/47] qapi/gen.py: delint with pylint, John Snow, 2020/09/24
- [PATCH v3 21/47] qapi/common.py: Convert comments into docstrings, and elaborate, John Snow, 2020/09/24
- [PATCH v3 41/47] qapi/introspect.py: replace 'extra' dict with 'comment' argument, John Snow, 2020/09/24
- [PATCH v3 43/47] qapi/types.py: add type hint annotations,
John Snow <=
- [PATCH v3 28/47] qapi/commands.py: enable checking with mypy, John Snow, 2020/09/24
- [PATCH v3 26/47] qapi/commands.py: Don't re-bind to variable of different type, John Snow, 2020/09/24
- [PATCH v3 29/47] qapi/source.py: add type hint annotations, John Snow, 2020/09/24
- [PATCH v3 34/47] qapi/gen.py: Remove unused parameter, John Snow, 2020/09/24
- [PATCH v3 18/47] qapi/common.py: Replace one-letter 'c' variable, John Snow, 2020/09/24
- [PATCH v3 30/47] qapi/source.py: delint with pylint, John Snow, 2020/09/24
- [PATCH v3 37/47] qapi/introspect.py: assert obj is a dict when features are given, John Snow, 2020/09/24
- [PATCH v3 45/47] qapi/visit.py: assert tag_member contains a QAPISchemaEnumType, John Snow, 2020/09/24
- [PATCH v3 31/47] qapi/gen.py: Fix edge-case of _is_user_module, John Snow, 2020/09/24