提交 b0b58195 编写于 作者: W Wenchao Xia 提交者: Luiz Capitulino

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: NWenchao Xia <wenchaoqemu@gmail.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
Signed-off-by: NLuiz Capitulino <lcapitulino@redhat.com>
上级 6299659f
......@@ -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
......
......@@ -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))
......
......@@ -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)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册