qapi: Don't use info as witness of implicit object type
A future patch will enable error reporting from the various QAPISchema*.check() methods. But to report an error related to an implicit type, we'll need to associate a location with the type (the same location as the top-level entity that is causing the creation of the implicit type), and once we do that, keying off of whether foo.info exists is no longer a viable way to determine if foo is an implicit type. Instead, add an is_implicit() method to QAPISchemaEntity, and use it. It can be overridden later for ObjectType and EnumType, when implicit instances of those classes gain info. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1444710158-8723-8-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
849ab13c16
commit
49823c4b43
@ -235,7 +235,8 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
|||||||
|
|
||||||
def visit_needed(self, entity):
|
def visit_needed(self, entity):
|
||||||
# Visit everything except implicit objects
|
# Visit everything except implicit objects
|
||||||
return not isinstance(entity, QAPISchemaObjectType) or entity.info
|
return not (entity.is_implicit() and
|
||||||
|
isinstance(entity, QAPISchemaObjectType))
|
||||||
|
|
||||||
def _gen_type_cleanup(self, name):
|
def _gen_type_cleanup(self, name):
|
||||||
self.decl += gen_type_cleanup_decl(name)
|
self.decl += gen_type_cleanup_decl(name)
|
||||||
|
@ -337,7 +337,8 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
|
|||||||
|
|
||||||
def visit_needed(self, entity):
|
def visit_needed(self, entity):
|
||||||
# Visit everything except implicit objects
|
# Visit everything except implicit objects
|
||||||
return not isinstance(entity, QAPISchemaObjectType) or entity.info
|
return not (entity.is_implicit() and
|
||||||
|
isinstance(entity, QAPISchemaObjectType))
|
||||||
|
|
||||||
def visit_enum_type(self, name, info, values, prefix):
|
def visit_enum_type(self, name, info, values, prefix):
|
||||||
self.decl += gen_visit_decl(name, scalar=True)
|
self.decl += gen_visit_decl(name, scalar=True)
|
||||||
|
@ -798,6 +798,9 @@ class QAPISchemaEntity(object):
|
|||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def is_implicit(self):
|
||||||
|
return not self.info
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -971,11 +974,11 @@ class QAPISchemaObjectType(QAPISchemaType):
|
|||||||
self.members = members
|
self.members = members
|
||||||
|
|
||||||
def c_name(self):
|
def c_name(self):
|
||||||
assert self.info
|
assert not self.is_implicit()
|
||||||
return QAPISchemaType.c_name(self)
|
return QAPISchemaType.c_name(self)
|
||||||
|
|
||||||
def c_type(self, is_param=False):
|
def c_type(self, is_param=False):
|
||||||
assert self.info
|
assert not self.is_implicit()
|
||||||
return QAPISchemaType.c_type(self)
|
return QAPISchemaType.c_type(self)
|
||||||
|
|
||||||
def json_type(self):
|
def json_type(self):
|
||||||
@ -1043,7 +1046,8 @@ class QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
|
|||||||
# This function exists to support ugly simple union special cases
|
# This function exists to support ugly simple union special cases
|
||||||
# TODO get rid of them, and drop the function
|
# TODO get rid of them, and drop the function
|
||||||
def simple_union_type(self):
|
def simple_union_type(self):
|
||||||
if isinstance(self.type, QAPISchemaObjectType) and not self.type.info:
|
if (self.type.is_implicit() and
|
||||||
|
isinstance(self.type, QAPISchemaObjectType)):
|
||||||
assert len(self.type.members) == 1
|
assert len(self.type.members) == 1
|
||||||
assert not self.type.variants
|
assert not self.type.variants
|
||||||
return self.type.members[0].type
|
return self.type.members[0].type
|
||||||
@ -1162,11 +1166,13 @@ class QAPISchema(object):
|
|||||||
self._def_entity(self.the_empty_object_type)
|
self._def_entity(self.the_empty_object_type)
|
||||||
|
|
||||||
def _make_implicit_enum_type(self, name, values):
|
def _make_implicit_enum_type(self, name, values):
|
||||||
name = name + 'Kind'
|
name = name + 'Kind' # Use namespace reserved by add_name()
|
||||||
self._def_entity(QAPISchemaEnumType(name, None, values, None))
|
self._def_entity(QAPISchemaEnumType(name, None, values, None))
|
||||||
return name
|
return name
|
||||||
|
|
||||||
def _make_array_type(self, element_type):
|
def _make_array_type(self, element_type):
|
||||||
|
# TODO fooList namespace is not reserved; user can create collisions,
|
||||||
|
# or abuse our type system with ['fooList'] for 2D array
|
||||||
name = element_type + 'List'
|
name = element_type + 'List'
|
||||||
if not self.lookup_type(name):
|
if not self.lookup_type(name):
|
||||||
self._def_entity(QAPISchemaArrayType(name, None, element_type))
|
self._def_entity(QAPISchemaArrayType(name, None, element_type))
|
||||||
|
Loading…
Reference in New Issue
Block a user