[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 5/6] qapi: Fix code generation for empty modules
From: |
Markus Armbruster |
Subject: |
[PATCH 5/6] qapi: Fix code generation for empty modules |
Date: |
Wed, 20 Nov 2019 19:25:50 +0100 |
When a sub-module doesn't contain any definitions, we don't generate
code for it, but we do generate the #include.
We generate code only for modules that get visited.
QAPISchema.visit() visits only modules that have definitions. It can
visit modules multiple times.
Clean this up as follows. Collect entities in their QAPISchemaModule.
Have QAPISchema.visit() call QAPISchemaModule.visit() for each module.
Have QAPISchemaModule.visit() call .visit_module() for itself, and
QAPISchemaEntity.visit() for each of its entities. This way, we visit
each module exactly once.
Signed-off-by: Markus Armbruster <address@hidden>
---
scripts/qapi/schema.py | 24 +++++++++++++-----------
tests/qapi-schema/empty.out | 1 +
tests/qapi-schema/include-repetition.out | 6 ++----
tests/qapi-schema/qapi-schema-test.out | 24 ++++++++++--------------
4 files changed, 26 insertions(+), 29 deletions(-)
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 0f2e0dcfce..0bfc5256fb 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -68,6 +68,7 @@ class QAPISchemaEntity(object):
def _set_module(self, schema, info):
assert self._checked
self._module = schema.module_by_fname(info and info.fname)
+ self._module.add_entity(self)
def set_module(self, schema):
self._set_module(schema, self.info)
@@ -77,11 +78,6 @@ class QAPISchemaEntity(object):
assert self._checked
return self._ifcond
- @property
- def module(self):
- assert self._module or not self.info
- return self._module
-
def is_implicit(self):
return not self.info
@@ -142,6 +138,16 @@ class QAPISchemaVisitor(object):
class QAPISchemaModule(object):
def __init__(self, name):
self.name = name
+ self._entity_list = []
+
+ def add_entity(self, ent):
+ self._entity_list.append(ent)
+
+ def visit(self, visitor):
+ visitor.visit_module(self.name)
+ for entity in self._entity_list:
+ if visitor.visit_needed(entity):
+ entity.visit(visitor)
class QAPISchemaInclude(QAPISchemaEntity):
@@ -1093,10 +1099,6 @@ class QAPISchema(object):
def visit(self, visitor):
visitor.visit_begin(self)
module = None
- for entity in self._entity_list:
- if visitor.visit_needed(entity):
- if entity.module != module:
- module = entity.module
- visitor.visit_module(module.name)
- entity.visit(visitor)
+ for mod in self._module_dict.values():
+ mod.visit(visitor)
visitor.visit_end()
diff --git a/tests/qapi-schema/empty.out b/tests/qapi-schema/empty.out
index 5b53d00702..69666c39ad 100644
--- a/tests/qapi-schema/empty.out
+++ b/tests/qapi-schema/empty.out
@@ -9,3 +9,4 @@ enum QType
member qdict
member qlist
member qbool
+module empty.json
diff --git a/tests/qapi-schema/include-repetition.out
b/tests/qapi-schema/include-repetition.out
index 5423983239..0b654ddebb 100644
--- a/tests/qapi-schema/include-repetition.out
+++ b/tests/qapi-schema/include-repetition.out
@@ -11,15 +11,13 @@ enum QType
member qbool
module include-repetition.json
include comments.json
+include include-repetition-sub.json
+include comments.json
module comments.json
enum Status
member good
member bad
member ugly
-module include-repetition.json
-include include-repetition-sub.json
module include-repetition-sub.json
include comments.json
include comments.json
-module include-repetition.json
-include comments.json
diff --git a/tests/qapi-schema/qapi-schema-test.out
b/tests/qapi-schema/qapi-schema-test.out
index 3660e75a48..9bd3c4a490 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -153,9 +153,6 @@ 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
@@ -193,17 +190,6 @@ object UserDefListUnion
case any: q_obj_anyList-wrapper
case user: q_obj_StatusList-wrapper
include include/sub-module.json
-module include/sub-module.json
-include sub-sub-module.json
-module sub-sub-module.json
-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
object q_obj_user_def_cmd1-arg
@@ -435,3 +421,13 @@ command test-command-cond-features3 None -> None
gen=True success_response=True boxed=False oob=False preconfig=False
feature feature1
if ['defined(TEST_IF_COND_1)', 'defined(TEST_IF_COND_2)']
+module include/sub-module.json
+include sub-sub-module.json
+object SecondArrayRef
+ member s: StatusList optional=False
+module sub-sub-module.json
+array StatusList Status
+enum Status
+ member good
+ member bad
+ member ugly
--
2.21.0
- [PATCH 0/6] qapi: Module fixes and cleanups, Markus Armbruster, 2019/11/20
- [PATCH 4/6] qapi: Proper intermediate representation for modules, Markus Armbruster, 2019/11/20
- [PATCH 3/6] qapi: Generate command registration stuff into separate files, Markus Armbruster, 2019/11/20
- [PATCH 5/6] qapi: Fix code generation for empty modules,
Markus Armbruster <=
- [PATCH 2/6] tests/Makefile.include: Fix missing test-qapi-emit-events.[ch], Markus Armbruster, 2019/11/20
- [PATCH 6/6] qapi: Simplify QAPISchemaModularCVisitor, Markus Armbruster, 2019/11/20
- [PATCH 1/6] qapi: Tweak "command returns a nice type" check for clarity, Markus Armbruster, 2019/11/20
- Re: [PATCH 0/6] qapi: Module fixes and cleanups, Markus Armbruster, 2019/11/20
- Re: [PATCH 0/6] qapi: Module fixes and cleanups, no-reply, 2019/11/20
- Re: [PATCH 0/6] qapi: Module fixes and cleanups, Markus Armbruster, 2019/11/21