[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/3] qapi/expr: Split check_expr out from check_exprs
From: |
John Snow |
Subject: |
[PATCH 1/3] qapi/expr: Split check_expr out from check_exprs |
Date: |
Thu, 20 May 2021 11:17:57 -0400 |
Primarily, this reduces a nesting level of a particularly long
block. Mostly code movement, a new docstring is created.
(It also has the effect of creating a fairly convenient choke point in
check_exprs for try/catch wrappers without making the nesting level even
worse.)
Signed-off-by: John Snow <jsnow@redhat.com>
---
scripts/qapi/expr.py | 189 +++++++++++++++++++++++--------------------
1 file changed, 100 insertions(+), 89 deletions(-)
diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py
index 496f7e0333e..9dff0cd9080 100644
--- a/scripts/qapi/expr.py
+++ b/scripts/qapi/expr.py
@@ -586,6 +586,104 @@ def check_event(expr: _JSONObject, info: QAPISourceInfo)
-> None:
check_type(args, info, "'data'", allow_dict=not boxed)
+def check_expr(expr_elem: _JSONObject) -> None:
+ """
+ Validate and normalize a parsed QAPI schema expression.
+
+ :param expr_elem: The parsed expression to normalize and validate.
+
+ :raise QAPISemError: When this expression fails validation.
+ :return: None, ``expr`` is normalized in-place as needed.
+ """
+ # 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:
+ return
+
+ if 'enum' in expr:
+ meta = 'enum'
+ elif 'union' in expr:
+ meta = 'union'
+ elif 'alternate' in expr:
+ meta = 'alternate'
+ elif 'struct' in expr:
+ meta = 'struct'
+ elif 'command' in expr:
+ meta = 'command'
+ elif 'event' in expr:
+ meta = 'event'
+ else:
+ raise QAPISemError(info, "expression is missing metatype")
+
+ check_name_is_str(expr[meta], info, "'%s'" % meta)
+ name = cast(str, expr[meta])
+ info.set_defn(meta, name)
+ check_defn_name_str(name, info, meta)
+
+ if doc:
+ if doc.symbol != name:
+ raise QAPISemError(
+ info, "documentation comment is for '%s'" % doc.symbol)
+ doc.check_expr(expr)
+ elif info.pragma.doc_required:
+ raise QAPISemError(info,
+ "documentation comment required")
+
+ if meta == 'enum':
+ check_keys(expr, info, meta,
+ ['enum', 'data'], ['if', 'features', 'prefix'])
+ check_enum(expr, info)
+ elif meta == 'union':
+ check_keys(expr, info, meta,
+ ['union', 'data'],
+ ['base', 'discriminator', 'if', 'features'])
+ normalize_members(expr.get('base'))
+ normalize_members(expr['data'])
+ check_union(expr, info)
+ elif meta == 'alternate':
+ check_keys(expr, info, meta,
+ ['alternate', 'data'], ['if', 'features'])
+ normalize_members(expr['data'])
+ check_alternate(expr, info)
+ elif meta == 'struct':
+ check_keys(expr, info, meta,
+ ['struct', 'data'], ['base', 'if', 'features'])
+ normalize_members(expr['data'])
+ check_struct(expr, info)
+ elif meta == 'command':
+ check_keys(expr, info, meta,
+ ['command'],
+ ['data', 'returns', 'boxed', 'if', 'features',
+ 'gen', 'success-response', 'allow-oob',
+ 'allow-preconfig', 'coroutine'])
+ normalize_members(expr.get('data'))
+ check_command(expr, info)
+ elif meta == 'event':
+ check_keys(expr, info, meta,
+ ['event'], ['data', 'boxed', 'if', 'features'])
+ normalize_members(expr.get('data'))
+ check_event(expr, info)
+ else:
+ assert False, 'unexpected meta type'
+
+ check_if(expr, info, meta)
+ check_features(expr.get('features'), info)
+ check_flags(expr, info)
+
+
def check_exprs(exprs: List[_JSONObject]) -> List[_JSONObject]:
"""
Validate and normalize a list of parsed QAPI schema expressions.
@@ -598,93 +696,6 @@ def check_exprs(exprs: List[_JSONObject]) ->
List[_JSONObject]:
:raise QAPISemError: When any expression fails validation.
:return: The same list of expressions (now modified).
"""
- for expr_elem in exprs:
- # 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
-
- if 'enum' in expr:
- meta = 'enum'
- elif 'union' in expr:
- meta = 'union'
- elif 'alternate' in expr:
- meta = 'alternate'
- elif 'struct' in expr:
- meta = 'struct'
- elif 'command' in expr:
- meta = 'command'
- elif 'event' in expr:
- meta = 'event'
- else:
- raise QAPISemError(info, "expression is missing metatype")
-
- check_name_is_str(expr[meta], info, "'%s'" % meta)
- name = cast(str, expr[meta])
- info.set_defn(meta, name)
- check_defn_name_str(name, info, meta)
-
- if doc:
- if doc.symbol != name:
- raise QAPISemError(
- info, "documentation comment is for '%s'" % doc.symbol)
- doc.check_expr(expr)
- elif info.pragma.doc_required:
- raise QAPISemError(info,
- "documentation comment required")
-
- if meta == 'enum':
- check_keys(expr, info, meta,
- ['enum', 'data'], ['if', 'features', 'prefix'])
- check_enum(expr, info)
- elif meta == 'union':
- check_keys(expr, info, meta,
- ['union', 'data'],
- ['base', 'discriminator', 'if', 'features'])
- normalize_members(expr.get('base'))
- normalize_members(expr['data'])
- check_union(expr, info)
- elif meta == 'alternate':
- check_keys(expr, info, meta,
- ['alternate', 'data'], ['if', 'features'])
- normalize_members(expr['data'])
- check_alternate(expr, info)
- elif meta == 'struct':
- check_keys(expr, info, meta,
- ['struct', 'data'], ['base', 'if', 'features'])
- normalize_members(expr['data'])
- check_struct(expr, info)
- elif meta == 'command':
- check_keys(expr, info, meta,
- ['command'],
- ['data', 'returns', 'boxed', 'if', 'features',
- 'gen', 'success-response', 'allow-oob',
- 'allow-preconfig', 'coroutine'])
- normalize_members(expr.get('data'))
- check_command(expr, info)
- elif meta == 'event':
- check_keys(expr, info, meta,
- ['event'], ['data', 'boxed', 'if', 'features'])
- normalize_members(expr.get('data'))
- check_event(expr, info)
- else:
- assert False, 'unexpected meta type'
-
- check_if(expr, info, meta)
- check_features(expr.get('features'), info)
- check_flags(expr, info)
-
+ for expr in exprs:
+ check_expr(expr)
return exprs
--
2.30.2