qapi: Reserve '*List' type names for list types
Type names ending in 'List' can clash with qapi list types in
generated C. We don't currently use such names. It is easier to
outlaw them now than to worry about how to resolve such a clash
in the future. For precedence, see commit 4dc2e69
, which did the
same for names ending in 'Kind' versus implicit enum types for
qapi unions.
Update the testsuite to match.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1445898903-12082-5-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
f9e6102b48
commit
255960dd37
@ -106,7 +106,8 @@ Types, commands, and events share a common namespace. Therefore,
|
||||
generally speaking, type definitions should always use CamelCase for
|
||||
user-defined type names, while built-in types are lowercase. Type
|
||||
definitions should not end in 'Kind', as this namespace is used for
|
||||
creating implicit C enums for visiting union types. Command names,
|
||||
creating implicit C enums for visiting union types, or in 'List', as
|
||||
this namespace is used for creating array types. Command names,
|
||||
and field names within a type, should be all lower case with words
|
||||
separated by a hyphen. However, some existing older commands and
|
||||
complex types use underscore; when extending such expressions,
|
||||
|
@ -390,10 +390,10 @@ def add_name(name, info, meta, implicit=False):
|
||||
raise QAPIExprError(info,
|
||||
"%s '%s' is already defined"
|
||||
% (all_names[name], name))
|
||||
if not implicit and name.endswith('Kind'):
|
||||
if not implicit and (name.endswith('Kind') or name.endswith('List')):
|
||||
raise QAPIExprError(info,
|
||||
"%s '%s' should not end in 'Kind'"
|
||||
% (meta, name))
|
||||
"%s '%s' should not end in '%s'"
|
||||
% (meta, name, name[-4:]))
|
||||
all_names[name] = meta
|
||||
|
||||
|
||||
@ -1196,9 +1196,7 @@ class QAPISchema(object):
|
||||
return name
|
||||
|
||||
def _make_array_type(self, element_type, info):
|
||||
# TODO fooList namespace is not reserved; user can create collisions,
|
||||
# or abuse our type system with ['fooList'] for 2D array
|
||||
name = element_type + 'List'
|
||||
name = element_type + 'List' # Use namespace reserved by add_name()
|
||||
if not self.lookup_type(name):
|
||||
self._def_entity(QAPISchemaArrayType(name, info, element_type))
|
||||
return name
|
||||
|
@ -0,0 +1 @@
|
||||
tests/qapi-schema/reserved-type-list.json:5: struct 'FooList' should not end in 'List'
|
@ -1 +1 @@
|
||||
0
|
||||
1
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Potential C name collision
|
||||
# FIXME - This parses and compiles on its own, but prevents the user from
|
||||
# creating a type named 'Foo' and using ['Foo'] for an array. We should
|
||||
# reject the use of any type names ending in 'List'.
|
||||
# We reserve names ending in 'List' for use by array types.
|
||||
# TODO - we could choose array names to avoid collision with user types,
|
||||
# in order to let this compile
|
||||
{ 'struct': 'FooList', 'data': { 's': 'str' } }
|
||||
|
@ -1,3 +0,0 @@
|
||||
object :empty
|
||||
object FooList
|
||||
member s: str optional=False
|
Loading…
Reference in New Issue
Block a user