aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2017-03-15 13:56:50 +0100
committerMarkus Armbruster <armbru@redhat.com>2017-03-16 07:13:01 +0100
commite04dea88727c2ac97091333ac8be6af5952634a7 (patch)
treec014ae9e4e7148383032abfede04076f64fd670e
parentf880cd6b6f3fe7847cde3bec1fa98891c92229d2 (diff)
qapi: Factor QAPISchemaParser._include() out of .__init__()
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <1489582656-31133-2-git-send-email-armbru@redhat.com>
-rw-r--r--scripts/qapi.py45
1 files changed, 23 insertions, 22 deletions
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 53a44779d0..345cde157e 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -268,34 +268,15 @@ class QAPISchemaParser(object):
continue
expr = self.get_expr(False)
- if isinstance(expr, dict) and "include" in expr:
+ if 'include' in expr:
if len(expr) != 1:
raise QAPISemError(info, "Invalid 'include' directive")
include = expr["include"]
if not isinstance(include, str):
raise QAPISemError(info,
"Value of 'include' must be a string")
- incl_abs_fname = os.path.join(os.path.dirname(abs_fname),
- include)
- # catch inclusion cycle
- inf = info
- while inf:
- if incl_abs_fname == os.path.abspath(inf['file']):
- raise QAPISemError(info, "Inclusion loop for %s"
- % include)
- inf = inf['parent']
-
- # skip multiple include of the same file
- if incl_abs_fname in previously_included:
- continue
- try:
- fobj = open(incl_abs_fname, 'r')
- except IOError as e:
- raise QAPISemError(info, '%s: %s' % (e.strerror, include))
- exprs_include = QAPISchemaParser(fobj, previously_included,
- info)
- self.exprs.extend(exprs_include.exprs)
- self.docs.extend(exprs_include.docs)
+ self._include(include, info, os.path.dirname(abs_fname),
+ previously_included)
else:
expr_elem = {'expr': expr,
'info': info}
@@ -307,6 +288,26 @@ class QAPISchemaParser(object):
self.exprs.append(expr_elem)
+ def _include(self, include, info, base_dir, previously_included):
+ incl_abs_fname = os.path.join(base_dir, include)
+ # catch inclusion cycle
+ inf = info
+ while inf:
+ if incl_abs_fname == os.path.abspath(inf['file']):
+ raise QAPISemError(info, "Inclusion loop for %s" % include)
+ inf = inf['parent']
+
+ # skip multiple include of the same file
+ if incl_abs_fname in previously_included:
+ return
+ try:
+ fobj = open(incl_abs_fname, 'r')
+ except IOError as e:
+ raise QAPISemError(info, '%s: %s' % (e.strerror, include))
+ exprs_include = QAPISchemaParser(fobj, previously_included, info)
+ self.exprs.extend(exprs_include.exprs)
+ self.docs.extend(exprs_include.docs)
+
def accept(self, skip_comment=True):
while True:
self.tok = self.src[self.cursor]