qapi: replace if condition list with dict {'all': [...]}

Replace the simple list sugar form with a recursive structure that will
accept other operators in the following commits (all, any or not).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210804083105.97531-7-marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[Accidental code motion undone.  Degenerate :forms: comment dropped.
Helper _check_if() moved.  Error messages tweaked.  ui.json updated.
Accidental changes to qapi-schema-test.json dropped.]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Marc-André Lureau 2021-08-04 12:31:01 +04:00 committed by Markus Armbruster
parent d806f89f87
commit 5d83b9a130
27 changed files with 143 additions and 88 deletions

View file

@ -13,7 +13,8 @@
import re
from typing import (
List,
Any,
Dict,
Match,
Optional,
Union,
@ -199,17 +200,29 @@ def guardend(name: str) -> str:
name=c_fname(name).upper())
def cgen_ifcond(ifcond: Union[str, List[str]]) -> str:
def cgen_ifcond(ifcond: Union[str, Dict[str, Any]]) -> str:
if not ifcond:
return ''
return '(' + ') && ('.join(ifcond) + ')'
if isinstance(ifcond, str):
return ifcond
oper, operands = next(iter(ifcond.items()))
oper = {'all': '&&'}[oper]
operands = [cgen_ifcond(o) for o in operands]
return '(' + (') ' + oper + ' (').join(operands) + ')'
def docgen_ifcond(ifcond: Union[str, List[str]]) -> str:
def docgen_ifcond(ifcond: Union[str, Dict[str, Any]]) -> str:
# TODO Doc generated for conditions needs polish
if not ifcond:
return ''
return ' and '.join(ifcond)
if isinstance(ifcond, str):
return ifcond
oper, operands = next(iter(ifcond.items()))
oper = {'all': ' and '}[oper]
operands = [docgen_ifcond(o) for o in operands]
return '(' + oper.join(operands) + ')'
def gen_if(cond: str) -> str: