Commit 97f02494 authored by Markus Armbruster's avatar Markus Armbruster Committed by Eric Blake
Browse files

qapi: Record 'include' directives in parse tree



The parse tree is a list of expressions.  Except include expressions
currently get replaced by the included file's parse tree.

Instead of throwing away the include expression, keep it with the file
name expanded so you don't have to track the including file's
directory to make sense of it.

A future commit will put this include expression to use.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20180211093607.27351-16-armbru@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
[eblake: fix check of expr after assignment]
Signed-off-by: default avatarEric Blake <eblake@redhat.com>
parent 42570530
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -290,8 +290,11 @@ class QAPISchemaParser(object):
                if not isinstance(include, str):
                    raise QAPISemError(info,
                                       "Value of 'include' must be a string")
                exprs_include = self._include(include, info,
                                              os.path.dirname(self.fname),
                incl_fname = os.path.join(os.path.dirname(self.fname),
                                          include)
                self.exprs.append({'expr': {'include': incl_fname},
                                   'info': info})
                exprs_include = self._include(include, info, incl_fname,
                                              previously_included)
                if exprs_include:
                    self.exprs.extend(exprs_include.exprs)
@@ -326,8 +329,7 @@ class QAPISchemaParser(object):
                "Documentation for '%s' is not followed by the definition"
                % doc.symbol)

    def _include(self, include, info, base_dir, previously_included):
        incl_fname = os.path.join(base_dir, include)
    def _include(self, include, info, incl_fname, previously_included):
        incl_abs_fname = os.path.abspath(incl_fname)
        # catch inclusion cycle
        inf = info
@@ -893,6 +895,9 @@ def check_exprs(exprs):
        info = expr_elem['info']
        doc = expr_elem.get('doc')

        if 'include' in expr:
            continue

        if not doc and doc_required:
            raise QAPISemError(info,
                               "Expression missing documentation comment")
@@ -932,6 +937,9 @@ def check_exprs(exprs):
    # Try again for hidden UnionKind enum
    for expr_elem in exprs:
        expr = expr_elem['expr']

        if 'include' in expr:
            continue
        if 'union' in expr and not discriminator_find_enum_define(expr):
            name = '%sKind' % expr['union']
        elif 'alternate' in expr:
@@ -947,6 +955,8 @@ def check_exprs(exprs):
        info = expr_elem['info']
        doc = expr_elem.get('doc')

        if 'include' in expr:
            continue
        if 'enum' in expr:
            check_enum(expr, info)
        elif 'union' in expr:
@@ -1667,6 +1677,8 @@ class QAPISchema(object):
                self._def_command(expr, info, doc)
            elif 'event' in expr:
                self._def_event(expr, info, doc)
            elif 'include' in expr:
                pass
            else:
                assert False