qapi: introduce QAPISchemaIfCond.cgen()

Instead of building prepocessor conditions from a list of string, use
the result generated from QAPISchemaIfCond.cgen() and hide the
implementation details.

Note: this patch introduces a minor regression, generating a redundant
pair of parenthesis. This is mostly fixed in a later patch in this
series ("qapi: replace if condition list with dict [..]")

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210804083105.97531-5-marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Marc-André Lureau 2021-08-04 12:30:59 +04:00 committed by Markus Armbruster
parent 33aa3267ba
commit 6cc2e4817f
6 changed files with 46 additions and 34 deletions

View file

@ -12,7 +12,12 @@
# See the COPYING file in the top-level directory.
import re
from typing import Match, Optional, Sequence
from typing import (
List,
Match,
Optional,
Union,
)
#: Magic string that gets removed along with all space to its right.
@ -194,22 +199,26 @@ def guardend(name: str) -> str:
name=c_fname(name).upper())
def gen_if(ifcond: Sequence[str]) -> str:
ret = ''
for ifc in ifcond:
ret += mcgen('''
def cgen_ifcond(ifcond: Union[str, List[str]]) -> str:
if not ifcond:
return ''
return '(' + ') && ('.join(ifcond) + ')'
def gen_if(cond: str) -> str:
if not cond:
return ''
return mcgen('''
#if %(cond)s
''', cond=ifc)
return ret
''', cond=cond)
def gen_endif(ifcond: Sequence[str]) -> str:
ret = ''
for ifc in reversed(ifcond):
ret += mcgen('''
def gen_endif(cond: str) -> str:
if not cond:
return ''
return mcgen('''
#endif /* %(cond)s */
''', cond=ifc)
return ret
''', cond=cond)
def must_match(pattern: str, string: str) -> Match[str]: