qapi: Reuse code for flat union base validation

Rather than open-code the check for a valid base type, we
should reuse the common functionality. This allows for
consistent error messages, and also makes it easier for a
later patch to turn on support for inline anonymous base
structures.

Test flat-union-inline is updated to test only one feature
(anonymous branch dictionaries), which can be implemented
independently (test flat-union-bad-base already covers the
idea of an anonymous base dictionary).

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1443565276-4535-10-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Eric Blake 2015-09-29 16:21:07 -06:00 committed by Markus Armbruster
parent 9c51b44129
commit 376863ef48
8 changed files with 13 additions and 14 deletions

View File

@ -560,15 +560,14 @@ def check_union(expr, expr_info):
# Else, it's a flat union.
else:
# The object must have a string member 'base'.
if not isinstance(base, str):
check_type(expr_info, "'base' for union '%s'" % name,
base, allow_metas=['struct'])
if not base:
raise QAPIExprError(expr_info,
"Flat union '%s' must have a string base field"
"Flat union '%s' must have a base"
% name)
base_fields = find_base_fields(base)
if not base_fields:
raise QAPIExprError(expr_info,
"Base '%s' is not a valid struct"
% base)
assert base_fields
# The value of member 'discriminator' must name a non-optional
# member of the base struct.

View File

@ -1 +1 @@
tests/qapi-schema/flat-union-bad-base.json:9: Flat union 'TestUnion' must have a string base field
tests/qapi-schema/flat-union-bad-base.json:9: 'base' for union 'TestUnion' should be a type name

View File

@ -1 +1 @@
tests/qapi-schema/flat-union-base-any.json:8: Base 'any' is not a valid struct
tests/qapi-schema/flat-union-base-any.json:8: 'base' for union 'TestUnion' cannot use built-in type 'any'

View File

@ -1 +1 @@
tests/qapi-schema/flat-union-base-union.json:14: Base 'UnionBase' is not a valid struct
tests/qapi-schema/flat-union-base-union.json:14: 'base' for union 'TestUnion' cannot use union type 'UnionBase'

View File

@ -1 +1 @@
tests/qapi-schema/flat-union-inline.json:7: Flat union 'TestUnion' must have a string base field
tests/qapi-schema/flat-union-inline.json:7: Member 'value1' of union 'TestUnion' should be a type name

View File

@ -1,11 +1,11 @@
# we require branches to be a struct name
# TODO: should we allow anonymous inline types?
# TODO: should we allow anonymous inline branch types?
{ 'enum': 'TestEnum',
'data': [ 'value1', 'value2' ] }
{ 'struct': 'Base',
'data': { 'enum1': 'TestEnum', 'kind': 'str' } }
{ 'union': 'TestUnion',
'base': { 'enum1': 'TestEnum', 'kind': 'str' },
'base': 'Base',
'discriminator': 'enum1',
'data': { 'value1': { 'string': 'str' },
'value2': { 'integer': 'int' } } }

View File

@ -1 +1 @@
tests/qapi-schema/flat-union-no-base.json:9: Flat union 'TestUnion' must have a string base field
tests/qapi-schema/flat-union-no-base.json:9: Flat union 'TestUnion' must have a base

View File

@ -1 +1 @@
tests/qapi-schema/union-invalid-base.json:8: Base 'int' is not a valid struct
tests/qapi-schema/union-invalid-base.json:8: 'base' for union 'TestUnion' cannot use built-in type 'int'