[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 17/19] qapi: Lift features into QAPISchemaEntity
From: |
Markus Armbruster |
Subject: |
[PATCH 17/19] qapi: Lift features into QAPISchemaEntity |
Date: |
Thu, 24 Oct 2019 13:02:35 +0200 |
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 <address@hidden>
---
scripts/qapi/schema.py | 32 +++++++++++---------------------
1 file changed, 11 insertions(+), 21 deletions(-)
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index ee510f129b..bdea9482fc 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -27,8 +27,11 @@ from qapi.parser import QAPISchemaParser
class QAPISchemaEntity(object):
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)
+ for f in features or []:
+ assert isinstance(f, QAPISchemaFeature)
+ f.set_defined_in(name)
self.name = name
self._module = None
# For explicitly defined entities, info points to the (explicit)
@@ -39,6 +42,7 @@ class QAPISchemaEntity(object):
self.info = info
self.doc = doc
self._ifcond = ifcond or []
+ self.features = features or []
self._checked = False
def c_name(self):
@@ -49,6 +53,10 @@ class QAPISchemaEntity(object):
if self.info:
self._module = os.path.relpath(self.info.fname,
os.path.dirname(schema.fname))
+ seen = {}
+ for f in self.features:
+ f.check_clash(self.info, seen)
+
self._checked = True
def connect_doc(self, doc=None):
@@ -307,7 +315,7 @@ class QAPISchemaObjectType(QAPISchemaType):
# struct has local_members, optional base, and no variants
# flat union has base, variants, and no local_members
# 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'
assert base is None or isinstance(base, str)
for m in local_members:
@@ -316,15 +324,11 @@ class QAPISchemaObjectType(QAPISchemaType):
if variants is not None:
assert isinstance(variants, QAPISchemaObjectTypeVariants)
variants.set_defined_in(name)
- for f in features:
- assert isinstance(f, QAPISchemaFeature)
- f.set_defined_in(name)
self._base_name = base
self.base = None
self.local_members = local_members
self.variants = variants
self.members = None
- self.features = features
def check(self, schema):
# This calls another type T's .check() exactly when the C
@@ -362,11 +366,6 @@ class QAPISchemaObjectType(QAPISchemaType):
self.variants.check(schema, 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
# 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,
gen, success_response, boxed, allow_oob, allow_preconfig,
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 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 = None
self._ret_type_name = ret_type
@@ -693,7 +689,6 @@ class QAPISchemaCommand(QAPISchemaEntity):
self.boxed = boxed
self.allow_oob = allow_oob
self.allow_preconfig = allow_preconfig
- self.features = features
def check(self, schema):
QAPISchemaEntity.check(self, schema)
@@ -723,11 +718,6 @@ class QAPISchemaCommand(QAPISchemaEntity):
"command's 'returns' cannot take %s"
% 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):
doc = doc or self.doc
if doc:
--
2.21.0
- [PATCH 18/19] qapi: Polish reporting of bogus member documentation, (continued)
- [PATCH 18/19] qapi: Polish reporting of bogus member documentation, Markus Armbruster, 2019/10/24
- [PATCH 04/19] tests/qapi-schema: Fix feature documentation testing, Markus Armbruster, 2019/10/24
- [PATCH 03/19] tests/qapi-schema: Cover alternate documentation comments, Markus Armbruster, 2019/10/24
- [PATCH 09/19] qapi: Fix enum doc comment checking, Markus Armbruster, 2019/10/24
- [PATCH 07/19] qapi: De-duplicate entity documentation generation code, Markus Armbruster, 2019/10/24
- [PATCH 11/19] qapi: Fix doc comment checking for commands and events, Markus Armbruster, 2019/10/24
- [PATCH 15/19] qapi: Fold normalize_features() into check_features(), Markus Armbruster, 2019/10/24
- [PATCH 02/19] tests/qapi-schema: Demonstrate command and event doc comment bugs, Markus Armbruster, 2019/10/24
- [PATCH 19/19] qapi: Check feature documentation against the schema, Markus Armbruster, 2019/10/24
- [PATCH 14/19] qapi: Fold normalize_if() into check_if(), Markus Armbruster, 2019/10/24
- [PATCH 17/19] qapi: Lift features into QAPISchemaEntity,
Markus Armbruster <=
- [PATCH 06/19] qapi: Implement boxed event argument documentation, Markus Armbruster, 2019/10/24