On Sun, Mar 15, 2020 at 4:14 PM Markus Armbruster <arm...@redhat.com> wrote: > > The value of @qmp_schema_qlit is generated from an expression tree. > Tree nodes are created in several places. Factor out the common code > into _make_tree(). This isn't much of a win now. It will pay off > when we add feature flags in the next few commits. > > Signed-off-by: Markus Armbruster <arm...@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > scripts/qapi/introspect.py | 44 +++++++++++++++++++++----------------- > 1 file changed, 24 insertions(+), 20 deletions(-) > > diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py > index e4fc9d90f1..a3fa9865db 100644 > --- a/scripts/qapi/introspect.py > +++ b/scripts/qapi/introspect.py > @@ -16,6 +16,18 @@ from qapi.schema import (QAPISchemaArrayType, > QAPISchemaBuiltinType, > QAPISchemaType) > > > +def _make_tree(obj, ifcond, features, extra=None): > + if extra is None: > + extra = {} > + if ifcond: > + extra['if'] = ifcond > + if features: > + obj['features'] = [(f.name, {'if': f.ifcond}) for f in features] > + if extra: > + return (obj, extra) > + return obj > + > + > def _tree_to_qlit(obj, level=0, suppress_first_indent=False): > > def indent(level): > @@ -146,47 +158,38 @@ const QLitObject %(c_name)s = %(c_string)s; > return self._name(typ.name) > > def _gen_tree(self, name, mtype, obj, ifcond, features): > - extra = {} > + extra = None > if mtype not in ('command', 'event', 'builtin', 'array'): > if not self._unmask: > # Output a comment to make it easy to map masked names > # back to the source when reading the generated output. > - extra['comment'] = '"%s" = %s' % (self._name(name), name) > + extra = {'comment': '"%s" = %s' % (self._name(name), name)} > name = self._name(name) > obj['name'] = name > obj['meta-type'] = mtype > - if features: > - obj['features'] = [(f.name, {'if': f.ifcond}) for f in features] > - if ifcond: > - extra['if'] = ifcond > - if extra: > - self._trees.append((obj, extra)) > - else: > - self._trees.append(obj) > + self._trees.append(_make_tree(obj, ifcond, features, extra)) > > def _gen_member(self, member): > - ret = {'name': member.name, 'type': self._use_type(member.type)} > + obj = {'name': member.name, 'type': self._use_type(member.type)} > if member.optional: > - ret['default'] = None > - if member.ifcond: > - ret = (ret, {'if': member.ifcond}) > - return ret > + obj['default'] = None > + return _make_tree(obj, member.ifcond, None) > > 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): > - return ({'case': variant.name, 'type': self._use_type(variant.type)}, > - {'if': variant.ifcond}) > + obj = {'case': variant.name, 'type': self._use_type(variant.type)} > + return _make_tree(obj, variant.ifcond, None) > > def visit_builtin_type(self, name, info, json_type): > self._gen_tree(name, 'builtin', {'json-type': json_type}, [], None) > > def visit_enum_type(self, name, info, ifcond, features, members, prefix): > self._gen_tree(name, 'enum', > - {'values': > - [(m.name, {'if': m.ifcond}) for m in members]}, > + {'values': [_make_tree(m.name, m.ifcond, None) > + for m in members]}, > ifcond, features) > > def visit_array_type(self, name, info, ifcond, element_type): > @@ -206,7 +209,8 @@ const QLitObject %(c_name)s = %(c_string)s; > def visit_alternate_type(self, name, info, ifcond, features, variants): > self._gen_tree(name, 'alternate', > {'members': [ > - ({'type': self._use_type(m.type)}, {'if': > m.ifcond}) > + _make_tree({'type': self._use_type(m.type)}, > + m.ifcond, None) > for m in variants.variants]}, > ifcond, features) > > -- > 2.21.1 > > -- Marc-André Lureau