Commit 84ab0086 authored by Markus Armbruster's avatar Markus Armbruster
Browse files

qapi: Add feature flags to struct members



Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20200317115459.31821-21-armbru@redhat.com>
parent 645178c0
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -234,7 +234,9 @@ Syntax:
               '*features': FEATURES }
    MEMBERS = { MEMBER, ... }
    MEMBER = STRING : TYPE-REF
           | STRING : { 'type': TYPE-REF, '*if': COND }
           | STRING : { 'type': TYPE-REF,
                        '*if': COND,
                        '*features': FEATURES }

Member 'struct' names the struct type.

+5 −1
Original line number Diff line number Diff line
@@ -206,11 +206,15 @@
#           Future extension: if present and non-null, the parameter
#           is optional, and defaults to this value.
#
# @features: names of features associated with the member, in no
#            particular order.  (since 5.0)
#
# Since: 2.5
##
{ 'struct': 'SchemaInfoObjectMember',
  'data': { 'name': 'str', 'type': 'str', '*default': 'any' } }
  'data': { 'name': 'str', 'type': 'str', '*default': 'any',
# @default's type must be null or match @type
            '*features': [ 'str' ] } }

##
# @SchemaInfoObjectVariant:
+2 −1
Original line number Diff line number Diff line
@@ -167,8 +167,9 @@ def check_type(value, info, source,
                       allow_optional=True, permit_upper=permit_upper)
        if c_name(key, False) == 'u' or c_name(key, False).startswith('has_'):
            raise QAPISemError(info, "%s uses reserved name" % key_source)
        check_keys(arg, info, key_source, ['type'], ['if'])
        check_keys(arg, info, key_source, ['type'], ['if', 'features'])
        check_if(arg, info, key_source)
        check_features(arg.get('features'), info)
        check_type(arg['type'], info, key_source, allow_array=True)


+1 −1
Original line number Diff line number Diff line
@@ -173,7 +173,7 @@ const QLitObject %(c_name)s = %(c_string)s;
        obj = {'name': member.name, 'type': self._use_type(member.type)}
        if member.optional:
            obj['default'] = None
        return _make_tree(obj, member.ifcond, None)
        return _make_tree(obj, member.ifcond, member.features)

    def _gen_variants(self, tag_name, variants):
        return {'tag': tag_name,
+20 −5
Original line number Diff line number Diff line
@@ -668,18 +668,31 @@ class QAPISchemaFeature(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)
        assert isinstance(typ, str)
        assert isinstance(optional, bool)
        for f in features or []:
            assert isinstance(f, QAPISchemaFeature)
            f.set_defined_in(name)
        self._type_name = typ
        self.type = None
        self.optional = optional
        self.features = features or []

    def check(self, schema):
        assert self.defined_in
        self.type = schema.resolve_type(self._type_name, self.info,
                                        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):
@@ -962,7 +975,7 @@ class QAPISchema:
            name, info, doc, ifcond, features,
            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
        if name.startswith('*'):
            name = name[1:]
@@ -970,10 +983,12 @@ class QAPISchema:
        if isinstance(typ, list):
            assert len(typ) == 1
            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):
        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()]

    def _def_struct_type(self, expr, info, doc):
@@ -996,7 +1011,7 @@ class QAPISchema:
            typ = self._make_array_type(typ[0], info)
        typ = self._make_implicit_object_type(
            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)

    def _def_union_type(self, expr, info, doc):
Loading