Jelajahi Sumber

qapi: Improve reporting of member name clashes

We report name clashes like this:

    struct-base-clash.json: In struct 'Sub':
    struct-base-clash.json:5: 'name' (member of Sub) collides with 'name' (member of Base)

The "(member of Sub)" is redundant with "In struct 'Sub'".  Comes from
QAPISchemaMember.describe().  Pass info to it, so it can detect the
redundancy and avoid it.  Result:

    struct-base-clash.json: In struct 'Sub':
    struct-base-clash.json:5: member 'name' collides with member 'name' of type 'Base'

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20190927134639.4284-8-armbru@redhat.com>
Markus Armbruster 5 tahun lalu
induk
melakukan
481a6bd15c

+ 23 - 13
scripts/qapi/common.py

@@ -1575,31 +1575,41 @@ def set_defined_in(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 in seen:
         if cname in seen:
-            raise QAPISemError(info, "%s collides with %s" %
-                               (self.describe(), seen[cname].describe()))
+            raise QAPISemError(
+                info,
+                "%s collides with %s"
+                % (self.describe(info), seen[cname].describe(info)))
         seen[cname] = self
         seen[cname] = self
 
 
-    def _pretty_defined_in(self):
+    def describe(self, info):
+        role = self.role
         defined_in = self.defined_in
         defined_in = self.defined_in
+        assert defined_in
+
         if defined_in.startswith('q_obj_'):
         if defined_in.startswith('q_obj_'):
             # See QAPISchema._make_implicit_object_type() - reverse the
             # See QAPISchema._make_implicit_object_type() - reverse the
             # mapping there to create a nice human-readable description
             # mapping there to create a nice human-readable description
             defined_in = defined_in[6:]
             defined_in = defined_in[6:]
             if defined_in.endswith('-arg'):
             if defined_in.endswith('-arg'):
-                return '(parameter of %s)' % defined_in[:-4]
+                # Implicit type created for a command's dict 'data'
+                assert role == 'member'
+                role = 'parameter'
             elif defined_in.endswith('-base'):
             elif defined_in.endswith('-base'):
-                return '(base of %s)' % defined_in[:-5]
+                # Implicit type created for a flat union's dict 'base'
+                role = 'base ' + role
             else:
             else:
+                # Implicit type created for a simple union's branch
                 assert defined_in.endswith('-wrapper')
                 assert defined_in.endswith('-wrapper')
                 # Unreachable and not implemented
                 # Unreachable and not implemented
                 assert False
                 assert False
-        if defined_in.endswith('Kind'):
+        elif defined_in.endswith('Kind'):
             # See QAPISchema._make_implicit_enum_type()
             # See QAPISchema._make_implicit_enum_type()
-            return '(branch of %s)' % defined_in[:-4]
-        return '(%s of %s)' % (self.role, defined_in)
-
-    def describe(self):
-        return "'%s' %s" % (self.name, self._pretty_defined_in())
+            # Implicit enum created for simple union's branches
+            assert role == 'value'
+            role = 'branch'
+        elif defined_in != info.defn_name:
+            return "%s '%s' of type '%s'" % (role, self.name, defined_in)
+        return "%s '%s'" % (role, self.name)
 
 
 
 
 class QAPISchemaEnumMember(QAPISchemaMember):
 class QAPISchemaEnumMember(QAPISchemaMember):
@@ -1871,7 +1881,7 @@ def _make_enum_members(self, values):
                 for v in values]
                 for v in values]
 
 
     def _make_implicit_enum_type(self, name, info, ifcond, values):
     def _make_implicit_enum_type(self, name, info, ifcond, values):
-        # See also QAPISchemaObjectTypeMember._pretty_defined_in()
+        # See also QAPISchemaObjectTypeMember.describe()
         name = name + 'Kind'   # Use namespace reserved by add_name()
         name = name + 'Kind'   # Use namespace reserved by add_name()
         self._def_entity(QAPISchemaEnumType(
         self._def_entity(QAPISchemaEnumType(
             name, info, None, ifcond, self._make_enum_members(values), None))
             name, info, None, ifcond, self._make_enum_members(values), None))
@@ -1887,7 +1897,7 @@ def _make_implicit_object_type(self, name, info, doc, ifcond,
                                    role, members):
                                    role, members):
         if not members:
         if not members:
             return None
             return None
-        # See also QAPISchemaObjectTypeMember._pretty_defined_in()
+        # See also QAPISchemaObjectTypeMember.describe()
         name = 'q_obj_%s-%s' % (name, role)
         name = 'q_obj_%s-%s' % (name, role)
         typ = self.lookup_entity(name, QAPISchemaObjectType)
         typ = self.lookup_entity(name, QAPISchemaObjectType)
         if typ:
         if typ:

+ 1 - 1
tests/qapi-schema/alternate-clash.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/alternate-clash.json: In alternate 'Alt1':
 tests/qapi-schema/alternate-clash.json: In alternate 'Alt1':
-tests/qapi-schema/alternate-clash.json:7: 'a_b' (branch of Alt1) collides with 'a-b' (branch of Alt1)
+tests/qapi-schema/alternate-clash.json:7: branch 'a_b' collides with branch 'a-b'

+ 1 - 1
tests/qapi-schema/args-name-clash.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/args-name-clash.json: In command 'oops':
 tests/qapi-schema/args-name-clash.json: In command 'oops':
-tests/qapi-schema/args-name-clash.json:4: 'a_b' (parameter of oops) collides with 'a-b' (parameter of oops)
+tests/qapi-schema/args-name-clash.json:4: parameter 'a_b' collides with parameter 'a-b'

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

@@ -1,2 +1,2 @@
 tests/qapi-schema/enum-clash-member.json: In enum 'MyEnum':
 tests/qapi-schema/enum-clash-member.json: In enum 'MyEnum':
-tests/qapi-schema/enum-clash-member.json:2: 'one_two' (value of MyEnum) collides with 'one-two' (value of MyEnum)
+tests/qapi-schema/enum-clash-member.json:2: value 'one_two' collides with value 'one-two'

+ 1 - 1
tests/qapi-schema/features-duplicate-name.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/features-duplicate-name.json: In struct 'FeatureStruct0':
 tests/qapi-schema/features-duplicate-name.json: In struct 'FeatureStruct0':
-tests/qapi-schema/features-duplicate-name.json:1: 'foo' (feature of FeatureStruct0) collides with 'foo' (feature of FeatureStruct0)
+tests/qapi-schema/features-duplicate-name.json:1: feature 'foo' collides with feature 'foo'

+ 1 - 1
tests/qapi-schema/flat-union-bad-base.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/flat-union-bad-base.json: In union 'TestUnion':
 tests/qapi-schema/flat-union-bad-base.json: In union 'TestUnion':
-tests/qapi-schema/flat-union-bad-base.json:8: 'string' (member of TestTypeA) collides with 'string' (base of TestUnion)
+tests/qapi-schema/flat-union-bad-base.json:8: member 'string' of type 'TestTypeA' collides with base member 'string'

+ 1 - 1
tests/qapi-schema/flat-union-clash-member.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/flat-union-clash-member.json: In union 'TestUnion':
 tests/qapi-schema/flat-union-clash-member.json: In union 'TestUnion':
-tests/qapi-schema/flat-union-clash-member.json:11: 'name' (member of Branch1) collides with 'name' (member of Base)
+tests/qapi-schema/flat-union-clash-member.json:11: member 'name' of type 'Branch1' collides with member 'name' of type 'Base'

+ 1 - 1
tests/qapi-schema/struct-base-clash-deep.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/struct-base-clash-deep.json: In struct 'Sub':
 tests/qapi-schema/struct-base-clash-deep.json: In struct 'Sub':
-tests/qapi-schema/struct-base-clash-deep.json:10: 'name' (member of Sub) collides with 'name' (member of Base)
+tests/qapi-schema/struct-base-clash-deep.json:10: member 'name' collides with member 'name' of type 'Base'

+ 1 - 1
tests/qapi-schema/struct-base-clash.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/struct-base-clash.json: In struct 'Sub':
 tests/qapi-schema/struct-base-clash.json: In struct 'Sub':
-tests/qapi-schema/struct-base-clash.json:5: 'name' (member of Sub) collides with 'name' (member of Base)
+tests/qapi-schema/struct-base-clash.json:5: member 'name' collides with member 'name' of type 'Base'

+ 1 - 1
tests/qapi-schema/union-clash-branches.err

@@ -1,2 +1,2 @@
 tests/qapi-schema/union-clash-branches.json: In union 'TestUnion':
 tests/qapi-schema/union-clash-branches.json: In union 'TestUnion':
-tests/qapi-schema/union-clash-branches.json:4: 'a_b' (branch of TestUnion) collides with 'a-b' (branch of TestUnion)
+tests/qapi-schema/union-clash-branches.json:4: branch 'a_b' collides with branch 'a-b'