提交 e7823a2a 编写于 作者: M Markus Armbruster

qapi: Fix detection of doc / expression mismatch

This fixes the errors uncovered by the previous commit.
Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Message-Id: <1489582656-31133-32-git-send-email-armbru@redhat.com>
上级 2028be8e
......@@ -248,18 +248,21 @@ class QAPISchemaParser(object):
self.line_pos = 0
self.exprs = []
self.docs = []
self.cur_doc = None
self.accept()
while self.tok is not None:
info = {'file': fname, 'line': self.line,
'parent': self.incl_info}
if self.tok == '#':
doc = self.get_doc(info)
self.docs.append(doc)
self.reject_expr_doc()
self.cur_doc = self.get_doc(info)
self.docs.append(self.cur_doc)
continue
expr = self.get_expr(False)
if 'include' in expr:
self.reject_expr_doc()
if len(expr) != 1:
raise QAPISemError(info, "Invalid 'include' directive")
include = expr['include']
......@@ -269,6 +272,7 @@ class QAPISchemaParser(object):
self._include(include, info, os.path.dirname(abs_fname),
previously_included)
elif "pragma" in expr:
self.reject_expr_doc()
if len(expr) != 1:
raise QAPISemError(info, "Invalid 'pragma' directive")
pragma = expr['pragma']
......@@ -280,13 +284,23 @@ class QAPISchemaParser(object):
else:
expr_elem = {'expr': expr,
'info': info}
if (self.docs
and self.docs[-1].info['file'] == fname
and not self.docs[-1].expr):
self.docs[-1].expr = expr
expr_elem['doc'] = self.docs[-1]
if self.cur_doc:
if not self.cur_doc.symbol:
raise QAPISemError(
self.cur_doc.info,
"Expression documentation required")
self.cur_doc.expr = expr
expr_elem['doc'] = self.cur_doc
self.exprs.append(expr_elem)
self.cur_doc = None
self.reject_expr_doc()
def reject_expr_doc(self):
if self.cur_doc and self.cur_doc.symbol:
raise QAPISemError(
self.cur_doc.info,
"Documentation for '%s' is not followed by the definition"
% self.cur_doc.symbol)
def _include(self, include, info, base_dir, previously_included):
incl_abs_fname = os.path.join(base_dir, include)
......@@ -950,11 +964,6 @@ def check_exprs(exprs):
def check_freeform_doc(doc):
if doc.symbol:
raise QAPISemError(doc.info,
"Documention for '%s' is not followed"
" by the definition" % doc.symbol)
body = str(doc.body)
if re.search(r'@\S+:', body, re.MULTILINE):
raise QAPISemError(doc.info,
......
tests/qapi-schema/doc-before-include.json:3: Documentation for 'foo' is not followed by the definition
# Doc comment separated from defining expression by non-defining expression
# BUG: not rejected
##
# @foo:
......
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
prefix QTYPE
object foo
object q_empty
tests/qapi-schema/doc-before-pragma.json:3: Documentation for 'foo' is not followed by the definition
# Doc comment separated from defining expression by non-defining expression
# BUG: not rejected
##
# @foo:
......
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
prefix QTYPE
object foo
object q_empty
tests/qapi-schema/doc-missing-expr.json:3: Documention for 'bar' is not followed by the definition
tests/qapi-schema/doc-missing-expr.json:3: Documentation for 'bar' is not followed by the definition
tests/qapi-schema/doc-no-symbol.json:4: Definition of 'foo' follows documentation for 'None'
tests/qapi-schema/doc-no-symbol.json:3: Expression documentation required
# Documentation for expression lacks symbol
# BUG: Error message claims it has symbol 'None'
##
# foo:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册