|
@@ -668,18 +668,31 @@ class QAPISchemaFeature(QAPISchemaMember):
|
|
|
|
|
|
|
|
|
|
class QAPISchemaObjectTypeMember(QAPISchemaMember):
|
|
class QAPISchemaObjectTypeMember(QAPISchemaMember):
|
|
- def __init__(self, name, info, typ, optional, ifcond=None):
|
|
|
|
|
|
+ def __init__(self, name, info, typ, optional, ifcond=None, features=None):
|
|
super().__init__(name, info, ifcond)
|
|
super().__init__(name, info, ifcond)
|
|
assert isinstance(typ, str)
|
|
assert isinstance(typ, str)
|
|
assert isinstance(optional, bool)
|
|
assert isinstance(optional, bool)
|
|
|
|
+ for f in features or []:
|
|
|
|
+ assert isinstance(f, QAPISchemaFeature)
|
|
|
|
+ f.set_defined_in(name)
|
|
self._type_name = typ
|
|
self._type_name = typ
|
|
self.type = None
|
|
self.type = None
|
|
self.optional = optional
|
|
self.optional = optional
|
|
|
|
+ self.features = features or []
|
|
|
|
|
|
def check(self, schema):
|
|
def check(self, schema):
|
|
assert self.defined_in
|
|
assert self.defined_in
|
|
self.type = schema.resolve_type(self._type_name, self.info,
|
|
self.type = schema.resolve_type(self._type_name, self.info,
|
|
self.describe)
|
|
self.describe)
|
|
|
|
+ seen = {}
|
|
|
|
+ for f in self.features:
|
|
|
|
+ f.check_clash(self.info, seen)
|
|
|
|
+
|
|
|
|
+ def connect_doc(self, doc):
|
|
|
|
+ super().connect_doc(doc)
|
|
|
|
+ if doc:
|
|
|
|
+ for f in self.features:
|
|
|
|
+ doc.connect_feature(f)
|
|
|
|
|
|
|
|
|
|
class QAPISchemaVariant(QAPISchemaObjectTypeMember):
|
|
class QAPISchemaVariant(QAPISchemaObjectTypeMember):
|
|
@@ -962,7 +975,7 @@ def _def_enum_type(self, expr, info, doc):
|
|
name, info, doc, ifcond, features,
|
|
name, info, doc, ifcond, features,
|
|
self._make_enum_members(data, info), prefix))
|
|
self._make_enum_members(data, info), prefix))
|
|
|
|
|
|
- def _make_member(self, name, typ, ifcond, info):
|
|
|
|
|
|
+ def _make_member(self, name, typ, ifcond, features, info):
|
|
optional = False
|
|
optional = False
|
|
if name.startswith('*'):
|
|
if name.startswith('*'):
|
|
name = name[1:]
|
|
name = name[1:]
|
|
@@ -970,10 +983,12 @@ def _make_member(self, name, typ, ifcond, info):
|
|
if isinstance(typ, list):
|
|
if isinstance(typ, list):
|
|
assert len(typ) == 1
|
|
assert len(typ) == 1
|
|
typ = self._make_array_type(typ[0], info)
|
|
typ = self._make_array_type(typ[0], info)
|
|
- return QAPISchemaObjectTypeMember(name, info, typ, optional, ifcond)
|
|
|
|
|
|
+ return QAPISchemaObjectTypeMember(name, info, typ, optional, ifcond,
|
|
|
|
+ self._make_features(features, info))
|
|
|
|
|
|
def _make_members(self, data, info):
|
|
def _make_members(self, data, info):
|
|
- return [self._make_member(key, value['type'], value.get('if'), info)
|
|
|
|
|
|
+ return [self._make_member(key, value['type'], value.get('if'),
|
|
|
|
+ value.get('features'), info)
|
|
for (key, value) in data.items()]
|
|
for (key, value) in data.items()]
|
|
|
|
|
|
def _def_struct_type(self, expr, info, doc):
|
|
def _def_struct_type(self, expr, info, doc):
|
|
@@ -996,7 +1011,7 @@ def _make_simple_variant(self, case, typ, ifcond, info):
|
|
typ = self._make_array_type(typ[0], info)
|
|
typ = self._make_array_type(typ[0], info)
|
|
typ = self._make_implicit_object_type(
|
|
typ = self._make_implicit_object_type(
|
|
typ, info, self.lookup_type(typ),
|
|
typ, info, self.lookup_type(typ),
|
|
- 'wrapper', [self._make_member('data', typ, None, info)])
|
|
|
|
|
|
+ 'wrapper', [self._make_member('data', typ, None, None, info)])
|
|
return QAPISchemaVariant(case, info, typ, ifcond)
|
|
return QAPISchemaVariant(case, info, typ, ifcond)
|
|
|
|
|
|
def _def_union_type(self, expr, info, doc):
|
|
def _def_union_type(self, expr, info, doc):
|