Hi On Thu, Dec 6, 2018 at 8:41 PM Markus Armbruster <arm...@redhat.com> wrote: > > 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.
ok > > Why rename member 'bar' to 'alt_bar'? no reason I remember, dropped > > > '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? No reason I remember, let's split it > > > + '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