Kaynağa Gözat

qapi/introspect.py: add _gen_features helper

_make_tree might receive a dict (a SchemaInfo object) or some other type
(usually, a string) for its obj parameter. Adding features information
should arguably be performed by the caller at such a time when we know
the type of the object and don't have to re-interrogate it.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-Id: <20210216021809.134886-5-jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
John Snow 4 yıl önce
ebeveyn
işleme
84bece7dd4
1 değiştirilmiş dosya ile 12 ekleme ve 8 silme
  1. 12 8
      scripts/qapi/introspect.py

+ 12 - 8
scripts/qapi/introspect.py

@@ -24,15 +24,11 @@
 )
 )
 
 
 
 
-def _make_tree(obj, ifcond, features, extra=None):
+def _make_tree(obj, ifcond, extra=None):
     if extra is None:
     if extra is None:
         extra = {}
         extra = {}
     if ifcond:
     if ifcond:
         extra['if'] = ifcond
         extra['if'] = ifcond
-    if features:
-        obj['features'] = [
-            _make_tree(f.name, f.ifcond, None) for f in features
-        ]
     if extra:
     if extra:
         return (obj, extra)
         return (obj, extra)
     return obj
     return obj
@@ -169,6 +165,10 @@ def _use_type(self, typ):
             return '[' + self._use_type(typ.element_type) + ']'
             return '[' + self._use_type(typ.element_type) + ']'
         return self._name(typ.name)
         return self._name(typ.name)
 
 
+    @staticmethod
+    def _gen_features(features):
+        return [_make_tree(f.name, f.ifcond) for f in features]
+
     def _gen_tree(self, name, mtype, obj, ifcond, features):
     def _gen_tree(self, name, mtype, obj, ifcond, features):
         extra = None
         extra = None
         if mtype not in ('command', 'event', 'builtin', 'array'):
         if mtype not in ('command', 'event', 'builtin', 'array'):
@@ -179,13 +179,17 @@ def _gen_tree(self, name, mtype, obj, ifcond, features):
             name = self._name(name)
             name = self._name(name)
         obj['name'] = name
         obj['name'] = name
         obj['meta-type'] = mtype
         obj['meta-type'] = mtype
-        self._trees.append(_make_tree(obj, ifcond, features, extra))
+        if features:
+            obj['features'] = self._gen_features(features)
+        self._trees.append(_make_tree(obj, ifcond, extra))
 
 
     def _gen_member(self, member):
     def _gen_member(self, member):
         obj = {'name': member.name, 'type': self._use_type(member.type)}
         obj = {'name': member.name, 'type': self._use_type(member.type)}
         if member.optional:
         if member.optional:
             obj['default'] = None
             obj['default'] = None
-        return _make_tree(obj, member.ifcond, member.features)
+        if member.features:
+            obj['features'] = self._gen_features(member.features)
+        return _make_tree(obj, member.ifcond)
 
 
     def _gen_variants(self, tag_name, variants):
     def _gen_variants(self, tag_name, variants):
         return {'tag': tag_name,
         return {'tag': tag_name,
@@ -193,7 +197,7 @@ def _gen_variants(self, tag_name, variants):
 
 
     def _gen_variant(self, variant):
     def _gen_variant(self, variant):
         obj = {'case': variant.name, 'type': self._use_type(variant.type)}
         obj = {'case': variant.name, 'type': self._use_type(variant.type)}
-        return _make_tree(obj, variant.ifcond, None)
+        return _make_tree(obj, variant.ifcond)
 
 
     def visit_builtin_type(self, name, info, json_type):
     def visit_builtin_type(self, name, info, json_type):
         self._gen_tree(name, 'builtin', {'json-type': json_type}, [], None)
         self._gen_tree(name, 'builtin', {'json-type': json_type}, [], None)