From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com
Subject: [Qemu-devel] [PATCH v8 06/22] qapi: add a dictionary form with 'name' key for enum members
Date: Thu, 13 Dec 2018 16:37:08 +0400 [thread overview]
Message-ID: <20181213123724.4866-7-marcandre.lureau@redhat.com> (raw)
In-Reply-To: <20181213123724.4866-1-marcandre.lureau@redhat.com>
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.lureau@redhat.com>
---
scripts/qapi/common.py | 38 +++++++++++++++----
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, 40 insertions(+), 12 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
index f205805751..bb928d2f7d 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -740,6 +740,10 @@ def check_event(expr, info):
allow_metas=meta)
+def enum_get_names(expr):
+ return [e['name'] for e in expr['data']]
+
+
def check_union(expr, info):
name = expr['union']
base = expr.get('base')
@@ -799,7 +803,7 @@ def check_union(expr, info):
# If the discriminator names an enum type, then all members
# of 'data' must also be members of the enum type.
if enum_define:
- if key not in enum_define['data']:
+ if key not in enum_get_names(enum_define):
raise QAPISemError(info,
"Discriminator value '%s' is not found in "
"enum '%s'"
@@ -831,7 +835,7 @@ def check_alternate(expr, info):
if qtype == 'QTYPE_QSTRING':
enum_expr = enum_types.get(value)
if enum_expr:
- for v in enum_expr['data']:
+ for v in enum_get_names(enum_expr):
if v in ['on', 'off']:
conflicting.add('QTYPE_QBOOL')
if re.match(r'[-+0-9.]', v): # lazy, could be tightened
@@ -847,19 +851,29 @@ def check_alternate(expr, info):
types_seen[qt] = key
+def normalize_enum(expr):
+ if isinstance(expr['data'], list):
+ expr['data'] = [m if isinstance(m, dict) else {'name': m}
+ for m in expr['data']]
+
+
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)
+
for member in members:
- check_name(info, "Member of enum '%s'" % name, member,
+ source = "dictionary member of enum '%s'" % name
+ check_known_keys(info, source, member, ['name'], [])
+ check_name(info, "Member of enum '%s'" % name, member['name'],
enum_member=True)
@@ -937,6 +951,7 @@ def check_exprs(exprs):
if 'enum' in expr:
meta = 'enum'
check_keys(expr_elem, 'enum', ['data'], ['if', 'prefix'])
+ normalize_enum(expr)
enum_types[expr[meta]] = expr
elif 'union' in expr:
meta = 'union'
@@ -1640,7 +1655,14 @@ class QAPISchema(object):
qtype_values, 'QTYPE'))
def _make_enum_members(self, values):
- return [QAPISchemaMember(v) for v in values]
+ enum = []
+ for v in values:
+ if isinstance(v, dict):
+ name = v['name']
+ else:
+ name = v
+ enum.append(QAPISchemaMember(name))
+ return enum
def _make_implicit_enum_type(self, name, info, ifcond, values):
# See also QAPISchemaObjectTypeMember._pretty_owner()
diff --git a/tests/Makefile.include b/tests/Makefile.include
index fb0b449c02..2e894c1037 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -379,10 +379,11 @@ qapi-schema += double-data.json
qapi-schema += double-type.json
qapi-schema += duplicate-key.json
qapi-schema += empty.json
+qapi-schema += enum-bad-member.json
qapi-schema += enum-bad-name.json
qapi-schema += enum-bad-prefix.json
qapi-schema += enum-clash-member.json
-qapi-schema += enum-dict-member.json
+qapi-schema += enum-dict-member-unknown.json
qapi-schema += enum-int-member.json
qapi-schema += enum-member-case.json
qapi-schema += enum-missing-data.json
diff --git a/tests/qapi-schema/enum-bad-member.err b/tests/qapi-schema/enum-bad-member.err
new file mode 100644
index 0000000000..211db9e6fc
--- /dev/null
+++ b/tests/qapi-schema/enum-bad-member.err
@@ -0,0 +1 @@
+tests/qapi-schema/enum-bad-member.json:2: Member of enum 'MyEnum' requires a string name
diff --git a/tests/qapi-schema/enum-dict-member.exit b/tests/qapi-schema/enum-bad-member.exit
similarity index 100%
rename from tests/qapi-schema/enum-dict-member.exit
rename to tests/qapi-schema/enum-bad-member.exit
diff --git a/tests/qapi-schema/enum-bad-member.json b/tests/qapi-schema/enum-bad-member.json
new file mode 100644
index 0000000000..98da6828b4
--- /dev/null
+++ b/tests/qapi-schema/enum-bad-member.json
@@ -0,0 +1,2 @@
+# we reject any enum member that is not a string
+{ 'enum': 'MyEnum', 'data': [ [ ] ] }
diff --git a/tests/qapi-schema/enum-dict-member.out b/tests/qapi-schema/enum-bad-member.out
similarity index 100%
rename from tests/qapi-schema/enum-dict-member.out
rename to tests/qapi-schema/enum-bad-member.out
diff --git a/tests/qapi-schema/enum-dict-member-unknown.err b/tests/qapi-schema/enum-dict-member-unknown.err
new file mode 100644
index 0000000000..76bd0471db
--- /dev/null
+++ b/tests/qapi-schema/enum-dict-member-unknown.err
@@ -0,0 +1,2 @@
+tests/qapi-schema/enum-dict-member-unknown.json:2: Unknown key 'bad-key' in dictionary member of enum 'MyEnum'
+Valid keys are 'name'.
diff --git a/tests/qapi-schema/enum-dict-member-unknown.exit b/tests/qapi-schema/enum-dict-member-unknown.exit
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/qapi-schema/enum-dict-member-unknown.exit
@@ -0,0 +1 @@
+1
diff --git a/tests/qapi-schema/enum-dict-member-unknown.json b/tests/qapi-schema/enum-dict-member-unknown.json
new file mode 100644
index 0000000000..6664c59201
--- /dev/null
+++ b/tests/qapi-schema/enum-dict-member-unknown.json
@@ -0,0 +1,2 @@
+# we reject any enum member that is not a string or a dict with 'name'
+{ 'enum': 'MyEnum', 'data': [ { 'name': 'foo', 'bad-key': 'str' } ] }
diff --git a/tests/qapi-schema/enum-dict-member-unknown.out b/tests/qapi-schema/enum-dict-member-unknown.out
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/qapi-schema/enum-dict-member.err b/tests/qapi-schema/enum-dict-member.err
deleted file mode 100644
index 8ca146ea59..0000000000
--- a/tests/qapi-schema/enum-dict-member.err
+++ /dev/null
@@ -1 +0,0 @@
-tests/qapi-schema/enum-dict-member.json:2: Member of enum 'MyEnum' requires a string name
diff --git a/tests/qapi-schema/enum-dict-member.json b/tests/qapi-schema/enum-dict-member.json
deleted file mode 100644
index 79672e0f09..0000000000
--- a/tests/qapi-schema/enum-dict-member.json
+++ /dev/null
@@ -1,2 +0,0 @@
-# we reject any enum member that is not a string
-{ 'enum': 'MyEnum', 'data': [ { 'value': 'str' } ] }
--
2.20.0
next prev parent reply other threads:[~2018-12-13 12:38 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-13 12:37 [Qemu-devel] [PATCH v8 00/22] qapi: add #if pre-processor conditions to generated code (part 2) Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 01/22] qapi: Do not define enumeration value explicitly Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 02/22] qapi: change enum visitor and gen_enum* to take QAPISchemaMember Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 03/22] tests: print enum type members more like object type members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 04/22] qapi: factor out checking for keys Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 05/22] qapi: improve reporting of unknown or missing keys Marc-André Lureau
2018-12-13 12:37 ` Marc-André Lureau [this message]
2018-12-13 13:23 ` [Qemu-devel] [PATCH v8 06/22] qapi: add a dictionary form with 'name' key for enum members Markus Armbruster
2018-12-13 14:32 ` Markus Armbruster
2018-12-13 14:35 ` Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 07/22] qapi: pass long form enum to make_enum_members Marc-André Lureau
2018-12-13 14:29 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 08/22] qapi: simplify make_enum_members() Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 09/22] qapi: add 'if' to enum members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 10/22] qapi-events: add 'if' condition to implicit event enum Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 11/22] qapi: rename allow_dict to allow_implicit Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 12/22] qapi: add a dictionary form for TYPE Marc-André Lureau
2018-12-13 13:31 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 13/22] qapi: add 'if' to implicit struct members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 14/22] qapi: add an error in case a discriminator is conditional Marc-André Lureau
2018-12-13 13:34 ` Markus Armbruster
2018-12-13 15:45 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 15/22] qapi: add 'if' to union members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 16/22] qapi: add 'if' to alternate members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 17/22] qapi: add #if conditions to generated code members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 18/22] qapi: add 'If:' condition to enum values documentation Marc-André Lureau
2018-12-13 14:03 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 19/22] qapi: add 'If:' condition to struct members documentation Marc-André Lureau
2018-12-13 14:05 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 20/22] qapi: add condition to variants documentation Marc-André Lureau
2018-12-13 14:06 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 21/22] qapi: add more conditions to SPICE Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 22/22] qapi: add conditions to REPLICATION type/commands on the schema Marc-André Lureau
2018-12-13 14:47 ` [Qemu-devel] [PATCH v8 00/22] qapi: add #if pre-processor conditions to generated code (part 2) Markus Armbruster
2018-12-13 14:52 ` Marc-André Lureau
2018-12-13 16:52 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181213123724.4866-7-marcandre.lureau@redhat.com \
--to=marcandre.lureau@redhat.com \
--cc=armbru@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).