qapi: Simplify what gets stored in enum_types

Don't invent a new dictionary structure just for enum_types, simply
store the defining expression, like we do for struct_types and
union_types.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <1489582656-31133-41-git-send-email-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2017-03-15 13:57:29 +01:00
parent 062e856b15
commit eda43c6844
1 changed files with 15 additions and 14 deletions

View File

@ -668,16 +668,17 @@ def find_union(name):
return None return None
def add_enum(name, info, enum_values=None, implicit=False): def add_enum(definition, info):
global enum_types global enum_types
add_name(name, info, 'enum', implicit) name = definition['enum']
enum_types.append({'enum_name': name, 'enum_values': enum_values}) add_name(name, info, 'enum', 'data' not in definition)
enum_types.append(definition)
def find_enum(name): def find_enum(name):
global enum_types global enum_types
for enum in enum_types: for enum in enum_types:
if enum['enum_name'] == name: if enum['enum'] == name:
return enum return enum
return None return None
@ -825,15 +826,15 @@ def check_union(expr, info):
# If the discriminator names an enum type, then all members # If the discriminator names an enum type, then all members
# of 'data' must also be members of the enum type. # of 'data' must also be members of the enum type.
if enum_define: if enum_define:
if key not in enum_define['enum_values']: if key not in enum_define['data']:
raise QAPISemError(info, raise QAPISemError(info,
"Discriminator value '%s' is not found in " "Discriminator value '%s' is not found in "
"enum '%s'" "enum '%s'"
% (key, enum_define['enum_name'])) % (key, enum_define['enum']))
# If discriminator is user-defined, ensure all values are covered # If discriminator is user-defined, ensure all values are covered
if enum_define: if enum_define:
for value in enum_define['enum_values']: for value in enum_define['data']:
if value not in members.keys(): if value not in members.keys():
raise QAPISemError(info, "Union '%s' data missing '%s' branch" raise QAPISemError(info, "Union '%s' data missing '%s' branch"
% (name, value)) % (name, value))
@ -938,7 +939,7 @@ def check_exprs(exprs):
if 'enum' in expr: if 'enum' in expr:
name = expr['enum'] name = expr['enum']
check_keys(expr_elem, 'enum', ['data'], ['prefix']) check_keys(expr_elem, 'enum', ['data'], ['prefix'])
add_enum(name, info, expr['data']) add_enum(expr, info)
elif 'union' in expr: elif 'union' in expr:
name = expr['union'] name = expr['union']
check_keys(expr_elem, 'union', ['data'], check_keys(expr_elem, 'union', ['data'],
@ -971,13 +972,13 @@ def check_exprs(exprs):
# Try again for hidden UnionKind enum # Try again for hidden UnionKind enum
for expr_elem in exprs: for expr_elem in exprs:
expr = expr_elem['expr'] expr = expr_elem['expr']
if 'union' in expr: if 'union' in expr and not discriminator_find_enum_define(expr):
if not discriminator_find_enum_define(expr): name = '%sKind' % expr['union']
add_enum('%sKind' % expr['union'], expr_elem['info'],
implicit=True)
elif 'alternate' in expr: elif 'alternate' in expr:
add_enum('%sKind' % expr['alternate'], expr_elem['info'], name = '%sKind' % expr['alternate']
implicit=True) else:
continue
add_enum({ 'enum': name }, expr_elem['info'])
# Validate that exprs make sense # Validate that exprs make sense
for expr_elem in exprs: for expr_elem in exprs: