mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 12:23:53 -06:00
qapi: Fix doc comment checking for commands and events
When a command's 'data' is an object, its doc comment describes the arguments defined there. When 'data' names a type, the doc comment does not describe arguments. Instead, the doc generator inserts a pointer to the named type. An event's doc comment works the same. We don't actually check doc comments for commands and events. Instead, QAPISchema._def_command() forwards the doc comment to the implicit argument type, where it gets checked. Works because the check only cares for the implicit argument type's members. Not only is this needlessly hard to understand, it actually falls apart in two cases: * When 'data' is empty, there is nothing to forward to, and the doc comment remains unchecked. Demonstrated by test doc-bad-event-arg. * When 'data' names a type, we can't forward, as the type has its own doc comment. The command or event's doc comment remains unchecked. Demonstrated by test doc-bad-boxed-command-arg. The forwarding goes back to commit069fb5b250
"qapi: Prepare for requiring more complete documentation", put to use in commit816a57cd6e
"qapi: Fix detection of bogus member documentation". That fix was incomplete. To fix this, make QAPISchemaCommand and QAPISchemaEvent check doc comments, and drop the forwarding of doc comments to implicit argument types. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20191024110237.30963-12-armbru@redhat.com>
This commit is contained in:
parent
7faefad184
commit
bf83f04e13
9 changed files with 25 additions and 51 deletions
|
@ -739,6 +739,16 @@ class QAPISchemaCommand(QAPISchemaEntity):
|
|||
for f in self.features:
|
||||
f.check_clash(self.info, seen)
|
||||
|
||||
def connect_doc(self, doc=None):
|
||||
doc = doc or self.doc
|
||||
if doc:
|
||||
if self.arg_type and self.arg_type.is_implicit():
|
||||
self.arg_type.connect_doc(doc)
|
||||
|
||||
def check_doc(self):
|
||||
if self.doc:
|
||||
self.doc.check()
|
||||
|
||||
def visit(self, visitor):
|
||||
QAPISchemaEntity.visit(self, visitor)
|
||||
visitor.visit_command(self.name, self.info, self.ifcond,
|
||||
|
@ -775,6 +785,16 @@ class QAPISchemaEvent(QAPISchemaEntity):
|
|||
"event's 'data' can take %s only with 'boxed': true"
|
||||
% self.arg_type.describe())
|
||||
|
||||
def connect_doc(self, doc=None):
|
||||
doc = doc or self.doc
|
||||
if doc:
|
||||
if self.arg_type and self.arg_type.is_implicit():
|
||||
self.arg_type.connect_doc(doc)
|
||||
|
||||
def check_doc(self):
|
||||
if self.doc:
|
||||
self.doc.check()
|
||||
|
||||
def visit(self, visitor):
|
||||
QAPISchemaEntity.visit(self, visitor)
|
||||
visitor.visit_event(self.name, self.info, self.ifcond,
|
||||
|
@ -1026,7 +1046,7 @@ class QAPISchema(object):
|
|||
features = expr.get('features', [])
|
||||
if isinstance(data, OrderedDict):
|
||||
data = self._make_implicit_object_type(
|
||||
name, info, doc, ifcond, 'arg', self._make_members(data, info))
|
||||
name, info, None, ifcond, 'arg', self._make_members(data, info))
|
||||
if isinstance(rets, list):
|
||||
assert len(rets) == 1
|
||||
rets = self._make_array_type(rets[0], info)
|
||||
|
@ -1042,7 +1062,7 @@ class QAPISchema(object):
|
|||
ifcond = expr.get('if')
|
||||
if isinstance(data, OrderedDict):
|
||||
data = self._make_implicit_object_type(
|
||||
name, info, doc, ifcond, 'arg', self._make_members(data, info))
|
||||
name, info, None, ifcond, 'arg', self._make_members(data, info))
|
||||
self._def_entity(QAPISchemaEvent(name, info, doc, ifcond, data, boxed))
|
||||
|
||||
def _def_exprs(self, exprs):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue