Commit 56a46895 authored by Markus Armbruster's avatar Markus Armbruster
Browse files

qapi: Fix array first used in a different module



We generally put implicitly defined types in whatever module triggered
their definition.  This is wrong for array types, as the included test
case demonstrates.  Let's have a closer look at it.

Type 'Status' is defined sub-sub-module.json.  Array type ['Status']
occurs in main module qapi-schema-test.json and in
include/sub-module.json.  The main module's use is first, so the array
type gets put into the main module.

The generated C headers define StatusList in qapi-types.h.  But
include/qapi-types-sub-module.h uses it without including
qapi-types.h.  Oops.

To fix that, put the array type into its element type's module.

Now StatusList gets generated into qapi-types-sub-module.h, which all
its users include.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Message-Id: <20190301154051.23317-8-armbru@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
parent 5e12eb98
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -1089,6 +1089,9 @@ class QAPISchemaEntity(object):
            self.ifcond = typ.ifcond
        else:
            self.ifcond = listify_cond(self._ifcond)
        if self.info:
            self.module = os.path.relpath(self.info['file'],
                                          os.path.dirname(schema.fname))

    def is_implicit(self):
        return not self.info
@@ -1262,6 +1265,7 @@ class QAPISchemaArrayType(QAPISchemaType):
        self.element_type = schema.lookup_type(self._element_type_name)
        assert self.element_type
        self.element_type.check(schema)
        self.module = self.element_type.module
        self.ifcond = self.element_type.ifcond

    def is_implicit(self):
@@ -1603,7 +1607,7 @@ class QAPISchemaEvent(QAPISchemaEntity):

class QAPISchema(object):
    def __init__(self, fname):
        self._fname = fname
        self.fname = fname
        if sys.version_info[0] >= 3:
            f = open(fname, 'r', encoding='utf-8')
        else:
@@ -1626,9 +1630,6 @@ class QAPISchema(object):
        self._entity_list.append(ent)
        if ent.name is not None:
            self._entity_dict[ent.name] = ent
        if ent.info:
            ent.module = os.path.relpath(ent.info['file'],
                                         os.path.dirname(self._fname))

    def lookup_entity(self, name, typ=None):
        ent = self._entity_dict.get(name)
+2 −0
Original line number Diff line number Diff line
@@ -3,3 +3,5 @@
# Sub-module of ../qapi-schema-test.json

{ 'include': '../sub-sub-module.json' }

{ 'struct': 'SecondArrayRef', 'data': { 's': ['Status'] } }
+5 −0
Original line number Diff line number Diff line
@@ -144,7 +144,9 @@ object q_obj_sizeList-wrapper
    member data: sizeList optional=False
object q_obj_anyList-wrapper
    member data: anyList optional=False
module sub-sub-module.json
array StatusList Status
module qapi-schema-test.json
object q_obj_StatusList-wrapper
    member data: StatusList optional=False
enum UserDefListUnionKind
@@ -189,6 +191,9 @@ enum Status
    member good
    member bad
    member ugly
module include/sub-module.json
object SecondArrayRef
    member s: StatusList optional=False
module qapi-schema-test.json
command user_def_cmd None -> None
   gen=True success_response=True boxed=False oob=False preconfig=False