qapi: change enum visitor and gen_enum* to take QAPISchemaMember

This will allow to add and access more properties associated with enum
values/members, like the associated 'if' condition. We may want to
have a specialized type QAPISchemaEnumMember, for now this will do.

Modify gen_enum() and gen_enum_lookup() for the same reason.

Suggested-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20181213123724.4866-3-marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Marc-André Lureau 2018-12-13 16:37:04 +04:00 committed by Markus Armbruster
parent 9c2f56e9f9
commit 1962bd39d5
7 changed files with 28 additions and 26 deletions

View File

@ -1063,7 +1063,7 @@ class QAPISchemaVisitor(object):
def visit_builtin_type(self, name, info, json_type): def visit_builtin_type(self, name, info, json_type):
pass pass
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
pass pass
def visit_array_type(self, name, info, ifcond, element_type): def visit_array_type(self, name, info, ifcond, element_type):
@ -1193,7 +1193,7 @@ class QAPISchemaEnumType(QAPISchemaType):
def visit(self, visitor): def visit(self, visitor):
visitor.visit_enum_type(self.name, self.info, self.ifcond, visitor.visit_enum_type(self.name, self.info, self.ifcond,
self.member_names(), self.prefix) self.members, self.prefix)
class QAPISchemaArrayType(QAPISchemaType): class QAPISchemaArrayType(QAPISchemaType):
@ -2012,19 +2012,19 @@ def _wrap_ifcond(ifcond, before, after):
return out return out
def gen_enum_lookup(name, values, prefix=None): def gen_enum_lookup(name, members, prefix=None):
ret = mcgen(''' ret = mcgen('''
const QEnumLookup %(c_name)s_lookup = { const QEnumLookup %(c_name)s_lookup = {
.array = (const char *const[]) { .array = (const char *const[]) {
''', ''',
c_name=c_name(name)) c_name=c_name(name))
for value in values: for m in members:
index = c_enum_const(name, value, prefix) index = c_enum_const(name, m.name, prefix)
ret += mcgen(''' ret += mcgen('''
[%(index)s] = "%(value)s", [%(index)s] = "%(name)s",
''', ''',
index=index, value=value) index=index, name=m.name)
ret += mcgen(''' ret += mcgen('''
}, },
@ -2035,9 +2035,9 @@ const QEnumLookup %(c_name)s_lookup = {
return ret return ret
def gen_enum(name, values, prefix=None): def gen_enum(name, members, prefix=None):
# append automatically generated _MAX value # append automatically generated _MAX value
enum_values = values + ['_MAX'] enum_members = members + [QAPISchemaMember('_MAX')]
ret = mcgen(''' ret = mcgen('''
@ -2045,11 +2045,11 @@ typedef enum %(c_name)s {
''', ''',
c_name=c_name(name)) c_name=c_name(name))
for value in enum_values: for m in enum_members:
ret += mcgen(''' ret += mcgen('''
%(c_enum)s, %(c_enum)s,
''', ''',
c_enum=c_enum_const(name, value, prefix)) c_enum=c_enum_const(name, m.name, prefix))
ret += mcgen(''' ret += mcgen('''
} %(c_name)s; } %(c_name)s;

View File

@ -206,7 +206,7 @@ class QAPISchemaGenDocVisitor(qapi.common.QAPISchemaVisitor):
def write(self, output_dir): def write(self, output_dir):
self._gen.write(output_dir, self._prefix + 'qapi-doc.texi') self._gen.write(output_dir, self._prefix + 'qapi-doc.texi')
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
doc = self.cur_doc doc = self.cur_doc
self._gen.add(TYPE_FMT(type='Enum', self._gen.add(TYPE_FMT(type='Enum',
name=doc.symbol, name=doc.symbol,

View File

@ -143,8 +143,8 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
QAPISchemaModularCVisitor.__init__( QAPISchemaModularCVisitor.__init__(
self, prefix, 'qapi-events', self, prefix, 'qapi-events',
' * Schema-defined QAPI/QMP events', __doc__) ' * Schema-defined QAPI/QMP events', __doc__)
self._enum_name = c_name(prefix + 'QAPIEvent', protect=False) self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
self._event_names = [] self._event_enum_members = []
def _begin_module(self, name): def _begin_module(self, name):
types = self._module_basename('qapi-types', name) types = self._module_basename('qapi-types', name)
@ -170,15 +170,16 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
def visit_end(self): def visit_end(self):
(genc, genh) = self._module[self._main_module] (genc, genh) = self._module[self._main_module]
genh.add(gen_enum(self._enum_name, self._event_names)) genh.add(gen_enum(self._event_enum_name, self._event_enum_members))
genc.add(gen_enum_lookup(self._enum_name, self._event_names)) genc.add(gen_enum_lookup(self._event_enum_name,
self._event_enum_members))
def visit_event(self, name, info, ifcond, arg_type, boxed): def visit_event(self, name, info, ifcond, arg_type, boxed):
with ifcontext(ifcond, self._genh, self._genc): with ifcontext(ifcond, self._genh, self._genc):
self._genh.add(gen_event_send_decl(name, arg_type, boxed)) self._genh.add(gen_event_send_decl(name, arg_type, boxed))
self._genc.add(gen_event_send(name, arg_type, boxed, self._genc.add(gen_event_send(name, arg_type, boxed,
self._enum_name)) self._event_enum_name))
self._event_names.append(name) self._event_enum_members.append(QAPISchemaMember(name))
def gen_events(schema, output_dir, prefix): def gen_events(schema, output_dir, prefix):

View File

@ -174,8 +174,9 @@ const QLitObject %(c_name)s = %(c_string)s;
def visit_builtin_type(self, name, info, json_type): def visit_builtin_type(self, name, info, json_type):
self._gen_qlit(name, 'builtin', {'json-type': json_type}, []) self._gen_qlit(name, 'builtin', {'json-type': json_type}, [])
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
self._gen_qlit(name, 'enum', {'values': values}, ifcond) self._gen_qlit(name, 'enum',
{'values': [m.name for m in members]}, ifcond)
def visit_array_type(self, name, info, ifcond, element_type): def visit_array_type(self, name, info, ifcond, element_type):
element = self._use_type(element_type) element = self._use_type(element_type)

View File

@ -212,10 +212,10 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
self._genh.add(gen_type_cleanup_decl(name)) self._genh.add(gen_type_cleanup_decl(name))
self._genc.add(gen_type_cleanup(name)) self._genc.add(gen_type_cleanup(name))
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
with ifcontext(ifcond, self._genh, self._genc): with ifcontext(ifcond, self._genh, self._genc):
self._genh.preamble_add(gen_enum(name, values, prefix)) self._genh.preamble_add(gen_enum(name, members, prefix))
self._genc.add(gen_enum_lookup(name, values, prefix)) self._genc.add(gen_enum_lookup(name, members, prefix))
def visit_array_type(self, name, info, ifcond, element_type): def visit_array_type(self, name, info, ifcond, element_type):
with ifcontext(ifcond, self._genh, self._genc): with ifcontext(ifcond, self._genh, self._genc):

View File

@ -310,7 +310,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
''', ''',
types=types)) types=types))
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
with ifcontext(ifcond, self._genh, self._genc): with ifcontext(ifcond, self._genh, self._genc):
self._genh.add(gen_visit_decl(name, scalar=True)) self._genh.add(gen_visit_decl(name, scalar=True))
self._genc.add(gen_visit_enum(name)) self._genc.add(gen_visit_enum(name))

View File

@ -23,8 +23,8 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
def visit_include(self, name, info): def visit_include(self, name, info):
print('include %s' % name) print('include %s' % name)
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
print('enum %s %s' % (name, values)) print('enum %s %s' % (name, [m.name for m in members]))
if prefix: if prefix:
print(' prefix %s' % prefix) print(' prefix %s' % prefix)
self._print_if(ifcond) self._print_if(ifcond)