Commit e151941d authored by Markus Armbruster's avatar Markus Armbruster
Browse files

qapi: Check feature documentation against the schema



Commit f3ed93d5 "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: default avatarMarkus Armbruster <armbru@redhat.com>
Message-Id: <20191024110237.30963-20-armbru@redhat.com>
parent e4def787
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -555,13 +555,23 @@ 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()

        def check_args_section(args, info, what):
            bogus = [name for name, section in args.items()
                     if not section.member]
            if bogus:
                raise QAPISemError(
@@ -570,3 +580,6 @@ class QAPIDoc(object):
                    % ("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')
+2 −0
Original line number Diff line number Diff line
@@ -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

+1 −0
Original line number Diff line number Diff line
doc-bad-feature.json:3: documented member 'a' does not exist
+0 −1
Original line number Diff line number Diff line
# Features listed in the doc comment must exist in the actual schema
# BUG: nonexistent @a is not rejected

##
# @foo:
+0 −19
Original line number Diff line number Diff line
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
Loading