mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 11:23:43 +08:00
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>
This commit is contained in:
parent
7ce54db230
commit
1e148b545f
@ -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)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user