diff options
author | John Snow <jsnow@redhat.com> | 2021-04-21 14:20:19 -0400 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2021-04-30 12:59:54 +0200 |
commit | 59b5556ce8c1d3dc1f2c6445ca32f2e515114a8e (patch) | |
tree | 7d19ea10ee27c5c02eb52747673d1126ed97ed51 | |
parent | 0f231dcf2921fa8bc475d222a8ef81e67d4019e8 (diff) | |
download | qemu-59b5556ce8c1d3dc1f2c6445ca32f2e515114a8e.zip qemu-59b5556ce8c1d3dc1f2c6445ca32f2e515114a8e.tar.gz qemu-59b5556ce8c1d3dc1f2c6445ca32f2e515114a8e.tar.bz2 |
qapi/expr.py: constrain incoming expression types
mypy does not know the types of values stored in Dicts that masquerade
as objects. Help the type checker out by constraining the type.
Signed-off-by: John Snow <jsnow@redhat.com>
Message-Id: <20210421182032.3521476-5-jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
-rw-r--r-- | scripts/qapi/expr.py | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py index b4bbcd5..06a0081 100644 --- a/scripts/qapi/expr.py +++ b/scripts/qapi/expr.py @@ -15,9 +15,20 @@ # See the COPYING file in the top-level directory. import re +from typing import Dict, Optional from .common import c_name from .error import QAPISemError +from .parser import QAPIDoc +from .source import QAPISourceInfo + + +# Deserialized JSON objects as returned by the parser. +# The values of this mapping are not necessary to exhaustively type +# here (and also not practical as long as mypy lacks recursive +# types), because the purpose of this module is to interrogate that +# type. +_JSONObject = Dict[str, object] # Names consist of letters, digits, -, and _, starting with a letter. @@ -315,9 +326,20 @@ def check_event(expr, info): def check_exprs(exprs): for expr_elem in exprs: - expr = expr_elem['expr'] - info = expr_elem['info'] - doc = expr_elem.get('doc') + # Expression + assert isinstance(expr_elem['expr'], dict) + for key in expr_elem['expr'].keys(): + assert isinstance(key, str) + expr: _JSONObject = expr_elem['expr'] + + # QAPISourceInfo + assert isinstance(expr_elem['info'], QAPISourceInfo) + info: QAPISourceInfo = expr_elem['info'] + + # Optional[QAPIDoc] + tmp = expr_elem.get('doc') + assert tmp is None or isinstance(tmp, QAPIDoc) + doc: Optional[QAPIDoc] = tmp if 'include' in expr: continue |