aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2023-04-25 15:10:28 +0200
committerMarkus Armbruster <armbru@redhat.com>2023-04-26 07:52:14 +0200
commit1e148b545fccc2a83a57269849de9a21e11c17da (patch)
tree9d2dfeedfe6cccdec17fe319b7b3321cebd2d4bd
parent7ce54db23048bfcc3ea6821525bf333b715c7655 (diff)
downloadqemu-1e148b545fccc2a83a57269849de9a21e11c17da.zip
qemu-1e148b545fccc2a83a57269849de9a21e11c17da.tar.gz
qemu-1e148b545fccc2a83a57269849de9a21e11c17da.tar.bz2
qapi: Improve specificity of type/member descriptions
Error messages describe object members, enumeration values, features, and variants like ROLE 'NAME', where ROLE is "member", "value", "feature", or "branch", respectively. When the member is defined in another type, e.g. inherited from a base type, we add "of type 'TYPE'". Example: test case struct-base-clash-deep reports a member of type 'Sub' clashing with a member of its base type 'Base' as struct-base-clash-deep.json: In struct 'Sub': struct-base-clash-deep.json:10: member 'name' collides with member 'name' of type 'Base' Members of implicitly defined types need special treatment. We don't want to add "of type 'TYPE'" for them, because their named are made up and mean nothing to the user. Instead, we describe members of an implicitly defined base type as "base member 'NAME'", and command and event parameters as "parameter 'NAME'". Example: test case union-bad-base reports member of a variant's type clashing with a member of its implicitly defined base type as union-bad-base.json: In union 'TestUnion': union-bad-base.json:8: member 'string' of type 'TestTypeA' collides with base member 'string' The next commit will permit unions as variant types. "base member 'NAME' would then be ambigious: is it the union's base, or is it the union's variant's base? One of its test cases would report a clash between two such bases as "base member 'type' collides with base member 'type'". Confusing. Refine the special treatment: add "of TYPE" even for implicitly defined types, but massage TYPE and ROLE so they make sense for the user. Message-Id: <20230420102619.348173-3-berrange@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
-rw-r--r--scripts/qapi/schema.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 8f31f88..27e3365 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -701,6 +701,7 @@ class QAPISchemaMember:
def describe(self, info):
role = self.role
+ meta = 'type'
defined_in = self.defined_in
assert defined_in
@@ -712,13 +713,17 @@ class QAPISchemaMember:
# Implicit type created for a command's dict 'data'
assert role == 'member'
role = 'parameter'
+ meta = 'command'
+ defined_in = defined_in[:-4]
elif defined_in.endswith('-base'):
# Implicit type created for a union's dict 'base'
role = 'base ' + role
+ defined_in = defined_in[:-5]
else:
assert False
- elif defined_in != info.defn_name:
- return "%s '%s' of type '%s'" % (role, self.name, defined_in)
+
+ if defined_in != info.defn_name:
+ return "%s '%s' of %s '%s'" % (role, self.name, meta, defined_in)
return "%s '%s'" % (role, self.name)