qapi: Check feature documentation against the schema

Commit f3ed93d545 "qapi: Allow documentation for features" neglected
to check documentation against the schema.  Fix that: check them the
same way we check arguments.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20191024110237.30963-20-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2019-10-24 13:02:37 +02:00
parent e4def78755
commit e151941d1b
8 changed files with 27 additions and 51 deletions

View File

@ -555,18 +555,31 @@ class QAPIDoc(object):
self.args[member.name] = QAPIDoc.ArgSection(member.name)
self.args[member.name].connect(member)
def connect_feature(self, feature):
if feature.name not in self.features:
raise QAPISemError(feature.info,
"feature '%s' lacks documentation"
% feature.name)
self.features[feature.name] = QAPIDoc.ArgSection(feature.name)
self.features[feature.name].connect(feature)
def check_expr(self, expr):
if self.has_section('Returns') and 'command' not in expr:
raise QAPISemError(self.info,
"'Returns:' is only valid for commands")
def check(self):
bogus = [name for name, section in self.args.items()
if not section.member]
if bogus:
raise QAPISemError(
self.info,
"documented member%s '%s' %s not exist"
% ("s" if len(bogus) > 1 else "",
"', '".join(bogus),
"do" if len(bogus) > 1 else "does"))
def check_args_section(args, info, what):
bogus = [name for name, section in args.items()
if not section.member]
if bogus:
raise QAPISemError(
self.info,
"documented member%s '%s' %s not exist"
% ("s" if len(bogus) > 1 else "",
"', '".join(bogus),
"do" if len(bogus) > 1 else "does"))
check_args_section(self.args, self.info, 'members')
check_args_section(self.features, self.info, 'features')

View File

@ -56,6 +56,8 @@ class QAPISchemaEntity(object):
seen = {}
for f in self.features:
f.check_clash(self.info, seen)
if self.doc:
self.doc.connect_feature(f)
self._checked = True

View File

@ -0,0 +1 @@
doc-bad-feature.json:3: documented member 'a' does not exist

View File

@ -1,5 +1,4 @@
# Features listed in the doc comment must exist in the actual schema
# BUG: nonexistent @a is not rejected
##
# @foo:

View File

@ -1,19 +0,0 @@
module None
object q_empty
enum QType
prefix QTYPE
member none
member qnull
member qnum
member qstring
member qdict
member qlist
member qbool
module doc-bad-feature.json
command foo None -> None
gen=True success_response=True boxed=False oob=False preconfig=False
doc symbol=foo
body=
feature=a
a

View File

@ -0,0 +1,2 @@
doc-undoc-feature.json: In command 'foo':
doc-undoc-feature.json:9: feature 'undoc' lacks documentation

View File

@ -1,5 +1,4 @@
# Doc comment must cover all features
# BUG: missing documentation for @undoc not caught
##
# @foo:

View File

@ -1,21 +0,0 @@
module None
object q_empty
enum QType
prefix QTYPE
member none
member qnull
member qnum
member qstring
member qdict
member qlist
member qbool
module doc-undoc-feature.json
command foo None -> None
gen=True success_response=True boxed=False oob=False preconfig=False
feature undoc
feature doc
doc symbol=foo
body=
feature=doc
documented feature