@@ -1066,6 +1066,9 @@ class QAPISchemaVisitor(object):
def visit_include(self, fname, info):
pass
+ def visit_ifcond(self, ifcond, begin):
+ pass
+
def visit_builtin_type(self, name, info, json_type):
pass
@@ -1792,12 +1795,24 @@ class QAPISchema(object):
def visit(self, visitor):
visitor.visit_begin(self)
module = None
+ ifcond = None
for entity in self._entity_list:
if visitor.visit_needed(entity):
if entity.module != module:
+ if ifcond:
+ visitor.visit_ifcond(ifcond, False)
+ ifcond = None
module = entity.module
visitor.visit_module(module)
+ if entity.ifcond != ifcond:
+ if ifcond:
+ visitor.visit_ifcond(ifcond, False)
+ ifcond = entity.ifcond
+ if ifcond:
+ visitor.visit_ifcond(ifcond, True)
entity.visit(visitor)
+ if ifcond:
+ visitor.visit_ifcond(ifcond, False)
visitor.visit_end()
@@ -232,23 +232,32 @@ command __org.qemu_x-command q_obj___org.qemu_x-command-arg -> __org.qemu_x-Unio
gen=True success_response=True boxed=False
object TestIfStruct
member foo: int optional=False
+ if ['defined(TEST_IF_STRUCT)']
enum TestIfEnum ['foo', 'bar']
+ if ['defined(TEST_IF_ENUM)']
object q_obj_TestStruct-wrapper
member data: TestStruct optional=False
enum TestIfUnionKind ['foo']
+ if ['defined(TEST_IF_UNION) && defined(TEST_IF_STRUCT)']
object TestIfUnion
member type: TestIfUnionKind optional=False
tag type
case foo: q_obj_TestStruct-wrapper
+ if ['defined(TEST_IF_UNION) && defined(TEST_IF_STRUCT)']
alternate TestIfAlternate
tag type
case foo: int
case bar: TestStruct
+ if ['defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)']
object q_obj_TestIfCmd-arg
member foo: TestIfStruct optional=False
+ if ['defined(TEST_IF_CMD)', 'defined(TEST_IF_STRUCT)']
command TestIfCmd q_obj_TestIfCmd-arg -> None
gen=True success_response=True boxed=False
+ if ['defined(TEST_IF_CMD)', 'defined(TEST_IF_STRUCT)']
object q_obj_TestIfEvent-arg
member foo: TestIfStruct optional=False
+ if ['defined(TEST_IF_EVT) && defined(TEST_IF_STRUCT)']
event TestIfEvent q_obj_TestIfEvent-arg
boxed=False
+ if ['defined(TEST_IF_EVT) && defined(TEST_IF_STRUCT)']
@@ -17,16 +17,26 @@ from qapi.common import QAPIError, QAPISchema, QAPISchemaVisitor
class QAPISchemaTestVisitor(QAPISchemaVisitor):
+ def __init__(self):
+ self._ifcond = None
+
def visit_module(self, name):
print('module %s' % name)
def visit_include(self, name, info):
print('include %s' % name)
+ def visit_ifcond(self, ifcond, begin):
+ if begin:
+ self._ifcond = ifcond
+ else:
+ self._ifcond = None
+
def visit_enum_type(self, name, info, values, prefix):
print('enum %s %s' % (name, values))
if prefix:
print(' prefix %s' % prefix)
+ self._print_if(self._ifcond)
def visit_object_type(self, name, info, base, members, variants):
print('object %s' % name)
@@ -36,10 +46,12 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
print(' member %s: %s optional=%s' % \
(m.name, m.type.name, m.optional))
self._print_variants(variants)
+ self._print_if(self._ifcond)
def visit_alternate_type(self, name, info, variants):
print('alternate %s' % name)
self._print_variants(variants)
+ self._print_if(self._ifcond)
def visit_command(self, name, info, arg_type, ret_type,
gen, success_response, boxed):
@@ -47,10 +59,12 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
(name, arg_type and arg_type.name, ret_type and ret_type.name))
print(' gen=%s success_response=%s boxed=%s' % \
(gen, success_response, boxed))
+ self._print_if(self._ifcond)
def visit_event(self, name, info, arg_type, boxed):
print('event %s %s' % (name, arg_type and arg_type.name))
print(' boxed=%s' % boxed)
+ self._print_if(self._ifcond)
@staticmethod
def _print_variants(variants):
@@ -59,6 +73,11 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
for v in variants.variants:
print(' case %s: %s' % (v.name, v.type.name))
+ @staticmethod
+ def _print_if(ifcond, indent=4):
+ if ifcond:
+ print('%sif %s' % (' ' * indent, ifcond))
+
try:
schema = QAPISchema(sys.argv[1])
Signed-off-by: Markus Armbruster <armbru@redhat.com> --- scripts/qapi/common.py | 15 +++++++++++++++ tests/qapi-schema/qapi-schema-test.out | 9 +++++++++ tests/qapi-schema/test-qapi.py | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+)