[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 18/54] qapi: add 'ifcond' to visitor methods
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v2 18/54] qapi: add 'ifcond' to visitor methods |
Date: |
Mon, 04 Sep 2017 18:47:14 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) |
Marc-André Lureau <address@hidden> writes:
> Modify the test visitor to check correct passing of values.
>
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
> scripts/qapi.py | 34
> ++++++++++++++++++++--------------
> scripts/qapi-commands.py | 2 +-
> scripts/qapi-event.py | 2 +-
> scripts/qapi-introspect.py | 12 ++++++------
> scripts/qapi-types.py | 8 ++++----
> scripts/qapi-visit.py | 8 ++++----
> scripts/qapi2texi.py | 10 +++++-----
> tests/qapi-schema/qapi-schema-test.out | 9 +++++++++
> tests/qapi-schema/test-qapi.py | 21 ++++++++++++++++-----
> 9 files changed, 66 insertions(+), 40 deletions(-)
>
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index dc40d74abb..86845a28f9 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -1031,26 +1031,26 @@ class QAPISchemaVisitor(object):
> def visit_builtin_type(self, name, info, json_type):
> pass
>
> - def visit_enum_type(self, name, info, values, prefix):
> + def visit_enum_type(self, name, info, values, prefix, ifcond):
> pass
>
> - def visit_array_type(self, name, info, element_type):
> + def visit_array_type(self, name, info, element_type, ifcond):
> pass
>
> - def visit_object_type(self, name, info, base, members, variants):
> + def visit_object_type(self, name, info, base, members, variants, ifcond):
> pass
>
> - def visit_object_type_flat(self, name, info, members, variants):
> + def visit_object_type_flat(self, name, info, members, variants, ifcond):
> pass
>
> - def visit_alternate_type(self, name, info, variants):
> + def visit_alternate_type(self, name, info, variants, ifcond):
> pass
>
> def visit_command(self, name, info, arg_type, ret_type,
> - gen, success_response, boxed):
> + gen, success_response, boxed, ifcond):
> pass
>
> - def visit_event(self, name, info, arg_type, boxed):
> + def visit_event(self, name, info, arg_type, boxed, ifcond):
> pass
>
>
Let's add the new common parameter ifcond among the existing common
parameters self, name, info. Preferably in the same position as in
entity constructors.
> @@ -1150,7 +1150,7 @@ class QAPISchemaEnumType(QAPISchemaType):
>
> def visit(self, visitor):
> visitor.visit_enum_type(self.name, self.info,
> - self.member_names(), self.prefix)
> + self.member_names(), self.prefix,
> self.ifcond)
>
>
> class QAPISchemaArrayType(QAPISchemaType):
> @@ -1181,7 +1181,8 @@ class QAPISchemaArrayType(QAPISchemaType):
> return 'array of ' + elt_doc_type
>
> def visit(self, visitor):
> - visitor.visit_array_type(self.name, self.info, self.element_type)
> + visitor.visit_array_type(self.name, self.info, self.element_type,
> + self.ifcond)
>
>
> class QAPISchemaObjectType(QAPISchemaType):
> @@ -1263,9 +1264,11 @@ class QAPISchemaObjectType(QAPISchemaType):
>
> def visit(self, visitor):
> visitor.visit_object_type(self.name, self.info,
> - self.base, self.local_members,
> self.variants)
> + self.base, self.local_members,
> self.variants,
> + self.ifcond)
> visitor.visit_object_type_flat(self.name, self.info,
> - self.members, self.variants)
> + self.members, self.variants,
> + self.ifcond)
>
>
> class QAPISchemaMember(object):
> @@ -1408,7 +1411,8 @@ class QAPISchemaAlternateType(QAPISchemaType):
> return 'value'
>
> def visit(self, visitor):
> - visitor.visit_alternate_type(self.name, self.info, self.variants)
> + visitor.visit_alternate_type(self.name, self.info,
> + self.variants, self.ifcond)
>
> def is_empty(self):
> return False
> @@ -1450,7 +1454,8 @@ class QAPISchemaCommand(QAPISchemaEntity):
> def visit(self, visitor):
> visitor.visit_command(self.name, self.info,
> self.arg_type, self.ret_type,
> - self.gen, self.success_response, self.boxed)
> + self.gen, self.success_response, self.boxed,
> + self.ifcond)
>
>
> class QAPISchemaEvent(QAPISchemaEntity):
> @@ -1478,7 +1483,8 @@ class QAPISchemaEvent(QAPISchemaEntity):
> raise QAPISemError(self.info, "Use of 'boxed' requires 'data'")
>
> def visit(self, visitor):
> - visitor.visit_event(self.name, self.info, self.arg_type, self.boxed)
> + visitor.visit_event(self.name, self.info, self.arg_type, self.boxed,
> + self.ifcond)
>
>
> class QAPISchema(object):
> diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
> index 974d0a4a80..5eb96b2d95 100644
> --- a/scripts/qapi-commands.py
> +++ b/scripts/qapi-commands.py
> @@ -241,7 +241,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor):
> self._visited_ret_types = None
>
> def visit_command(self, name, info, arg_type, ret_type,
> - gen, success_response, boxed):
> + gen, success_response, boxed, ifcond):
> if not gen:
> return
> self.decl += gen_command_decl(name, arg_type, boxed, ret_type)
> diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py
> index bcbef1035f..fec27fe2e1 100644
> --- a/scripts/qapi-event.py
> +++ b/scripts/qapi-event.py
> @@ -163,7 +163,7 @@ class QAPISchemaGenEventVisitor(QAPISchemaVisitor):
> self.defn += gen_enum_lookup(event_enum_name, self._event_names)
> self._event_names = None
>
> - def visit_event(self, name, info, arg_type, boxed):
> + def visit_event(self, name, info, arg_type, boxed, ifcond):
> self.decl += gen_event_send_decl(name, arg_type, boxed)
> self.defn += gen_event_send(name, arg_type, boxed)
> self._event_names.append(name)
> diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py
> index 1b96926fa7..4c437d60ec 100644
> --- a/scripts/qapi-introspect.py
> +++ b/scripts/qapi-introspect.py
> @@ -142,34 +142,34 @@ const QLitObject %(c_name)s = %(c_string)s;
> def visit_builtin_type(self, name, info, json_type):
> self._gen_qlit(name, 'builtin', {'json-type': json_type})
>
> - def visit_enum_type(self, name, info, values, prefix):
> + def visit_enum_type(self, name, info, values, prefix, ifcond):
> self._gen_qlit(name, 'enum', {'values': values})
>
> - def visit_array_type(self, name, info, element_type):
> + def visit_array_type(self, name, info, element_type, ifcond):
> element = self._use_type(element_type)
> self._gen_qlit('[' + element + ']', 'array', {'element-type':
> element})
>
> - def visit_object_type_flat(self, name, info, members, variants):
> + def visit_object_type_flat(self, name, info, members, variants, ifcond):
> obj = {'members': [self._gen_member(m) for m in members]}
> if variants:
> obj.update(self._gen_variants(variants.tag_member.name,
> variants.variants))
> self._gen_qlit(name, 'object', obj)
>
> - def visit_alternate_type(self, name, info, variants):
> + def visit_alternate_type(self, name, info, variants, ifcond):
> self._gen_qlit(name, 'alternate',
> {'members': [{'type': self._use_type(m.type)}
> for m in variants.variants]})
>
> def visit_command(self, name, info, arg_type, ret_type,
> - gen, success_response, boxed):
> + gen, success_response, boxed, ifcond):
> arg_type = arg_type or self._schema.the_empty_object_type
> ret_type = ret_type or self._schema.the_empty_object_type
> self._gen_qlit(name, 'command',
> {'arg-type': self._use_type(arg_type),
> 'ret-type': self._use_type(ret_type)})
>
> - def visit_event(self, name, info, arg_type, boxed):
> + def visit_event(self, name, info, arg_type, boxed, ifcond):
> arg_type = arg_type or self._schema.the_empty_object_type
> self._gen_qlit(name, 'event', {'arg-type': self._use_type(arg_type)})
>
> diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
> index dc05268917..6f06720adc 100644
> --- a/scripts/qapi-types.py
> +++ b/scripts/qapi-types.py
> @@ -201,7 +201,7 @@ typedef struct QEnumLookup {
> self.decl += gen_type_cleanup_decl(name)
> self.defn += gen_type_cleanup(name)
>
> - def visit_enum_type(self, name, info, values, prefix):
> + def visit_enum_type(self, name, info, values, prefix, ifcond):
> # Special case for our lone builtin enum type
> # TODO use something cleaner than existence of info
> if not info:
> @@ -212,7 +212,7 @@ typedef struct QEnumLookup {
> self._fwdecl += gen_enum(name, values, prefix)
> self.defn += gen_enum_lookup(name, values, prefix)
>
> - def visit_array_type(self, name, info, element_type):
> + def visit_array_type(self, name, info, element_type, ifcond):
> if isinstance(element_type, QAPISchemaBuiltinType):
> self._btin += gen_fwd_object_or_array(name)
> self._btin += gen_array(name, element_type)
> @@ -224,7 +224,7 @@ typedef struct QEnumLookup {
> self.decl += gen_array(name, element_type)
> self._gen_type_cleanup(name)
>
> - def visit_object_type(self, name, info, base, members, variants):
> + def visit_object_type(self, name, info, base, members, variants, ifcond):
> # Nothing to do for the special empty builtin
> if name == 'q_empty':
> return
> @@ -238,7 +238,7 @@ typedef struct QEnumLookup {
> # implicit types won't be directly allocated/freed
> self._gen_type_cleanup(name)
>
> - def visit_alternate_type(self, name, info, variants):
> + def visit_alternate_type(self, name, info, variants, ifcond):
> self._fwdecl += gen_fwd_object_or_array(name)
> self.decl += gen_object(name, None, [variants.tag_member], variants)
> self._gen_type_cleanup(name)
> diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
> index 7e1cfc13f0..c29c2d869e 100644
> --- a/scripts/qapi-visit.py
> +++ b/scripts/qapi-visit.py
> @@ -282,7 +282,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
> self.decl = self._btin + self.decl
> self._btin = None
>
> - def visit_enum_type(self, name, info, values, prefix):
> + def visit_enum_type(self, name, info, values, prefix, ifcond):
> # Special case for our lone builtin enum type
> # TODO use something cleaner than existence of info
> if not info:
> @@ -293,7 +293,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
> self.decl += gen_visit_decl(name, scalar=True)
> self.defn += gen_visit_enum(name)
>
> - def visit_array_type(self, name, info, element_type):
> + def visit_array_type(self, name, info, element_type, ifcond):
> decl = gen_visit_decl(name)
> defn = gen_visit_list(name, element_type)
> if isinstance(element_type, QAPISchemaBuiltinType):
> @@ -304,7 +304,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
> self.decl += decl
> self.defn += defn
>
> - def visit_object_type(self, name, info, base, members, variants):
> + def visit_object_type(self, name, info, base, members, variants, ifcond):
> # Nothing to do for the special empty builtin
> if name == 'q_empty':
> return
> @@ -317,7 +317,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
> self.decl += gen_visit_decl(name)
> self.defn += gen_visit_object(name, base, members, variants)
>
> - def visit_alternate_type(self, name, info, variants):
> + def visit_alternate_type(self, name, info, variants, ifcond):
> self.decl += gen_visit_decl(name)
> self.defn += gen_visit_alternate(name, variants)
>
> diff --git a/scripts/qapi2texi.py b/scripts/qapi2texi.py
> index 8b542f9fff..ae7920aa87 100755
> --- a/scripts/qapi2texi.py
> +++ b/scripts/qapi2texi.py
> @@ -207,7 +207,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor):
> def visit_begin(self, schema):
> self.out = ''
>
> - def visit_enum_type(self, name, info, values, prefix):
> + def visit_enum_type(self, name, info, values, prefix, ifcond):
> doc = self.cur_doc
> if self.out:
> self.out += '\n'
> @@ -216,7 +216,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor):
> body=texi_entity(doc, 'Values',
> member_func=texi_enum_value))
>
> - def visit_object_type(self, name, info, base, members, variants):
> + def visit_object_type(self, name, info, base, members, variants, ifcond):
> doc = self.cur_doc
> if base and base.is_implicit():
> base = None
> @@ -226,7 +226,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor):
> name=doc.symbol,
> body=texi_entity(doc, 'Members', base,
> variants))
>
> - def visit_alternate_type(self, name, info, variants):
> + def visit_alternate_type(self, name, info, variants, ifcond):
> doc = self.cur_doc
> if self.out:
> self.out += '\n'
> @@ -235,7 +235,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor):
> body=texi_entity(doc, 'Members'))
>
> def visit_command(self, name, info, arg_type, ret_type,
> - gen, success_response, boxed):
> + gen, success_response, boxed, ifcond):
> doc = self.cur_doc
> if self.out:
> self.out += '\n'
> @@ -249,7 +249,7 @@ class QAPISchemaGenDocVisitor(qapi.QAPISchemaVisitor):
> name=doc.symbol,
> body=body)
>
> - def visit_event(self, name, info, arg_type, boxed):
> + def visit_event(self, name, info, arg_type, boxed, ifcond):
> doc = self.cur_doc
> if self.out:
> self.out += '\n'
> diff --git a/tests/qapi-schema/qapi-schema-test.out
> b/tests/qapi-schema/qapi-schema-test.out
> index 7fbaea19bc..fc5fd25f1b 100644
> --- a/tests/qapi-schema/qapi-schema-test.out
> +++ b/tests/qapi-schema/qapi-schema-test.out
> @@ -56,18 +56,25 @@ alternate TestIfAlternate
> tag type
> case foo: int
> case bar: TestStruct
> + if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
> command TestIfCmd q_obj_TestIfCmd-arg -> None
> gen=True success_response=True boxed=False
> + if defined(TEST_IF_CMD) && defined(TEST_IF_STRUCT)
> enum TestIfEnum ['foo', 'bar']
> + if defined(TEST_IF_ENUM)
> event TestIfEvent q_obj_TestIfEvent-arg
> boxed=False
> + if defined(TEST_IF_EVT) && defined(TEST_IF_STRUCT)
> object TestIfStruct
> member foo: int optional=False
> + if defined(TEST_IF_STRUCT)
> object TestIfUnion
> member type: TestIfUnionKind optional=False
> tag type
> case foo: q_obj_TestStruct-wrapper
> + if defined(TEST_IF_UNION) && defined(TEST_IF_STRUCT)
> enum TestIfUnionKind ['foo']
> + if defined(TEST_IF_UNION) && defined(TEST_IF_STRUCT)
> object TestStruct
> member integer: int optional=False
> member boolean: bool optional=False
> @@ -190,8 +197,10 @@ object q_obj_EVENT_D-arg
> member enum3: EnumOne optional=True
> object q_obj_TestIfCmd-arg
> member foo: TestIfStruct optional=False
> + if defined(TEST_IF_CMD) && defined(TEST_IF_STRUCT)
> object q_obj_TestIfEvent-arg
> member foo: TestIfStruct optional=False
> + if defined(TEST_IF_EVT) && defined(TEST_IF_STRUCT)
> object q_obj_TestStruct-wrapper
> member data: TestStruct optional=False
> object q_obj_UserDefFlatUnion2-base
Ah, now the ifcond become visible! Announcing that in PATCH 15 would've
avoided me asking for it :)
> diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py
> index c7724d3437..17fd975812 100644
> --- a/tests/qapi-schema/test-qapi.py
> +++ b/tests/qapi-schema/test-qapi.py
> @@ -17,12 +17,13 @@ import sys
>
>
> class QAPISchemaTestVisitor(QAPISchemaVisitor):
> - def visit_enum_type(self, name, info, values, prefix):
> + def visit_enum_type(self, name, info, values, prefix, ifcond):
> print 'enum %s %s' % (name, values)
> if prefix:
> print ' prefix %s' % prefix
> + self._print_if(ifcond)
>
> - def visit_object_type(self, name, info, base, members, variants):
> + def visit_object_type(self, name, info, base, members, variants, ifcond):
> print 'object %s' % name
> if base:
> print ' base %s' % base.name
> @@ -30,21 +31,25 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
> print ' member %s: %s optional=%s' % \
> (m.name, m.type.name, m.optional)
> self._print_variants(variants)
> + self._print_if(ifcond)
>
> - def visit_alternate_type(self, name, info, variants):
> + def visit_alternate_type(self, name, info, variants, ifcond):
> print 'alternate %s' % name
> self._print_variants(variants)
> + self._print_if(ifcond)
>
> def visit_command(self, name, info, arg_type, ret_type,
> - gen, success_response, boxed):
> + gen, success_response, boxed, ifcond):
> print 'command %s %s -> %s' % \
> (name, arg_type and arg_type.name, ret_type and ret_type.name)
> print ' gen=%s success_response=%s boxed=%s' % \
> (gen, success_response, boxed)
> + self._print_if(ifcond)
>
> - def visit_event(self, name, info, arg_type, boxed):
> + def visit_event(self, name, info, arg_type, boxed, ifcond):
> print 'event %s %s' % (name, arg_type and arg_type.name)
> print ' boxed=%s' % boxed
> + self._print_if(ifcond)
>
> @staticmethod
> def _print_variants(variants):
> @@ -53,6 +58,12 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
> for v in variants.variants:
> print ' case %s: %s' % (v.name, v.type.name)
>
> + @staticmethod
> + def _print_if(ifcond):
> + if ifcond:
> + print ' if %s' % ifcond
> +
> +
> schema = QAPISchema(sys.argv[1])
> schema.visit(QAPISchemaTestVisitor())
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH v2 18/54] qapi: add 'ifcond' to visitor methods,
Markus Armbruster <=