qapi: Improve reporting of invalid name errors
Split check_name() into check_name_is_str() and check_name_str(), keep check_name() as a wrapper. Move add_name()'s call into its caller check_exprs(), and inline. This permits delaying check_name_str() there, so its error message gains an "in definition" line. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20190927134639.4284-10-armbru@redhat.com>
This commit is contained in:
parent
c9efc984ca
commit
d7bc17c602
@ -708,11 +708,22 @@ valid_name = re.compile(r'^(__[a-zA-Z0-9.-]+_)?'
|
||||
|
||||
def check_name(name, info, source,
|
||||
allow_optional=False, enum_member=False, permit_upper=False):
|
||||
check_name_is_str(name, info, source)
|
||||
check_name_str(name, info, source,
|
||||
allow_optional, enum_member, permit_upper)
|
||||
|
||||
|
||||
def check_name_is_str(name, info, source):
|
||||
if not isinstance(name, str):
|
||||
raise QAPISemError(info, "%s requires a string name" % source)
|
||||
|
||||
|
||||
def check_name_str(name, info, source,
|
||||
allow_optional=False, enum_member=False,
|
||||
permit_upper=False):
|
||||
global valid_name
|
||||
membername = name
|
||||
|
||||
if not isinstance(name, str):
|
||||
raise QAPISemError(info, "%s requires a string name" % source)
|
||||
if name.startswith('*'):
|
||||
membername = name[1:]
|
||||
if not allow_optional:
|
||||
@ -734,7 +745,6 @@ def check_name(name, info, source,
|
||||
|
||||
def add_name(name, info, meta):
|
||||
global all_names
|
||||
check_name(name, info, "'%s'" % meta, permit_upper=True)
|
||||
# FIXME should reject names that differ only in '_' vs. '.'
|
||||
# vs. '-', because they're liable to clash in generated C.
|
||||
if name in all_names:
|
||||
@ -1153,8 +1163,10 @@ def check_exprs(exprs):
|
||||
raise QAPISemError(info, "expression is missing metatype")
|
||||
normalize_if(expr)
|
||||
name = expr[meta]
|
||||
add_name(name, info, meta)
|
||||
check_name_is_str(name, info, "'%s'" % meta)
|
||||
info.set_defn(meta, name)
|
||||
check_name_str(name, info, "'%s'" % meta, permit_upper=True)
|
||||
add_name(name, info, meta)
|
||||
if doc and doc.symbol != name:
|
||||
raise QAPISemError(
|
||||
info,
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/bad-ident.json: In struct '*oops':
|
||||
tests/qapi-schema/bad-ident.json:2: 'struct' does not allow optional name '*oops'
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/command-int.json: In command 'int':
|
||||
tests/qapi-schema/command-int.json:2: built-in 'int' is already defined
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/redefined-builtin.json: In struct 'size':
|
||||
tests/qapi-schema/redefined-builtin.json:2: built-in 'size' is already defined
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/redefined-command.json: In command 'foo':
|
||||
tests/qapi-schema/redefined-command.json:3: command 'foo' is already defined
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/redefined-event.json: In event 'EVENT_A':
|
||||
tests/qapi-schema/redefined-event.json:3: event 'EVENT_A' is already defined
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/redefined-type.json: In enum 'foo':
|
||||
tests/qapi-schema/redefined-type.json:3: struct 'foo' is already defined
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/reserved-command-q.json: In command 'q-unix':
|
||||
tests/qapi-schema/reserved-command-q.json:5: 'command' uses invalid name 'q-unix'
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/reserved-type-kind.json: In enum 'UnionKind':
|
||||
tests/qapi-schema/reserved-type-kind.json:2: enum 'UnionKind' should not end in 'Kind'
|
||||
|
@ -1 +1,2 @@
|
||||
tests/qapi-schema/reserved-type-list.json: In struct 'FooList':
|
||||
tests/qapi-schema/reserved-type-list.json:5: struct 'FooList' should not end in 'List'
|
||||
|
Loading…
Reference in New Issue
Block a user