Skip to content

Commit

Permalink
qapi/introspect.py: add _gen_features helper
Browse files Browse the repository at this point in the history
_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>
  • Loading branch information
jnsnow authored and Markus Armbruster committed Feb 18, 2021
1 parent d70f513 commit 84bece7
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions scripts/qapi/introspect.py
Expand Up @@ -24,15 +24,11 @@
)


def _make_tree(obj, ifcond, features, extra=None):
def _make_tree(obj, ifcond, extra=None):
if extra is None:
extra = {}
if ifcond:
extra['if'] = ifcond
if features:
obj['features'] = [
_make_tree(f.name, f.ifcond, None) for f in features
]
if extra:
return (obj, extra)
return obj
Expand Down Expand Up @@ -169,6 +165,10 @@ def _use_type(self, typ):
return '[' + self._use_type(typ.element_type) + ']'
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):
extra = None
if mtype not in ('command', 'event', 'builtin', 'array'):
Expand All @@ -179,21 +179,25 @@ def _gen_tree(self, name, mtype, obj, ifcond, features):
name = self._name(name)
obj['name'] = name
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):
obj = {'name': member.name, 'type': self._use_type(member.type)}
if member.optional:
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):
return {'tag': tag_name,
'variants': [self._gen_variant(v) for v in variants]}

def _gen_variant(self, variant):
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):
self._gen_tree(name, 'builtin', {'json-type': json_type}, [], None)
Expand Down

0 comments on commit 84bece7

Please sign in to comment.