Marc-André Lureau <marcandre.lur...@redhat.com> writes: > Add 'if' key to alternate members: > > { 'alternate': 'TestIfAlternate', 'data': > { 'alt': { 'type': 'TestStruct', 'if': 'COND' } } } > > Generated code is not changed by this patch but with "qapi: add #if > conditions to generated code". > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > scripts/qapi/common.py | 10 +++++----- > tests/qapi-schema/qapi-schema-test.json | 6 +++++- > tests/qapi-schema/qapi-schema-test.out | 9 ++++++++- > 3 files changed, 18 insertions(+), 7 deletions(-) > > diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py > index e1bd9a22ba..b3b64a60bf 100644 > --- a/scripts/qapi/common.py > +++ b/scripts/qapi/common.py > @@ -843,7 +843,7 @@ def check_alternate(expr, info): > for (key, value) in members.items(): > check_name(info, "Member of alternate '%s'" % name, key) > source = "member '%s' of alternate '%s'" % (key, name) > - check_known_keys(info, source, value, ['type'], []) > + check_known_keys(info, source, value, ['type'], ['if']) > typ = value['type'] > > # Ensure alternates have no type conflicts. > @@ -1774,8 +1774,8 @@ class QAPISchema(object): > self._make_members(data, info), > None)) > > - def _make_variant(self, case, typ): > - return QAPISchemaObjectTypeVariant(case, typ) > + def _make_variant(self, case, typ, ifcond): > + return QAPISchemaObjectTypeVariant(case, typ, ifcond) > > def _make_simple_variant(self, case, typ, ifcond, info): > if isinstance(typ, list): > @@ -1798,7 +1798,7 @@ class QAPISchema(object): > name, info, doc, ifcond, > 'base', self._make_members(base, info)) > if tag_name: > - variants = [self._make_variant(key, value['type']) > + variants = [self._make_variant(key, value['type'], > value.get('if')) > for (key, value) in data.items()] > members = [] > else: > @@ -1819,7 +1819,7 @@ class QAPISchema(object): > name = expr['alternate'] > data = expr['data'] > ifcond = expr.get('if') > - variants = [self._make_variant(key, value['type']) > + variants = [self._make_variant(key, value['type'], value.get('if')) > for (key, value) in data.items()] > tag_member = QAPISchemaObjectTypeMember('type', 'QType', False) > self._def_entity( > diff --git a/tests/qapi-schema/qapi-schema-test.json > b/tests/qapi-schema/qapi-schema-test.json > index 6d3c6c0b53..df3edf9d89 100644 > --- a/tests/qapi-schema/qapi-schema-test.json > +++ b/tests/qapi-schema/qapi-schema-test.json > @@ -216,9 +216,13 @@ > { 'command': 'TestIfUnionCmd', 'data': { 'union_cmd_arg': 'TestIfUnion' }, > 'if': 'defined(TEST_IF_UNION)' } > > -{ 'alternate': 'TestIfAlternate', 'data': { 'foo': 'int', 'bar': > 'TestStruct' }, > +{ 'alternate': 'TestIfAlternate', 'data': > + { 'foo': 'int', 'alt_bar': { 'type': 'TestStruct', 'if': > 'defined(TEST_IF_ALT_BAR)'} },
Let's break the long line betwen the members. Why rename member 'bar' to 'alt_bar'? > 'if': 'defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)' } > > +{ 'command': 'TestIfAlternateCmd', 'data': { 'alt_cmd_arg': > 'TestIfAlternate' }, Another long line. And I'm feeling dense again: why does this change belong to this patch? > + 'if': 'defined(TEST_IF_ALT)' } > + > { 'command': 'TestIfCmd', 'data': > { 'foo': 'TestIfStruct', > 'bar': { 'type': 'TestIfEnum', 'if': 'defined(TEST_IF_CMD_BAR)' } }, > diff --git a/tests/qapi-schema/qapi-schema-test.out > b/tests/qapi-schema/qapi-schema-test.out > index ac1069cf1f..cdbd5b87cc 100644 > --- a/tests/qapi-schema/qapi-schema-test.out > +++ b/tests/qapi-schema/qapi-schema-test.out > @@ -297,8 +297,15 @@ command TestIfUnionCmd q_obj_TestIfUnionCmd-arg -> None > alternate TestIfAlternate > tag type > case foo: int > - case bar: TestStruct > + case alt_bar: TestStruct > + if ['defined(TEST_IF_ALT_BAR)'] > if ['defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)'] > +object q_obj_TestIfAlternateCmd-arg > + member alt_cmd_arg: TestIfAlternate optional=False > + if ['defined(TEST_IF_ALT)'] > +command TestIfAlternateCmd q_obj_TestIfAlternateCmd-arg -> None > + gen=True success_response=True boxed=False oob=False preconfig=False > + if ['defined(TEST_IF_ALT)'] > object q_obj_TestIfCmd-arg > member foo: TestIfStruct optional=False > member bar: TestIfEnum optional=False