Marc-André Lureau <marcandre.lur...@redhat.com> writes: > Modify the test visitor to check correct passing of values. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > scripts/qapi.py | 34 > ++++++++++++++++++++-------------- > scripts/qapi-commands.py | 2 +- > scripts/qapi-event.py | 2 +- > scripts/qapi-introspect.py | 12 ++++++------ > scripts/qapi-types.py | 8 ++++---- > scripts/qapi-visit.py | 8 ++++---- > scripts/qapi2texi.py | 10 +++++----- > tests/qapi-schema/qapi-schema-test.out | 9 +++++++++ > tests/qapi-schema/test-qapi.py | 21 ++++++++++++++++----- > 9 files changed, 66 insertions(+), 40 deletions(-) > > diff --git a/scripts/qapi.py b/scripts/qapi.py > index dc40d74abb..86845a28f9 100644 > --- a/scripts/qapi.py > +++ b/scripts/qapi.py > @@ -1031,26 +1031,26 @@ class QAPISchemaVisitor(object): > def visit_builtin_type(self, name, info, json_type): > pass > > - def visit_enum_type(self, name, info, values, prefix): > + def visit_enum_type(self, name, info, values, prefix, ifcond): > pass > > - def visit_array_type(self, name, info, element_type): > + def visit_array_type(self, name, info, element_type, ifcond): > pass > > - def visit_object_type(self, name, info, base, members, variants): > + def visit_object_type(self, name, info, base, members, variants, ifcond): > pass > > - def visit_object_type_flat(self, name, info, members, variants): > + def visit_object_type_flat(self, name, info, members, variants, ifcond): > pass > > - def visit_alternate_type(self, name, info, variants): > + def visit_alternate_type(self, name, info, variants, ifcond): > pass > > def visit_command(self, name, info, arg_type, ret_type, > - gen, success_response, boxed): > + gen, success_response, boxed, ifcond): > pass > > - def visit_event(self, name, info, arg_type, boxed): > + def visit_event(self, name, info, arg_type, boxed, ifcond): > pass > >
Let's add the new common parameter ifcond among the existing common parameters self, name, info. Preferably in the same position as in entity constructors. > @@ -1150,7 +1150,7 @@ class QAPISchemaEnumType(QAPISchemaType): > > def visit(self, visitor): > visitor.visit_enum_type(self.name, self.info, > - self.member_names(), self.prefix) > + self.member_names(), self.prefix, > self.ifcond) > > > class QAPISchemaArrayType(QAPISchemaType): > @@ -1181,7 +1181,8 @@ class QAPISchemaArrayType(QAPISchemaType): > return 'array of ' + elt_doc_type > > def visit(self, visitor): > - visitor.visit_array_type(self.name, self.info, self.element_type) > + visitor.visit_array_type(self.name, self.info, self.element_type, > + self.ifcond) > > > class QAPISchemaObjectType(QAPISchemaType): > @@ -1263,9 +1264,11 @@ class QAPISchemaObjectType(QAPISchemaType): > > def visit(self, visitor): > visitor.visit_object_type(self.name, self.info, > - self.base, self.local_members, > self.variants) > + self.base, self.local_members, > self.variants, > + self.ifcond) > visitor.visit_object_type_flat(self.name, self.info, > - self.members, self.variants) > + self.members, self.variants, > + self.ifcond) > > > class QAPISchemaMember(object): > @@ -1408,7 +1411,8 @@ class QAPISchemaAlternateType(QAPISchemaType): > return 'value' > > def visit(self, visitor): > - visitor.visit_alternate_type(self.name, self.info, self.variants) > + visitor.visit_alternate_type(self.name, self.info, > + self.variants, self.ifcond) > > def is_empty(self): > return False > @@ -1450,7 +1454,8 @@ class QAPISchemaCommand(QAPISchemaEntity): > def visit(self, visitor): > visitor.visit_command(self.name, self.info, > self.arg_type, self.ret_type, > - self.gen, self.success_response, self.boxed) > + self.gen, self.success_response, self.boxed, > + self.ifcond) > > > class QAPISchemaEvent(QAPISchemaEntity): > @@ -1478,7 +1483,8 @@ class QAPISchemaEvent(QAPISchemaEntity): > raise QAPISemError(self.info, "Use of 'boxed' requires 'data'") > > def visit(self, visitor): > - visitor.visit_event(self.name, self.info, self.arg_type, self.boxed) > + visitor.visit_event(self.name, self.info, self.arg_type, self.boxed, > + self.ifcond) > > > class QAPISchema(object): > diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py > index 974d0a4a80..5eb96b2d95 100644 > --- a/scripts/qapi-commands.py > +++ b/scripts/qapi-commands.py > @@ -241,7 +241,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor): > self._visited_ret_types = None > > def visit_command(self, name, info, arg_type, ret_type, > - gen, success_response, boxed): > + gen, success_response, boxed, ifcond): > if not gen: > return > self.decl += gen_command_decl(name, arg_type, boxed, ret_type) > diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py > index bcbef1035f..fec27fe2e1 100644 > --- a/scripts/qapi-event.py > +++ b/scripts/qapi-event.py > @@ -163,7 +163,7 @@ class QAPISchemaGenEventVisitor(QAPISchemaVisitor): > self.defn += gen_enum_lookup(event_enum_name, self._event_names) > self._event_names = None > > - def visit_event(self, name, info, arg_type, boxed): > + def visit_event(self, name, info, arg_type, boxed, ifcond): > self.decl += gen_event_send_decl(name, arg_type, boxed) > self.defn += gen_event_send(name, arg_type, boxed) > self._event_names.append(name) > diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py > index 1b96926fa7..4c437d60ec 100644 > --- a/scripts/qapi-introspect.py > +++ b/scripts/qapi-introspect.py > @@ -142,34 +142,34 @@ const QLitObject %(c_name)s = %(c_string)s; > def visit_builtin_type(self, name, info, json_type): > self._gen_qlit(name, 'builtin', {'json-type': json_type}) > > - def visit_enum_type(self, name, info, values, prefix): > + def visit_enum_type(self, name, info, values, prefix, ifcond): > self._gen_qlit(name, 'enum', {'values': values}) > > - def visit_array_type(self, name, info, element_type): > + def visit_array_type(self, name, info, element_type, ifcond): > element = self._use_type(element_type) > self._gen_qlit('[' + element + ']', 'array', {'element-type': > element}) > > - def visit_object_type_flat(self, name, info, members, variants): > + def visit_object_type_flat(self, name, info, members, variants, ifcond): > obj = {'members': [self._gen_member(m) for m in members]} > if variants: > obj.update(self._gen_variants(variants.tag_member.name, > variants.variants)) > self._gen_qlit(name, 'object', obj) > > - def visit_alternate_type(self, name, info, variants): > + def visit_alternate_type(self, name, info, variants, ifcond): > self._gen_qlit(name, 'alternate', > {'members': [{'type': self._use_type(m.type)} > for m in variants.variants]}) > > def visit_command(self, name, info, arg_type, ret_type, > - gen, success_response, boxed): > + gen, success_response, boxed, ifcond): > arg_type = arg_type or self._schema.the_empty_object_type > ret_type = ret_type or self._schema.the_empty_object_type > self._gen_qlit(name, 'command', > {'arg-type': self._use_type(arg_type), > 'ret-type': self._use_type(ret_type)}) > > - def visit_event(self, name, info, arg_type, boxed): > + def visit_event(self, name, info, arg_type, boxed, ifcond): > arg_type = arg_type or self._schema.the_empty_object_type > self._gen_qlit(name, 'event', {'arg-type': self._use_type(arg_type)}) > > diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py > index dc05268917..6f06720adc 100644 > --- a/scripts/qapi-types.py > +++ b/scripts/qapi-types.py > @@ -201,7 +201,7 @@ typedef struct QEnumLookup { > self.decl += gen_type_cleanup_decl(name) > self.defn += gen_type_cleanup(name) > > - def visit_enum_type(self, name, info, values, prefix): > + def visit_enum_type(self, name, info, values, prefix, ifcond): > # Special case for our lone builtin enum type > # TODO use something cleaner than existence of info > if not info: > @@ -212,7 +212,7 @@ typedef struct QEnumLookup { > self._fwdecl += gen_enum(name, values, prefix) > self.defn += gen_enum_lookup(name, values, prefix) > > - def visit_array_type(self, name, info, element_type): > + def visit_array_type(self, name, info, element_type, ifcond): > if isinstance(element_type, QAPISchemaBuiltinType): > self._btin += gen_fwd_object_or_array(name) > self._btin += gen_array(name, element_type) > @@ -224,7 +224,7 @@ typedef struct QEnumLookup { > self.decl += gen_array(name, element_type) > self._gen_type_cleanup(name) > > - def visit_object_type(self, name, info, base, members, variants): > + def visit_object_type(self, name, info, base, members, variants, ifcond): > # Nothing to do for the special empty builtin > if name == 'q_empty': > return > @@ -238,7 +238,7 @@ typedef struct QEnumLookup { > # implicit types won't be directly allocated/freed > self._gen_type_cleanup(name) > > - def visit_alternate_type(self, name, info, variants): > + def visit_alternate_type(self, name, info, variants, ifcond): > self._fwdecl += gen_fwd_object_or_array(name) > self.decl += gen_object(name, None, [variants.tag_member], variants) > self._gen_type_cleanup(name) > diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py > index 7e1cfc13f0..c29c2d869e 100644 > --- a/scripts/qapi-visit.py > +++ b/scripts/qapi-visit.py > @@ -282,7 +282,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): > self.decl = self._btin + self.decl > self._btin = None > > - def visit_enum_type(self, name, info, values, prefix): > + def visit_enum_type(self, name, info, values, prefix, ifcond): > # Special case for our lone builtin enum type > # TODO use something cleaner than existence of info > if not info: > @@ -293,7 +293,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): > self.decl += gen_visit_decl(name, scalar=True) > self.defn += gen_visit_enum(name) > > - def visit_array_type(self, name, info, element_type): > + def visit_array_type(self, name, info, element_type, ifcond): > decl = gen_visit_decl(name) > defn = gen_visit_list(name, element_type) > if isinstance(element_type, QAPISchemaBuiltinType): > @@ -304,7 +304,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): > self.decl += decl > self.defn += defn > > - def visit_object_type(self, name, info, base, members, variants): > + def visit_object_type(self, name, info, base, members, variants, ifcond): > # Nothing to do for the special empty builtin > if name == 'q_empty': > return > @@ -317,7 +317,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor): > self.decl += gen_visit_decl(name) > self.defn += gen_visit_object(name, base, members, variants) > > - def visit_alternate_type(self, name, info, variants): > + def visit_alternate_type(self, name, info, variants, ifcond): > self.decl += gen_visit_decl(name) > self.defn += gen_visit_alternate(name, variants) > > diff --git a/scripts/qapi2texi.py b/scripts/qapi2texi.py > index 8b542f9fff..ae7920aa87 100755 > --- a/scripts/qapi2texi.py > +++ b/scripts/qapi2texi.py > @@ -207,7 +207,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor): > def visit_begin(self, schema): > self.out = '' > > - def visit_enum_type(self, name, info, values, prefix): > + def visit_enum_type(self, name, info, values, prefix, ifcond): > doc = self.cur_doc > if self.out: > self.out += '\n' > @@ -216,7 +216,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor): > body=texi_entity(doc, 'Values', > member_func=texi_enum_value)) > > - def visit_object_type(self, name, info, base, members, variants): > + def visit_object_type(self, name, info, base, members, variants, ifcond): > doc = self.cur_doc > if base and base.is_implicit(): > base = None > @@ -226,7 +226,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor): > name=doc.symbol, > body=texi_entity(doc, 'Members', base, > variants)) > > - def visit_alternate_type(self, name, info, variants): > + def visit_alternate_type(self, name, info, variants, ifcond): > doc = self.cur_doc > if self.out: > self.out += '\n' > @@ -235,7 +235,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor): > body=texi_entity(doc, 'Members')) > > def visit_command(self, name, info, arg_type, ret_type, > - gen, success_response, boxed): > + gen, success_response, boxed, ifcond): > doc = self.cur_doc > if self.out: > self.out += '\n' > @@ -249,7 +249,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor): > name=doc.symbol, > body=body) > > - def visit_event(self, name, info, arg_type, boxed): > + def visit_event(self, name, info, arg_type, boxed, ifcond): > doc = self.cur_doc > if self.out: > self.out += '\n' > diff --git a/tests/qapi-schema/qapi-schema-test.out > b/tests/qapi-schema/qapi-schema-test.out > index 7fbaea19bc..fc5fd25f1b 100644 > --- a/tests/qapi-schema/qapi-schema-test.out > +++ b/tests/qapi-schema/qapi-schema-test.out > @@ -56,18 +56,25 @@ alternate TestIfAlternate > tag type > case foo: int > case bar: TestStruct > + if defined(TEST_IF_ALT) && 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) > enum TestIfEnum ['foo', 'bar'] > + if defined(TEST_IF_ENUM) > event TestIfEvent q_obj_TestIfEvent-arg > boxed=False > + if defined(TEST_IF_EVT) && defined(TEST_IF_STRUCT) > object TestIfStruct > member foo: int optional=False > + if 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) > enum TestIfUnionKind ['foo'] > + if defined(TEST_IF_UNION) && defined(TEST_IF_STRUCT) > object TestStruct > member integer: int optional=False > member boolean: bool optional=False > @@ -190,8 +197,10 @@ object q_obj_EVENT_D-arg > member enum3: EnumOne optional=True > object q_obj_TestIfCmd-arg > member foo: TestIfStruct optional=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) > object q_obj_TestStruct-wrapper > member data: TestStruct optional=False > object q_obj_UserDefFlatUnion2-base Ah, now the ifcond become visible! Announcing that in PATCH 15 would've avoided me asking for it :) > diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py > index c7724d3437..17fd975812 100644 > --- a/tests/qapi-schema/test-qapi.py > +++ b/tests/qapi-schema/test-qapi.py > @@ -17,12 +17,13 @@ import sys > > > class QAPISchemaTestVisitor(QAPISchemaVisitor): > - def visit_enum_type(self, name, info, values, prefix): > + def visit_enum_type(self, name, info, values, prefix, ifcond): > print 'enum %s %s' % (name, values) > if prefix: > print ' prefix %s' % prefix > + self._print_if(ifcond) > > - def visit_object_type(self, name, info, base, members, variants): > + def visit_object_type(self, name, info, base, members, variants, ifcond): > print 'object %s' % name > if base: > print ' base %s' % base.name > @@ -30,21 +31,25 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor): > print ' member %s: %s optional=%s' % \ > (m.name, m.type.name, m.optional) > self._print_variants(variants) > + self._print_if(ifcond) > > - def visit_alternate_type(self, name, info, variants): > + def visit_alternate_type(self, name, info, variants, ifcond): > print 'alternate %s' % name > self._print_variants(variants) > + self._print_if(ifcond) > > def visit_command(self, name, info, arg_type, ret_type, > - gen, success_response, boxed): > + gen, success_response, boxed, ifcond): > print 'command %s %s -> %s' % \ > (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(ifcond) > > - def visit_event(self, name, info, arg_type, boxed): > + def visit_event(self, name, info, arg_type, boxed, ifcond): > print 'event %s %s' % (name, arg_type and arg_type.name) > print ' boxed=%s' % boxed > + self._print_if(ifcond) > > @staticmethod > def _print_variants(variants): > @@ -53,6 +58,12 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor): > for v in variants.variants: > print ' case %s: %s' % (v.name, v.type.name) > > + @staticmethod > + def _print_if(ifcond): > + if ifcond: > + print ' if %s' % ifcond > + > + > schema = QAPISchema(sys.argv[1]) > schema.visit(QAPISchemaTestVisitor())