Fix for the case when a class appears twice in a type hierarchy.
R=brianwilkerson@google.com
BUG=
Review URL: https://codereview.chromium.org/1406403009 .
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 695693c..0a666f3 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -85,7 +85,7 @@
TypeHierarchyItem subItem = _elementItemMap[subElement];
if (subItem != null) {
int id = _items.indexOf(subItem);
- subItem.subclasses.add(id);
+ item.subclasses.add(id);
continue;
}
// create a subclass item
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index 037d7bb..1d6ddf9a 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -75,7 +75,7 @@
'superclass': 1,
'interfaces': [],
'mixins': [],
- 'subclasses': []
+ 'subclasses': [1]
},
{
'classElement': {
@@ -87,7 +87,7 @@
'superclass': 0,
'interfaces': [],
'mixins': [],
- 'subclasses': [1]
+ 'subclasses': []
}
]);
}
@@ -107,6 +107,66 @@
expect(itemA.displayName, 'A<int>');
}
+ test_class_double_subclass() async {
+ addTestFile('''
+class AAA {} // A
+
+class BBB extends AAA {}
+
+class CCC extends BBB implements AAA {}
+''');
+ List<TypeHierarchyItem> items = await _getTypeHierarchy('AAA {} // A');
+ expect(_toJson(items), [
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'AAA',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'superclass': 1,
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': [2, 3]
+ },
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'Object',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': []
+ },
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'CCC',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'superclass': 0,
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': []
+ },
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'BBB',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'superclass': 0,
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': [2]
+ }
+ ]);
+ }
+
test_class_extends_fileAndPackageUris() async {
// prepare packages
String pkgFile = '/packages/pkgA/libA.dart';