mirror of
https://github.com/qemu/qemu.git
synced 2025-08-08 08:05:17 +00:00
qapi: Lift features into QAPISchemaEntity
Commit 6a8c0b5102
"qapi: Add feature flags to struct types" added
features to QAPISchemaObjectType. Commit a95daa5093 "qapi: Add
feature flags to commands in qapi" added them to QAPISchemaCommand,
duplicating the code. Tolerable, but the duplication will only get
worse as we add features to more definitions.
To de-duplicate, lift features from QAPISchemaObjectType and
QAPISchemaCommand into QAPISchemaEntity.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20191024110237.30963-18-armbru@redhat.com>
This commit is contained in:
parent
ad1ecfc679
commit
b3cdff10e5
@ -27,8 +27,11 @@
|
|||||||
class QAPISchemaEntity(object):
|
class QAPISchemaEntity(object):
|
||||||
meta = None
|
meta = None
|
||||||
|
|
||||||
def __init__(self, name, info, doc, ifcond=None):
|
def __init__(self, name, info, doc, ifcond=None, features=None):
|
||||||
assert name is None or isinstance(name, str)
|
assert name is None or isinstance(name, str)
|
||||||
|
for f in features or []:
|
||||||
|
assert isinstance(f, QAPISchemaFeature)
|
||||||
|
f.set_defined_in(name)
|
||||||
self.name = name
|
self.name = name
|
||||||
self._module = None
|
self._module = None
|
||||||
# For explicitly defined entities, info points to the (explicit)
|
# For explicitly defined entities, info points to the (explicit)
|
||||||
@ -39,6 +42,7 @@ def __init__(self, name, info, doc, ifcond=None):
|
|||||||
self.info = info
|
self.info = info
|
||||||
self.doc = doc
|
self.doc = doc
|
||||||
self._ifcond = ifcond or []
|
self._ifcond = ifcond or []
|
||||||
|
self.features = features or []
|
||||||
self._checked = False
|
self._checked = False
|
||||||
|
|
||||||
def c_name(self):
|
def c_name(self):
|
||||||
@ -49,6 +53,10 @@ def check(self, schema):
|
|||||||
if self.info:
|
if self.info:
|
||||||
self._module = os.path.relpath(self.info.fname,
|
self._module = os.path.relpath(self.info.fname,
|
||||||
os.path.dirname(schema.fname))
|
os.path.dirname(schema.fname))
|
||||||
|
seen = {}
|
||||||
|
for f in self.features:
|
||||||
|
f.check_clash(self.info, seen)
|
||||||
|
|
||||||
self._checked = True
|
self._checked = True
|
||||||
|
|
||||||
def connect_doc(self, doc=None):
|
def connect_doc(self, doc=None):
|
||||||
@ -307,7 +315,7 @@ def __init__(self, name, info, doc, ifcond,
|
|||||||
# struct has local_members, optional base, and no variants
|
# struct has local_members, optional base, and no variants
|
||||||
# flat union has base, variants, and no local_members
|
# flat union has base, variants, and no local_members
|
||||||
# simple union has local_members, variants, and no base
|
# simple union has local_members, variants, and no base
|
||||||
QAPISchemaType.__init__(self, name, info, doc, ifcond)
|
QAPISchemaType.__init__(self, name, info, doc, ifcond, features)
|
||||||
self.meta = 'union' if variants else 'struct'
|
self.meta = 'union' if variants else 'struct'
|
||||||
assert base is None or isinstance(base, str)
|
assert base is None or isinstance(base, str)
|
||||||
for m in local_members:
|
for m in local_members:
|
||||||
@ -316,15 +324,11 @@ def __init__(self, name, info, doc, ifcond,
|
|||||||
if variants is not None:
|
if variants is not None:
|
||||||
assert isinstance(variants, QAPISchemaObjectTypeVariants)
|
assert isinstance(variants, QAPISchemaObjectTypeVariants)
|
||||||
variants.set_defined_in(name)
|
variants.set_defined_in(name)
|
||||||
for f in features:
|
|
||||||
assert isinstance(f, QAPISchemaFeature)
|
|
||||||
f.set_defined_in(name)
|
|
||||||
self._base_name = base
|
self._base_name = base
|
||||||
self.base = None
|
self.base = None
|
||||||
self.local_members = local_members
|
self.local_members = local_members
|
||||||
self.variants = variants
|
self.variants = variants
|
||||||
self.members = None
|
self.members = None
|
||||||
self.features = features
|
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
# This calls another type T's .check() exactly when the C
|
# This calls another type T's .check() exactly when the C
|
||||||
@ -362,11 +366,6 @@ def check(self, schema):
|
|||||||
self.variants.check(schema, seen)
|
self.variants.check(schema, seen)
|
||||||
self.variants.check_clash(self.info, seen)
|
self.variants.check_clash(self.info, seen)
|
||||||
|
|
||||||
# Features are in a name space separate from members
|
|
||||||
seen = {}
|
|
||||||
for f in self.features:
|
|
||||||
f.check_clash(self.info, seen)
|
|
||||||
|
|
||||||
self.members = members # mark completed
|
self.members = members # mark completed
|
||||||
|
|
||||||
# Check that the members of this type do not cause duplicate JSON members,
|
# Check that the members of this type do not cause duplicate JSON members,
|
||||||
@ -678,12 +677,9 @@ class QAPISchemaCommand(QAPISchemaEntity):
|
|||||||
def __init__(self, name, info, doc, ifcond, arg_type, ret_type,
|
def __init__(self, name, info, doc, ifcond, arg_type, ret_type,
|
||||||
gen, success_response, boxed, allow_oob, allow_preconfig,
|
gen, success_response, boxed, allow_oob, allow_preconfig,
|
||||||
features):
|
features):
|
||||||
QAPISchemaEntity.__init__(self, name, info, doc, ifcond)
|
QAPISchemaEntity.__init__(self, name, info, doc, ifcond, features)
|
||||||
assert not arg_type or isinstance(arg_type, str)
|
assert not arg_type or isinstance(arg_type, str)
|
||||||
assert not ret_type or isinstance(ret_type, str)
|
assert not ret_type or isinstance(ret_type, str)
|
||||||
for f in features:
|
|
||||||
assert isinstance(f, QAPISchemaFeature)
|
|
||||||
f.set_defined_in(name)
|
|
||||||
self._arg_type_name = arg_type
|
self._arg_type_name = arg_type
|
||||||
self.arg_type = None
|
self.arg_type = None
|
||||||
self._ret_type_name = ret_type
|
self._ret_type_name = ret_type
|
||||||
@ -693,7 +689,6 @@ def __init__(self, name, info, doc, ifcond, arg_type, ret_type,
|
|||||||
self.boxed = boxed
|
self.boxed = boxed
|
||||||
self.allow_oob = allow_oob
|
self.allow_oob = allow_oob
|
||||||
self.allow_preconfig = allow_preconfig
|
self.allow_preconfig = allow_preconfig
|
||||||
self.features = features
|
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
QAPISchemaEntity.check(self, schema)
|
QAPISchemaEntity.check(self, schema)
|
||||||
@ -723,11 +718,6 @@ def check(self, schema):
|
|||||||
"command's 'returns' cannot take %s"
|
"command's 'returns' cannot take %s"
|
||||||
% self.ret_type.describe())
|
% self.ret_type.describe())
|
||||||
|
|
||||||
# Features are in a name space separate from members
|
|
||||||
seen = {}
|
|
||||||
for f in self.features:
|
|
||||||
f.check_clash(self.info, seen)
|
|
||||||
|
|
||||||
def connect_doc(self, doc=None):
|
def connect_doc(self, doc=None):
|
||||||
doc = doc or self.doc
|
doc = doc or self.doc
|
||||||
if doc:
|
if doc:
|
||||||
|
Loading…
Reference in New Issue
Block a user