On Wed, Sep 23, 2020 at 08:29:17PM -0400, John Snow wrote: > On 9/23/20 7:51 PM, Cleber Rosa wrote: > > On Tue, Sep 22, 2020 at 05:00:48PM -0400, John Snow wrote: > > > Annotations do not change runtime behavior. > > > This commit *only* adds annotations. > > > > > > Signed-off-by: John Snow <js...@redhat.com> > > > --- > > > scripts/qapi/gen.py | 102 +++++++++++++++++++++++--------------------- > > > 1 file changed, 53 insertions(+), 49 deletions(-) > > > > > > diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py > > > index cb2b2655c3..df8cf8271c 100644 > > > --- a/scripts/qapi/gen.py > > > +++ b/scripts/qapi/gen.py > > > @@ -17,7 +17,7 @@ > > > import errno > > > import os > > > import re > > > -from typing import Optional > > > +from typing import Dict, Generator, List, Optional, Tuple > > > from .common import ( > > > c_fname, > > > @@ -32,31 +32,31 @@ > > > QAPISchemaObjectType, > > > QAPISchemaVisitor, > > > ) > > > +from .source import QAPISourceInfo > > > class QAPIGen: > > > - > > > - def __init__(self, fname): > > > + def __init__(self, fname: Optional[str]): > > > self.fname = fname > > > self._preamble = '' > > > self._body = '' > > > - def preamble_add(self, text): > > > + def preamble_add(self, text: str) -> None: > > > self._preamble += text > > > - def add(self, text): > > > + def add(self, text: str) -> None: > > > self._body += text > > > - def get_content(self): > > > + def get_content(self) -> str: > > > return self._top() + self._preamble + self._body + > > > self._bottom() > > > - def _top(self): > > > + def _top(self) -> str: > > > return '' > > > - def _bottom(self): > > > + def _bottom(self) -> str: > > > return '' > > > - def write(self, output_dir): > > > + def write(self, output_dir: str) -> None: > > > # Include paths starting with ../ are used to reuse modules of > > > the main > > > # schema in specialised schemas. Don't overwrite the files that > > > are > > > # already generated for the main schema. > > > @@ -81,7 +81,7 @@ def write(self, output_dir): > > > f.close() > > > -def _wrap_ifcond(ifcond, before, after): > > > +def _wrap_ifcond(ifcond: List[str], before: str, after: str) -> str: > > > if before == after: > > > return after # suppress empty #if ... #endif > > > @@ -121,40 +121,38 @@ def build_params(arg_type: > > > Optional[QAPISchemaObjectType], > > > class QAPIGenCCode(QAPIGen): > > > - > > > - def __init__(self, fname): > > > + def __init__(self, fname: Optional[str]): > > > super().__init__(fname) > > > - self._start_if = None > > > + self._start_if: Optional[Tuple[List[str], str, str]] = None > > > - def start_if(self, ifcond): > > > + def start_if(self, ifcond: List[str]) -> None: > > > assert self._start_if is None > > > self._start_if = (ifcond, self._body, self._preamble) > > > - def end_if(self): > > > + def end_if(self) -> None: > > > assert self._start_if > > > self._wrap_ifcond() > > > self._start_if = None > > > - def _wrap_ifcond(self): > > > + def _wrap_ifcond(self) -> None: > > > self._body = _wrap_ifcond(self._start_if[0], > > > self._start_if[1], self._body) > > > self._preamble = _wrap_ifcond(self._start_if[0], > > > self._start_if[2], self._preamble) > > > - def get_content(self): > > > + def get_content(self) -> str: > > > assert self._start_if is None > > > return super().get_content() > > > class QAPIGenC(QAPIGenCCode): > > > - > > > - def __init__(self, fname, blurb, pydoc): > > > + def __init__(self, fname: str, blurb: str, pydoc: str): > > > super().__init__(fname) > > > self._blurb = blurb > > > self._copyright = '\n * '.join(re.findall(r'^Copyright .*', > > > pydoc, > > > re.MULTILINE)) > > > - def _top(self): > > > + def _top(self) -> str: > > > return mcgen(''' > > > /* AUTOMATICALLY GENERATED, DO NOT MODIFY */ > > > @@ -170,7 +168,7 @@ def _top(self): > > > ''', > > > blurb=self._blurb, copyright=self._copyright) > > > - def _bottom(self): > > > + def _bottom(self) -> str: > > > return mcgen(''' > > > /* Dummy declaration to prevent empty .o file */ > > > @@ -180,16 +178,16 @@ def _bottom(self): > > > class QAPIGenH(QAPIGenC): > > > - > > > - def _top(self): > > > + def _top(self) -> str: > > > return super()._top() + guardstart(self.fname) > > > - def _bottom(self): > > > + def _bottom(self) -> str: > > > return guardend(self.fname) > > > @contextmanager > > > -def ifcontext(ifcond, *args): > > > +def ifcontext(ifcond: List[str], > > > + *args: QAPIGenCCode) -> Generator[None, None, None]: > > > > IIUC, this could simply be "Iterator[None]" instead of > > "Generator[None, None, None]". > > > > Anyway, > > > > Reviewed-by: Cleber Rosa <cr...@redhat.com> > > > > Oh, you're right! Let's do that instead. > > Reference: > https://mypy.readthedocs.io/en/stable/kinds_of_types.html#generators > > Eduardo, I am making this change and keeping your R-B.
Agreed. -- Eduardo