diff options
author | Markus Armbruster <armbru@redhat.com> | 2019-09-27 15:46:17 +0200 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2019-09-28 17:17:18 +0200 |
commit | 7be6c511943613c60b3e5b640e09bdc916be3b65 (patch) | |
tree | 03764294007e38beb8f80df950e131b7eda50da5 /scripts | |
parent | 19e950d9d47d3efe4c8d5c6c872a53889a54363c (diff) |
qapi: Prefix frontend errors with an "in definition" line
We take pains to include the offending expression in error messages,
e.g.
tests/qapi-schema/alternate-any.json:2: alternate 'Alt' member 'one' cannot use type 'any'
But not always:
tests/qapi-schema/enum-if-invalid.json:2: 'if' condition must be a string or a list of strings
Instead of improving them one by one, report the offending expression
whenever it is known, like this:
tests/qapi-schema/enum-if-invalid.json: In enum 'TestIfEnum':
tests/qapi-schema/enum-if-invalid.json:2: 'if' condition must be a string or a list of strings
Error messages that mention the offending expression become a bit
redundant, e.g.
tests/qapi-schema/alternate-any.json: In alternate 'Alt':
tests/qapi-schema/alternate-any.json:2: alternate 'Alt' member 'one' cannot use type 'any'
I'll take care of that later in this series.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20190927134639.4284-5-armbru@redhat.com>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/qapi/common.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index 5843f3eeb2..f0e7d5ad34 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -64,6 +64,12 @@ class QAPISourceInfo(object): self.fname = fname self.line = line self.parent = parent + self.defn_meta = None + self.defn_name = None + + def set_defn(self, meta, name): + self.defn_meta = meta + self.defn_name = name def next_line(self): info = copy.copy(self) @@ -73,6 +79,12 @@ class QAPISourceInfo(object): def loc(self): return '%s:%d' % (self.fname, self.line) + def in_defn(self): + if self.defn_name: + return "%s: In %s '%s':\n" % (self.fname, + self.defn_meta, self.defn_name) + return '' + def include_path(self): ret = '' parent = self.parent @@ -82,7 +94,7 @@ class QAPISourceInfo(object): return ret def __str__(self): - return self.include_path() + self.loc() + return self.include_path() + self.in_defn() + self.loc() class QAPIError(Exception): @@ -1127,6 +1139,7 @@ def check_exprs(exprs): normalize_if(expr) name = expr[meta] add_name(name, info, meta) + info.set_defn(meta, name) if doc and doc.symbol != name: raise QAPISemError(info, "Definition of '%s' follows documentation" " for '%s'" % (name, doc.symbol)) |