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 @@ -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 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()) -- 2.14.1.146.gd35faa819