@@ -808,10 +808,7 @@ class QAPISchemaVisitor(object):
def visit_array_type(self, name, info, element_type):
pass
- def visit_object_type(self, name, info, base, members, variants):
- pass
-
- def visit_object_type_flat(self, name, info, members, variants):
+ def visit_object_type(self, name, info, typ):
pass
def visit_alternate_type(self, name, info, variants):
@@ -1005,10 +1002,7 @@ class QAPISchemaObjectType(QAPISchemaType):
return 'object'
def visit(self, visitor):
- visitor.visit_object_type(self.name, self.info,
- self.base, self.local_members, self.variants)
- visitor.visit_object_type_flat(self.name, self.info,
- self.members, self.variants)
+ visitor.visit_object_type(self.name, self.info, self)
class QAPISchemaMember(object):
@@ -141,11 +141,11 @@ const char %(c_name)s[] = %(c_string)s;
element = self._use_type(element_type)
self._gen_json('[' + element + ']', 'array', {'element-type': element})
- def visit_object_type_flat(self, name, info, members, variants):
- obj = {'members': [self._gen_member(m) for m in members]}
- if variants:
- obj.update(self._gen_variants(variants.tag_member.name,
- variants.variants))
+ def visit_object_type(self, name, info, typ):
+ obj = {'members': [self._gen_member(m) for m in typ.members]}
+ if typ.variants:
+ obj.update(self._gen_variants(typ.variants.tag_member.name,
+ typ.variants.variants))
self._gen_json(name, 'object', obj)
def visit_alternate_type(self, name, info, variants):
@@ -220,17 +220,16 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
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, typ):
# Nothing to do for the special empty builtin
if name == 'q_empty':
return
self._fwdecl += gen_fwd_object_or_array(name)
- self.decl += gen_object(name, base, members, variants)
- if base and not base.is_implicit():
- self.decl += gen_upcast(name, base)
- # TODO Worth changing the visitor signature, so we could
- # directly use rather than repeat type.is_implicit()?
- if not name.startswith('q_'):
+ self.decl += gen_object(name, typ.base, typ.local_members,
+ typ.variants)
+ if typ.base and not typ.base.is_implicit():
+ self.decl += gen_upcast(name, typ.base)
+ if not typ.is_implicit():
# implicit types won't be directly allocated/freed
self._gen_type_cleanup(name)
@@ -289,18 +289,18 @@ 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, typ):
# Nothing to do for the special empty builtin
if name == 'q_empty':
return
self.decl += gen_visit_members_decl(name)
- self.defn += gen_visit_object_members(name, base, members, variants)
- # TODO Worth changing the visitor signature, so we could
- # directly use rather than repeat type.is_implicit()?
- if not name.startswith('q_'):
+ self.defn += gen_visit_object_members(name, typ.base,
+ typ.local_members, typ.variants)
+ if not typ.is_implicit():
# only explicit types need an allocating visit
self.decl += gen_visit_decl(name)
- self.defn += gen_visit_object(name, base, members, variants)
+ self.defn += gen_visit_object(name, typ.base, typ.local_members,
+ typ.variants)
def visit_alternate_type(self, name, info, variants):
self.decl += gen_visit_decl(name)
Rather than having two separate visitor callbacks with items already broken out, pass the actual QAPISchemaObjectType object to the visitor. This lets the visitor access things like type.is_implicit() without needing another parameter, resolving a TODO from previous patches. For convenience and consistency, the 'name' and 'info' parameters are still provided, even though they are now redundant with 'typ.name' and 'typ.info'. Signed-off-by: Eric Blake <eblake@redhat.com> --- v6: new patch --- scripts/qapi.py | 10 ++-------- scripts/qapi-introspect.py | 10 +++++----- scripts/qapi-types.py | 13 ++++++------- scripts/qapi-visit.py | 12 ++++++------ 4 files changed, 19 insertions(+), 26 deletions(-)