Allow to filter expressions based on unit name.

By default, only default units are processed (unspecified pragma).

'all' will include all units. Anything else will filter by unit name.

(add a FIXME to make implicit array types use the element type unit,
not the unit of the first expression using that array type. This isn't
necessary for now, and I am not sure how to best do it yet)

Signed-off-by: Marc-André Lureau <[email protected]>
---
 scripts/qapi.py      | 14 ++++++++++++--
 scripts/qapi2texi.py |  1 +
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/scripts/qapi.py b/scripts/qapi.py
index 1d0defd638..7778585819 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -47,6 +47,9 @@ returns_whitelist = []
 # Whitelist of entities allowed to violate case conventions
 name_case_whitelist = []
 
+# Unit to consider for the visit, 'all' for all units
+visit_unit = None
+
 enum_types = {}
 struct_types = {}
 union_types = {}
@@ -1796,6 +1799,10 @@ class QAPISchema(object):
     def visit(self, visitor):
         visitor.visit_begin(self)
         for (name, entity) in sorted(self._entity_dict.items()):
+            # FIXME: implicit array types should use element type unit
+            unit = entity.info and entity.info.get('unit')
+            if visit_unit != 'all' and visit_unit != unit:
+                continue
             if visitor.visit_needed(entity):
                 entity.visit(visitor)
         visitor.visit_end()
@@ -2103,13 +2110,14 @@ def parse_command_line(extra_options='', 
extra_long_options=[]):
 
     try:
         opts, args = getopt.gnu_getopt(sys.argv[1:],
-            'chp:o:i:' + extra_options,
+            'chp:o:u:i:' + extra_options,
             ['source', 'header', 'prefix=', 'output-dir=',
-             'include='] + extra_long_options)
+             'unit=', 'include='] + extra_long_options)
     except getopt.GetoptError as err:
         print >>sys.stderr, "%s: %s" % (sys.argv[0], str(err))
         sys.exit(1)
 
+    global visit_unit
     output_dir = ''
     prefix = ''
     do_c = False
@@ -2129,6 +2137,8 @@ def parse_command_line(extra_options='', 
extra_long_options=[]):
             prefix = a
         elif o in ('-o', '--output-dir'):
             output_dir = a + '/'
+        elif o in ('-u', '--unit'):
+            visit_unit = a
         elif o in ('-c', '--source'):
             do_c = True
         elif o in ('-h', '--header'):
diff --git a/scripts/qapi2texi.py b/scripts/qapi2texi.py
index 4e7b1cda87..6c856d4cb7 100755
--- a/scripts/qapi2texi.py
+++ b/scripts/qapi2texi.py
@@ -293,6 +293,7 @@ def main(argv):
         print >>sys.stderr, "%s: need exactly 1 argument: SCHEMA" % argv[0]
         sys.exit(1)
 
+    qapi.visit_unit = 'all'
     schema = qapi.QAPISchema(argv[1])
     if not qapi.doc_required:
         print >>sys.stderr, ("%s: need pragma 'doc-required' "
-- 
2.14.1.146.gd35faa819


Reply via email to