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

qapi: Factor QAPISchemaParser._include() out of .__init__()



Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <1489582656-31133-2-git-send-email-armbru@redhat.com>
parent f880cd6b
Loading
Loading
Loading
Loading
+23 −22
Original line number Diff line number Diff line
@@ -268,44 +268,45 @@ 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)
                self._include(include, info, os.path.dirname(abs_fname),
                              previously_included)
            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]

                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)
                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
            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)
        exprs_include = QAPISchemaParser(fobj, previously_included, info)
        self.exprs.extend(exprs_include.exprs)
        self.docs.extend(exprs_include.docs)
            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]

                self.exprs.append(expr_elem)

    def accept(self, skip_comment=True):
        while True: