Sfoglia il codice sorgente

qapi: Have each QAPI schema declare its name rule violations

qapi.py has a hardcoded white-list of type names that may violate the
rule on use of upper and lower case.  Add a new pragma directive
'name-case-whitelist', and use it to replace the hard-coded
white-list.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1489582656-31133-7-git-send-email-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Markus Armbruster 8 anni fa
parent
commit
2cfbae3c42

+ 6 - 0
docs/qapi-code-gen.txt

@@ -252,6 +252,9 @@ Any name (command, event, type, member, or enum value) beginning with
 "x-" is marked experimental, and may be withdrawn or changed
 "x-" is marked experimental, and may be withdrawn or changed
 incompatibly in a future release.
 incompatibly in a future release.
 
 
+Pragma 'name-case-whitelist' lets you violate the rules on use of
+upper and lower case.  Use for new code is strongly discouraged.
+
 In the rest of this document, usage lines are given for each
 In the rest of this document, usage lines are given for each
 expression type, with literal strings written in lower case and
 expression type, with literal strings written in lower case and
 placeholders written in capitals.  If a literal string includes a
 placeholders written in capitals.  If a literal string includes a
@@ -321,6 +324,9 @@ is required.  Default is false.
 Pragma 'returns-whitelist' takes a list of command names that may
 Pragma 'returns-whitelist' takes a list of command names that may
 violate the rules on permitted return types.  Default is none.
 violate the rules on permitted return types.  Default is none.
 
 
+Pragma 'name-case-whitelist' takes a list of names that may violate
+rules on use of upper- vs. lower-case letters.  Default is none.
+
 
 
 === Struct types ===
 === Struct types ===
 
 

+ 10 - 1
qapi-schema.json

@@ -61,7 +61,16 @@
         'query-migrate-cache-size',
         'query-migrate-cache-size',
         'query-tpm-models',
         'query-tpm-models',
         'query-tpm-types',
         'query-tpm-types',
-        'ringbuf-read' ] } }
+        'ringbuf-read' ],
+    'name-case-whitelist': [
+        'ACPISlotType',         # DIMM, visible through query-acpi-ospm-status
+        'CpuInfoMIPS',          # PC, visible through query-cpu
+        'CpuInfoTricore',       # PC, visible through query-cpu
+        'QapiErrorClass',       # all members, visible through errors
+        'UuidInfo',             # UUID, visible through query-uuid
+        'X86CPURegister32',     # all members, visible indirectly through qom-get
+        'q_obj_CpuInfo-base'    # CPU, visible through query-cpu
+    ] } }
 
 
 # QAPI common definitions
 # QAPI common definitions
 { 'include': 'qapi/common.json' }
 { 'include': 'qapi/common.json' }

+ 10 - 12
scripts/qapi.py

@@ -44,16 +44,7 @@
 returns_whitelist = []
 returns_whitelist = []
 
 
 # Whitelist of entities allowed to violate case conventions
 # Whitelist of entities allowed to violate case conventions
-case_whitelist = [
-    # From QMP:
-    'ACPISlotType',         # DIMM, visible through query-acpi-ospm-status
-    'CpuInfoMIPS',          # PC, visible through query-cpu
-    'CpuInfoTricore',       # PC, visible through query-cpu
-    'QapiErrorClass',       # all members, visible through errors
-    'UuidInfo',             # UUID, visible through query-uuid
-    'X86CPURegister32',     # all members, visible indirectly through qom-get
-    'q_obj_CpuInfo-base',   # CPU, visible through query-cpu
-]
+name_case_whitelist = []
 
 
 enum_types = []
 enum_types = []
 struct_types = []
 struct_types = []
@@ -302,7 +293,7 @@ def _include(self, include, info, base_dir, previously_included):
         self.docs.extend(exprs_include.docs)
         self.docs.extend(exprs_include.docs)
 
 
     def _pragma(self, name, value, info):
     def _pragma(self, name, value, info):
-        global doc_required, returns_whitelist
+        global doc_required, returns_whitelist, name_case_whitelist
         if name == 'doc-required':
         if name == 'doc-required':
             if not isinstance(value, bool):
             if not isinstance(value, bool):
                 raise QAPISemError(info,
                 raise QAPISemError(info,
@@ -315,6 +306,13 @@ def _pragma(self, name, value, info):
                                    "Pragma returns-whitelist must be"
                                    "Pragma returns-whitelist must be"
                                    " a list of strings")
                                    " a list of strings")
             returns_whitelist = value
             returns_whitelist = value
+        elif name == 'name-case-whitelist':
+            if (not isinstance(value, list)
+                    or any([not isinstance(elt, str) for elt in value])):
+                raise QAPISemError(info,
+                                   "Pragma name-case-whitelist must be"
+                                   " a list of strings")
+            name_case_whitelist = value
         else:
         else:
             raise QAPISemError(info, "Unknown pragma '%s'" % name)
             raise QAPISemError(info, "Unknown pragma '%s'" % name)
 
 
@@ -1287,7 +1285,7 @@ def set_owner(self, name):
 
 
     def check_clash(self, info, seen):
     def check_clash(self, info, seen):
         cname = c_name(self.name)
         cname = c_name(self.name)
-        if cname.lower() != cname and self.owner not in case_whitelist:
+        if cname.lower() != cname and self.owner not in name_case_whitelist:
             raise QAPISemError(info,
             raise QAPISemError(info,
                                "%s should not use uppercase" % self.describe())
                                "%s should not use uppercase" % self.describe())
         if cname in seen:
         if cname in seen:

+ 1 - 0
tests/Makefile.include

@@ -443,6 +443,7 @@ qapi-schema += nested-struct-data.json
 qapi-schema += non-objects.json
 qapi-schema += non-objects.json
 qapi-schema += pragma-doc-required-crap.json
 qapi-schema += pragma-doc-required-crap.json
 qapi-schema += pragma-extra-junk.json
 qapi-schema += pragma-extra-junk.json
+qapi-schema += pragma-name-case-whitelist-crap.json
 qapi-schema += pragma-non-dict.json
 qapi-schema += pragma-non-dict.json
 qapi-schema += pragma-returns-whitelist-crap.json
 qapi-schema += pragma-returns-whitelist-crap.json
 qapi-schema += qapi-schema-test.json
 qapi-schema += qapi-schema-test.json

+ 1 - 1
tests/qapi-schema/enum-member-case.err

@@ -1 +1 @@
-tests/qapi-schema/enum-member-case.json:3: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
+tests/qapi-schema/enum-member-case.json:4: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase

+ 1 - 0
tests/qapi-schema/enum-member-case.json

@@ -1,3 +1,4 @@
 # Member names should be 'lower-case' unless the enum is whitelisted
 # Member names should be 'lower-case' unless the enum is whitelisted
+{ 'pragma': { 'name-case-whitelist': [ 'UuidInfo' ] } }
 { 'enum': 'UuidInfo', 'data': [ 'Value' ] } # UuidInfo is whitelisted
 { 'enum': 'UuidInfo', 'data': [ 'Value' ] } # UuidInfo is whitelisted
 { 'enum': 'NoWayThisWillGetWhitelisted', 'data': [ 'Value' ] }
 { 'enum': 'NoWayThisWillGetWhitelisted', 'data': [ 'Value' ] }

+ 1 - 0
tests/qapi-schema/pragma-name-case-whitelist-crap.err

@@ -0,0 +1 @@
+tests/qapi-schema/pragma-name-case-whitelist-crap.json:3: Pragma name-case-whitelist must be a list of strings

+ 1 - 0
tests/qapi-schema/pragma-name-case-whitelist-crap.exit

@@ -0,0 +1 @@
+1

+ 3 - 0
tests/qapi-schema/pragma-name-case-whitelist-crap.json

@@ -0,0 +1,3 @@
+# 'name-case-whitelist' must be list of strings
+
+{ 'pragma': { 'name-case-whitelist': null } }

+ 0 - 0
tests/qapi-schema/pragma-name-case-whitelist-crap.out