Skip to content

Commit

Permalink
qapi: Fix detection of doc / expression mismatch
Browse files Browse the repository at this point in the history
This fixes the errors uncovered by the previous commit.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <1489582656-31133-32-git-send-email-armbru@redhat.com>
  • Loading branch information
Markus Armbruster committed Mar 16, 2017
1 parent 2028be8 commit e7823a2
Show file tree
Hide file tree
Showing 12 changed files with 28 additions and 28 deletions.
35 changes: 22 additions & 13 deletions scripts/qapi.py
Expand Up @@ -248,18 +248,21 @@ def __init__(self, fp, previously_included=[], incl_info=None):
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']
Expand All @@ -269,6 +272,7 @@ def __init__(self, fp, previously_included=[], incl_info=None):
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']
Expand All @@ -280,13 +284,23 @@ def __init__(self, fp, previously_included=[], incl_info=None):
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)
Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions tests/qapi-schema/doc-before-include.err
@@ -0,0 +1 @@
tests/qapi-schema/doc-before-include.json:3: Documentation for 'foo' is not followed by the definition
2 changes: 1 addition & 1 deletion tests/qapi-schema/doc-before-include.exit
@@ -1 +1 @@
0
1
1 change: 0 additions & 1 deletion tests/qapi-schema/doc-before-include.json
@@ -1,5 +1,4 @@
# Doc comment separated from defining expression by non-defining expression
# BUG: not rejected

##
# @foo:
Expand Down
4 changes: 0 additions & 4 deletions tests/qapi-schema/doc-before-include.out
@@ -1,4 +0,0 @@
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
prefix QTYPE
object foo
object q_empty
1 change: 1 addition & 0 deletions tests/qapi-schema/doc-before-pragma.err
@@ -0,0 +1 @@
tests/qapi-schema/doc-before-pragma.json:3: Documentation for 'foo' is not followed by the definition
2 changes: 1 addition & 1 deletion tests/qapi-schema/doc-before-pragma.exit
@@ -1 +1 @@
0
1
1 change: 0 additions & 1 deletion tests/qapi-schema/doc-before-pragma.json
@@ -1,5 +1,4 @@
# Doc comment separated from defining expression by non-defining expression
# BUG: not rejected

##
# @foo:
Expand Down
4 changes: 0 additions & 4 deletions tests/qapi-schema/doc-before-pragma.out
@@ -1,4 +0,0 @@
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
prefix QTYPE
object foo
object q_empty
2 changes: 1 addition & 1 deletion tests/qapi-schema/doc-missing-expr.err
@@ -1 +1 @@
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
2 changes: 1 addition & 1 deletion tests/qapi-schema/doc-no-symbol.err
@@ -1 +1 @@
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
1 change: 0 additions & 1 deletion tests/qapi-schema/doc-no-symbol.json
@@ -1,5 +1,4 @@
# Documentation for expression lacks symbol
# BUG: Error message claims it has symbol 'None'

##
# foo:
Expand Down

0 comments on commit e7823a2

Please sign in to comment.