[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v5 15/36] qapi/common.py: add type hint annotations
From: |
Markus Armbruster |
Subject: |
Re: [PATCH v5 15/36] qapi/common.py: add type hint annotations |
Date: |
Wed, 07 Oct 2020 11:03:36 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) |
John Snow <jsnow@redhat.com> writes:
> 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/common.py | 27 ++++++++++++++++-----------
> 1 file changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
> index 338adedef4f..74a2c001ed9 100644
> --- a/scripts/qapi/common.py
> +++ b/scripts/qapi/common.py
> @@ -12,6 +12,7 @@
> # See the COPYING file in the top-level directory.
>
> import re
> +from typing import Optional, Sequence
>
>
> EATSPACE = '\033EATSPACE.'
> @@ -22,7 +23,7 @@
> # ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1
> # ENUM_NAME -> ENUM_NAME, ENUM_NAME1 -> ENUM_NAME1, ENUM_Name2 -> ENUM_NAME2
> # ENUM24_Name -> ENUM24_NAME
> -def camel_to_upper(value):
> +def camel_to_upper(value: str) -> str:
> c_fun_str = c_name(value, False)
> if value.isupper():
> return c_fun_str
> @@ -41,7 +42,9 @@ def camel_to_upper(value):
> return new_name.lstrip('_').upper()
>
>
> -def c_enum_const(type_name, const_name, prefix=None):
> +def c_enum_const(type_name: str,
> + const_name: str,
> + prefix: Optional[str] = None) -> str:
> if prefix is not None:
> type_name = prefix
> return camel_to_upper(type_name) + '_' + c_name(const_name,
> False).upper()
> @@ -56,7 +59,7 @@ def c_enum_const(type_name, const_name, prefix=None):
> # into substrings of a generated C function name.
> # '__a.b_c' -> '__a_b_c', 'x-foo' -> 'x_foo'
> # protect=True: 'int' -> 'q_int'; protect=False: 'int' -> 'int'
> -def c_name(name, protect=True):
> +def c_name(name: str, protect: bool = True) -> str:
> # ANSI X3J11/88-090, 3.1.1
> c89_words = set(['auto', 'break', 'case', 'char', 'const', 'continue',
> 'default', 'do', 'double', 'else', 'enum', 'extern',
> @@ -131,24 +134,24 @@ def decrease(self, amount: int = 4) -> None:
>
> # Generate @code with @kwds interpolated.
> # Obey indent, and strip EATSPACE.
> -def cgen(code, **kwds):
> +def cgen(code: str, **kwds: object) -> str:
> raw = code % kwds
> if indent:
> raw = re.sub(r'^(?!(#|$))', str(indent), raw, flags=re.MULTILINE)
> return re.sub(re.escape(EATSPACE) + r' *', '', raw)
>
>
> -def mcgen(code, **kwds):
> +def mcgen(code: str, **kwds: object) -> str:
> if code[0] == '\n':
> code = code[1:]
> return cgen(code, **kwds)
>
>
> -def c_fname(filename):
> +def c_fname(filename: str) -> str:
> return re.sub(r'[^A-Za-z0-9_]', '_', filename)
>
>
> -def guardstart(name):
> +def guardstart(name: str) -> str:
> return mcgen('''
> #ifndef %(name)s
> #define %(name)s
> @@ -157,7 +160,7 @@ def guardstart(name):
> name=c_fname(name).upper())
>
>
> -def guardend(name):
> +def guardend(name: str) -> str:
> return mcgen('''
>
> #endif /* %(name)s */
> @@ -165,7 +168,7 @@ def guardend(name):
> name=c_fname(name).upper())
>
>
> -def gen_if(ifcond):
> +def gen_if(ifcond: Sequence[str]) -> str:
> ret = ''
> for ifc in ifcond:
> ret += mcgen('''
> @@ -174,7 +177,7 @@ def gen_if(ifcond):
> return ret
>
>
> -def gen_endif(ifcond):
> +def gen_endif(ifcond: Sequence[str]) -> str:
> ret = ''
> for ifc in reversed(ifcond):
> ret += mcgen('''
> @@ -183,7 +186,9 @@ def gen_endif(ifcond):
> return ret
>
>
> -def build_params(arg_type, boxed, extra=None):
> +def build_params(arg_type,
> + boxed: bool,
> + extra: Optional[str] = None) -> str:
> ret = ''
> sep = ''
> if boxed:
@arg_type is the only parameter left unannotated. Scratching head...
aha:
qapi/common.py: move build_params into gen.py
Including it in common.py creates a circular import dependency; schema
relies on common, but common.build_params requires a type annotation
from schema. To type this properly, it needs to be moved outside the
cycle.
Let's amend the commit message:
Note that build_params() cannot be fully annotated due to import
dependency issues. The commit after next will take care of it.
If we swap the next two commits, the fix follows immediately. Better,
but only worth it if swapping is pretty much effortless.
- Re: [PATCH v5 11/36] qapi/common.py: Add indent manager, (continued)
[PATCH v5 12/36] qapi/common.py: delint with pylint, John Snow, 2020/10/05
[PATCH v5 13/36] qapi/common.py: Replace one-letter 'c' variable, John Snow, 2020/10/05
[PATCH v5 14/36] qapi/common.py: check with pylint, John Snow, 2020/10/05
[PATCH v5 15/36] qapi/common.py: add type hint annotations, John Snow, 2020/10/05
- Re: [PATCH v5 15/36] qapi/common.py: add type hint annotations,
Markus Armbruster <=
[PATCH v5 16/36] qapi/common.py: Convert comments into docstrings, and elaborate, John Snow, 2020/10/05
[PATCH v5 17/36] qapi/common.py: move build_params into gen.py, John Snow, 2020/10/05
[PATCH v5 18/36] qapi: establish mypy type-checking baseline, John Snow, 2020/10/05