qapi script: use same function to generate enum string

Prior to this patch, qapi-visit.py used custom code to generate enum
names used for handling a qapi union. Fix it to instead reuse common
code, with identical generated results, and allowing future updates to
generation to only need to touch one place.

Signed-off-by: Wenchao Xia <wenchaoqemu@gmail.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Wenchao Xia 2014-03-04 18:44:36 -08:00 committed by Luiz Capitulino
parent 6299659f54
commit b0b58195e4
3 changed files with 25 additions and 13 deletions

View File

@ -144,11 +144,11 @@ typedef enum %(name)s
i = 0
for value in enum_values:
enum_full_value = generate_enum_full_value(name, value)
enum_decl += mcgen('''
%(abbrev)s_%(value)s = %(i)d,
%(enum_full_value)s = %(i)d,
''',
abbrev=de_camel_case(name).upper(),
value=generate_enum_name(value),
enum_full_value = enum_full_value,
i=i)
i += 1

View File

@ -214,18 +214,22 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
''',
name=name)
# For anon union, always use the default enum type automatically generated
# as "'%sKind' % (name)"
disc_type = '%sKind' % (name)
for key in members:
assert (members[key] in builtin_types
or find_struct(members[key])
or find_union(members[key])), "Invalid anonymous union member"
enum_full_value = generate_enum_full_value(disc_type, key)
ret += mcgen('''
case %(abbrev)s_KIND_%(enum)s:
case %(enum_full_value)s:
visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, name, &err);
break;
''',
abbrev = de_camel_case(name).upper(),
enum = c_fun(de_camel_case(key),False).upper(),
enum_full_value = enum_full_value,
c_type = type_name(members[key]),
c_name = c_fun(key))
@ -255,7 +259,10 @@ def generate_visit_union(expr):
assert not base
return generate_visit_anon_union(name, members)
# There will always be a discriminator in the C switch code, by default it
# is an enum type generated silently as "'%sKind' % (name)"
ret = generate_visit_enum('%sKind' % name, members.keys())
disc_type = '%sKind' % (name)
if base:
base_fields = find_struct(base)['data']
@ -313,13 +320,13 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
visit_end_implicit_struct(m, &err);
}'''
enum_full_value = generate_enum_full_value(disc_type, key)
ret += mcgen('''
case %(abbrev)s_KIND_%(enum)s:
case %(enum_full_value)s:
''' + fmt + '''
break;
''',
abbrev = de_camel_case(name).upper(),
enum = c_fun(de_camel_case(key),False).upper(),
enum_full_value = enum_full_value,
c_type=type_name(members[key]),
c_name=c_fun(key))

View File

@ -468,12 +468,17 @@ def guardend(name):
''',
name=guardname(name))
def generate_enum_name(name):
if name.isupper():
return c_fun(name, False)
def _generate_enum_value_string(value):
if value.isupper():
return c_fun(value, False)
new_name = ''
for c in c_fun(name, False):
for c in c_fun(value, False):
if c.isupper():
new_name += '_'
new_name += c
return new_name.lstrip('_').upper()
def generate_enum_full_value(enum_name, enum_value):
abbrev_string = de_camel_case(enum_name).upper()
value_string = _generate_enum_value_string(enum_value)
return "%s_%s" % (abbrev_string, value_string)