]> git.proxmox.com Git - mirror_qemu.git/commitdiff
qapi: Enforce type naming rules
authorMarkus Armbruster <armbru@redhat.com>
Tue, 23 Mar 2021 09:40:11 +0000 (10:40 +0100)
committerMarkus Armbruster <armbru@redhat.com>
Tue, 23 Mar 2021 21:31:05 +0000 (22:31 +0100)
Type names should be CamelCase.  Enforce this.  The only offenders are
in tests/.  Fix them.  Add test type-case to cover the new error.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20210323094025.3569441-15-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[Regexp simplified, new test made more robust]

22 files changed:
scripts/qapi/expr.py
tests/qapi-schema/doc-bad-union-member.json
tests/qapi-schema/double-type.err
tests/qapi-schema/double-type.json
tests/qapi-schema/features-deprecated-type.err
tests/qapi-schema/features-deprecated-type.json
tests/qapi-schema/meson.build
tests/qapi-schema/redefined-builtin.err
tests/qapi-schema/redefined-builtin.json
tests/qapi-schema/redefined-type.err
tests/qapi-schema/redefined-type.json
tests/qapi-schema/struct-data-invalid.err
tests/qapi-schema/struct-data-invalid.json
tests/qapi-schema/struct-member-invalid-dict.err
tests/qapi-schema/struct-member-invalid-dict.json
tests/qapi-schema/struct-member-invalid.err
tests/qapi-schema/struct-member-invalid.json
tests/qapi-schema/type-case.err [new file with mode: 0644]
tests/qapi-schema/type-case.json [new file with mode: 0644]
tests/qapi-schema/type-case.out [new file with mode: 0644]
tests/qapi-schema/unknown-expr-key.err
tests/qapi-schema/unknown-expr-key.json

index c065505b27711b4ca8ff1c8e550be20dd61c7099..7bd15559dee85d3fbbdfb6d6dad0423edd474652 100644 (file)
@@ -61,7 +61,8 @@ def check_name_lower(name, info, source,
 
 def check_name_camel(name, info, source):
     stem = check_name_str(name, info, source)
-    # TODO reject '[_-]' in stem, require CamelCase
+    if not re.match(r'[A-Z][A-Za-z0-9]*[a-z][A-Za-z0-9]*$', stem):
+        raise QAPISemError(info, "name of %s must use CamelCase" % source)
 
 
 def check_defn_name_str(name, info, meta):
index d611435f6ae80b01ecfdde8f7f9334463f61041a..bd231a0109adcabfdf7bb94c31abd5ebbab6b1e9 100644 (file)
@@ -11,9 +11,9 @@
   'data': { 'nothing': 'Empty' } }
 
 { 'struct': 'Base',
-  'data': { 'type': 'T' } }
+  'data': { 'type': 'FrobType' } }
 
 { 'struct': 'Empty',
   'data': { } }
 
-{ 'enum': 'T', 'data': ['nothing'] }
+{ 'enum': 'FrobType', 'data': ['nothing'] }
index 71fc4dbb5212b4c86114b86828d2cf33139eb5dc..576e716197c581df5aa162174490df2daebe1705 100644 (file)
@@ -1,3 +1,3 @@
-double-type.json: In struct 'bar':
+double-type.json: In struct 'Bar':
 double-type.json:2: struct has unknown key 'command'
 Valid keys are 'base', 'data', 'features', 'if', 'struct'.
index 911fa7af502bf758bea5ba94cc04858ebd0eb2ca..2c0809f38d8a0838abbd732d7c4a8c04d9741103 100644 (file)
@@ -1,2 +1,2 @@
 # we reject an expression with ambiguous metatype
-{ 'command': 'foo', 'struct': 'bar', 'data': { } }
+{ 'command': 'foo', 'struct': 'Bar', 'data': { } }
index af4ffe20aa8a520e077c05670d10147012490cba..ddaedf604e37209f8ed1a1322d101fe309a967b5 100644 (file)
@@ -1,2 +1,2 @@
-features-deprecated-type.json: In struct 'S':
+features-deprecated-type.json: In struct 'Foo':
 features-deprecated-type.json:2: feature 'deprecated' is not supported for types
index 4b5bf5b86ec9004cf06b4dd912ca7e8f1b38ed19..265849b1f7995586a6dbb61cbc3d11ff41521eeb 100644 (file)
@@ -1,3 +1,3 @@
 # Feature 'deprecated' is not supported for types
-{ 'struct': 'S', 'data': {},
+{ 'struct': 'Foo', 'data': {},
   'features': [ 'deprecated' ] }
index d5fa0355077c31f1cf7085e5e16d5e23be6a157c..ba11cb76acc69bccf09145a88957a940b23df3e1 100644 (file)
@@ -180,6 +180,7 @@ schemas = [
   'trailing-comma-list.json',
   'trailing-comma-object.json',
   'type-bypass-bad-gen.json',
+  'type-case.json',
   'unclosed-list.json',
   'unclosed-object.json',
   'unclosed-string.json',
index 58c7e42ffc36e59d5fb45894045633832a2a3911..92bc62dc7609868743819040f89bd6a4f83be9bb 100644 (file)
@@ -1,2 +1,2 @@
-redefined-builtin.json: In struct 'size':
-redefined-builtin.json:2: built-in type 'size' is already defined
+redefined-builtin.json: In struct 'QType':
+redefined-builtin.json:2: enum type 'QType' is already defined
index 45b8a550ad8d133fb7dea8516357aeb22df1a0ba..cad555cc738723ace800b1277db2a276109c72d2 100644 (file)
@@ -1,2 +1,2 @@
-# we reject types that duplicate builtin names
-{ 'struct': 'size', 'data': { 'myint': 'size' } }
+# we reject types that clash with predefined types
+{ 'struct': 'QType', 'data': { 'myint': 'size' } }
index b7103fc15f31ac603117bc97008a0c1fbe6774ac..5e5406f811aa44171831d360f192d5674441fb18 100644 (file)
@@ -1,4 +1,4 @@
-redefined-type.json: In enum 'foo':
-redefined-type.json:3: 'foo' is already defined
-redefined-type.json: In struct 'foo':
+redefined-type.json: In enum 'Foo':
+redefined-type.json:3: 'Foo' is already defined
+redefined-type.json: In struct 'Foo':
 redefined-type.json:2: previous definition
index a09e768baeb5e6c3ec73b8f35e6d6009159c7615..291453e70d738dbdaea3308f7f7adaf11124fa2f 100644 (file)
@@ -1,3 +1,3 @@
 # we reject types defined more than once
-{ 'struct': 'foo', 'data': { 'one': 'str' } }
-{ 'enum': 'foo', 'data': [ 'two' ] }
+{ 'struct': 'Foo', 'data': { 'one': 'str' } }
+{ 'enum': 'Foo', 'data': [ 'two' ] }
index 5ed4bec5739c84f3192ba71a300d167bf8e41c97..23cbfc60eaa7749d3f347491b5785f7a6d2a5609 100644 (file)
@@ -1,2 +1,2 @@
-struct-data-invalid.json: In struct 'foo':
+struct-data-invalid.json: In struct 'Foo':
 struct-data-invalid.json:1: 'data' should be an object or type name
index 9adbc3bb6b63912e3d684c017be0f59950f8a765..00ad11ef9493935f3c35273f616c6bd6d3fb0f86 100644 (file)
@@ -1,2 +1,2 @@
-{ 'struct': 'foo',
+{ 'struct': 'Foo',
   'data': false }
index f9b3f3355179ca9cd082fb77ec5f83feee29fdbc..517793cc9bac4c6fe9ef29d2d3d9165ed097c6c2 100644 (file)
@@ -1,2 +1,2 @@
-struct-member-invalid-dict.json: In struct 'foo':
+struct-member-invalid-dict.json: In struct 'Foo':
 struct-member-invalid-dict.json:3: 'data' member '*a' misses key 'type'
index bc3d62ae631b7ad52f1c4d6ffb97bd71f5f5b65c..df5d018f6548739d184c72aea1cf8570e478266a 100644 (file)
@@ -1,4 +1,4 @@
 # struct 'data' member with dict value is (longhand) member
 # definition, not inline complex type
-{ 'struct': 'foo',
+{ 'struct': 'Foo',
   'data': { '*a': { 'case': 'foo' } } }
index 9a2c9345383d57a9a9f0eb3a84f1e97c68150d67..7e01a41d7c74a7d593bd01ea3e7d8137ef1b4e8a 100644 (file)
@@ -1,2 +1,2 @@
-struct-member-invalid.json: In struct 'foo':
+struct-member-invalid.json: In struct 'Foo':
 struct-member-invalid.json:1: 'data' member 'a' should be a type name
index 8f172f7a87e7bc63b0f8bb32a0ae2676b4b8a175..a4cd860c67a4296db513ca352303ec64fd8966db 100644 (file)
@@ -1,2 +1,2 @@
-{ 'struct': 'foo',
+{ 'struct': 'Foo',
   'data': { 'a': false } }
diff --git a/tests/qapi-schema/type-case.err b/tests/qapi-schema/type-case.err
new file mode 100644 (file)
index 0000000..36d2de2
--- /dev/null
@@ -0,0 +1,2 @@
+type-case.json: In struct 'not-a-camel':
+type-case.json:2: name of struct must use CamelCase
diff --git a/tests/qapi-schema/type-case.json b/tests/qapi-schema/type-case.json
new file mode 100644 (file)
index 0000000..a43c68e
--- /dev/null
@@ -0,0 +1,2 @@
+# Type names should use CamelCase
+{ 'struct': 'not-a-camel', 'data': {} }
diff --git a/tests/qapi-schema/type-case.out b/tests/qapi-schema/type-case.out
new file mode 100644 (file)
index 0000000..e69de29
index c5f395bf79e93ee3753c608a2e048f14c9394506..f2538e3ce7c0150419fc67e8fc812f49ef073546 100644 (file)
@@ -1,3 +1,3 @@
-unknown-expr-key.json: In struct 'bar':
+unknown-expr-key.json: In struct 'Bar':
 unknown-expr-key.json:2: struct has unknown keys 'bogus', 'phony'
 Valid keys are 'base', 'data', 'features', 'if', 'struct'.
index 13292d75edfce542bed39e6027653b64439d8c16..8003a0c36e0fa69fc70a11b24bdf05653e8bdccf 100644 (file)
@@ -1,2 +1,2 @@
 # we reject an expression with unknown top-level keys
-{ 'struct': 'bar', 'data': { 'string': 'str'}, 'bogus': { }, 'phony': { } }
+{ 'struct': 'Bar', 'data': { 'string': 'str'}, 'bogus': { }, 'phony': { } }