aboutsummaryrefslogtreecommitdiff
path: root/scripts/qapi/common.py
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2019-09-27 15:46:20 +0200
committerMarkus Armbruster <armbru@redhat.com>2019-09-28 17:17:18 +0200
commit481a6bd15c4fb99429c3337584c66b40384cb09c (patch)
tree8c8a90d63b63ac65eb526cefb3b75e4c115f63b5 /scripts/qapi/common.py
parent2ab218aad6e2ddf4e95a7d583492ad7142927ca5 (diff)
qapi: Improve reporting of member name clashes
We report name clashes like this: struct-base-clash.json: In struct 'Sub': struct-base-clash.json:5: 'name' (member of Sub) collides with 'name' (member of Base) The "(member of Sub)" is redundant with "In struct 'Sub'". Comes from QAPISchemaMember.describe(). Pass info to it, so it can detect the redundancy and avoid it. Result: struct-base-clash.json: In struct 'Sub': struct-base-clash.json:5: member 'name' collides with member 'name' of type 'Base' Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20190927134639.4284-8-armbru@redhat.com>
Diffstat (limited to 'scripts/qapi/common.py')
-rw-r--r--scripts/qapi/common.py36
1 files changed, 23 insertions, 13 deletions
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 3d73332487..14d1e34c2c 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -1575,31 +1575,41 @@ class QAPISchemaMember(object):
def check_clash(self, info, seen):
cname = c_name(self.name)
if cname in seen:
- raise QAPISemError(info, "%s collides with %s" %
- (self.describe(), seen[cname].describe()))
+ raise QAPISemError(
+ info,
+ "%s collides with %s"
+ % (self.describe(info), seen[cname].describe(info)))
seen[cname] = self
- def _pretty_defined_in(self):
+ def describe(self, info):
+ role = self.role
defined_in = self.defined_in
+ assert defined_in
+
if defined_in.startswith('q_obj_'):
# See QAPISchema._make_implicit_object_type() - reverse the
# mapping there to create a nice human-readable description
defined_in = defined_in[6:]
if defined_in.endswith('-arg'):
- return '(parameter of %s)' % defined_in[:-4]
+ # Implicit type created for a command's dict 'data'
+ assert role == 'member'
+ role = 'parameter'
elif defined_in.endswith('-base'):
- return '(base of %s)' % defined_in[:-5]
+ # Implicit type created for a flat union's dict 'base'
+ role = 'base ' + role
else:
+ # Implicit type created for a simple union's branch
assert defined_in.endswith('-wrapper')
# Unreachable and not implemented
assert False
- if defined_in.endswith('Kind'):
+ elif defined_in.endswith('Kind'):
# See QAPISchema._make_implicit_enum_type()
- return '(branch of %s)' % defined_in[:-4]
- return '(%s of %s)' % (self.role, defined_in)
-
- def describe(self):
- return "'%s' %s" % (self.name, self._pretty_defined_in())
+ # Implicit enum created for simple union's branches
+ assert role == 'value'
+ role = 'branch'
+ elif defined_in != info.defn_name:
+ return "%s '%s' of type '%s'" % (role, self.name, defined_in)
+ return "%s '%s'" % (role, self.name)
class QAPISchemaEnumMember(QAPISchemaMember):
@@ -1871,7 +1881,7 @@ class QAPISchema(object):
for v in values]
def _make_implicit_enum_type(self, name, info, ifcond, values):
- # See also QAPISchemaObjectTypeMember._pretty_defined_in()
+ # See also QAPISchemaObjectTypeMember.describe()
name = name + 'Kind' # Use namespace reserved by add_name()
self._def_entity(QAPISchemaEnumType(
name, info, None, ifcond, self._make_enum_members(values), None))
@@ -1887,7 +1897,7 @@ class QAPISchema(object):
role, members):
if not members:
return None
- # See also QAPISchemaObjectTypeMember._pretty_defined_in()
+ # See also QAPISchemaObjectTypeMember.describe()
name = 'q_obj_%s-%s' % (name, role)
typ = self.lookup_entity(name, QAPISchemaObjectType)
if typ: