One more thing...
Markus Armbruster <arm...@redhat.com> writes:
> Marc-André Lureau <marcandre.lur...@redhat.com> writes:
>
>> Desugar the enum NAME form to { 'name': NAME }. This will allow to add
>> new enum members, such as 'if' in the following patch.
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
>> ---
>> scripts/qapi/common.py | 49 ++++++++++++++++---
>> tests/Makefile.include | 3 +-
>> tests/qapi-schema/enum-bad-member.err | 1 +
>> ...-dict-member.exit => enum-bad-member.exit} | 0
>> tests/qapi-schema/enum-bad-member.json | 2 +
>> ...um-dict-member.out => enum-bad-member.out} | 0
>> .../qapi-schema/enum-dict-member-unknown.err | 2 +
>> .../qapi-schema/enum-dict-member-unknown.exit | 1 +
>> .../qapi-schema/enum-dict-member-unknown.json | 2 +
>> .../qapi-schema/enum-dict-member-unknown.out | 0
>> tests/qapi-schema/enum-dict-member.err | 1 -
>> tests/qapi-schema/enum-dict-member.json | 2 -
>> 12 files changed, 52 insertions(+), 11 deletions(-)
>> create mode 100644 tests/qapi-schema/enum-bad-member.err
>> rename tests/qapi-schema/{enum-dict-member.exit => enum-bad-member.exit}
>> (100%)
>> create mode 100644 tests/qapi-schema/enum-bad-member.json
>> rename tests/qapi-schema/{enum-dict-member.out => enum-bad-member.out}
>> (100%)
>> create mode 100644 tests/qapi-schema/enum-dict-member-unknown.err
>> create mode 100644 tests/qapi-schema/enum-dict-member-unknown.exit
>> create mode 100644 tests/qapi-schema/enum-dict-member-unknown.json
>> create mode 100644 tests/qapi-schema/enum-dict-member-unknown.out
>> delete mode 100644 tests/qapi-schema/enum-dict-member.err
>> delete mode 100644 tests/qapi-schema/enum-dict-member.json
>>
>> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
[...]
>> @@ -847,18 +851,32 @@ def check_alternate(expr, info):
>> types_seen[qt] = key
>>
>>
>> +def normalize_enum(expr):
>> + members = expr['data']
>> +
>> + # translate short member form to dict form
>> + expr['data'] = [m if isinstance(m, dict) else {'name': m} for m in
>> members]
>> +
>> +
>> def check_enum(expr, info):
>> name = expr['enum']
>> - members = expr.get('data')
>> + members = expr['data']
>> prefix = expr.get('prefix')
>>
>> - if not isinstance(members, list):
>> - raise QAPISemError(info,
>> - "Enum '%s' requires an array for 'data'" % name)
>> if prefix is not None and not isinstance(prefix, str):
>> raise QAPISemError(info,
>> "Enum '%s' requires a string for 'prefix'" %
>> name)
>> +
>> + if not isinstance(members, list):
>> + raise QAPISemError(info,
>> + "Enum '%s' requires an array for 'data'" % name)
>> +
>
> Did you move this check down intentionally?
>
>> for member in members:
>> + if isinstance(member, dict):
>> + source = "dictionary member of enum '%s'" % name
>> + check_known_keys(info, source, member, ['name'], [])
>> + member = member['name']
>> +
>> check_name(info, "Member of enum '%s'" % name, member,
>> enum_member=True)
>
> Again, slightly more complicated than v6 because it now runs before
> normalization. We'll revisit this at [*] below.
If we keep it this way, then let's at least avoid assigning to the loop
control variable:
member_name = member['name']
else:
member_name = member
check_name(info, "Member of enum '%s'" % name, member_name,
enum_member=True)
[...]