Extension type. Issue 53638. Don't crash on getInheritedConcreteMap2 invocation.
Bug: https://github.com/dart-lang/sdk/issues/53638
Change-Id: I49bc912a56fab85f206a997a84261b964a27d370
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329782
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 6e1f25c..6d65127 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -174,6 +174,10 @@
/// from the superclasses and mixins.
Map<Name, ExecutableElement> getInheritedConcreteMap2(
InterfaceElement element) {
+ if (element is ExtensionTypeElement) {
+ return const {};
+ }
+
var interface = getInterface(element);
return interface.superImplemented.last;
}
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
index 7df19da..38d41bf4 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -513,6 +513,9 @@
self::@class::A::@method::foo
it
self::@extensionType::B::@getter::it
+inheritedMap
+ foo: self::@extensionType::B::@method::foo
+ it: self::@extensionType::B::@getter::it
''');
}
@@ -596,6 +599,8 @@
redeclared
foo
self::@class::A::@method::foo
+inheritedMap
+ foo: self::@class::A::@method::foo
''');
}
@@ -625,6 +630,8 @@
redeclared
foo
self::@class::A::@getter::foo
+inheritedMap
+ foo: self::@class::A::@getter::foo
''');
}
@@ -658,6 +665,9 @@
it
self::@extensionType::A1::@getter::it
self::@extensionType::A2::@getter::it
+inheritedMap
+ foo: self::@extensionType::A1::@method::foo
+ it: self::@extensionType::A1::@getter::it
''');
}
@@ -685,6 +695,9 @@
self::@extensionType::A::@method::foo
it
self::@extensionType::A::@getter::it
+inheritedMap
+ foo: self::@extensionType::A::@method::foo
+ it: self::@extensionType::A::@getter::it
''');
}
@@ -712,6 +725,9 @@
self::@extensionType::A::@getter::foo
it
self::@extensionType::A::@getter::it
+inheritedMap
+ foo: self::@extensionType::A::@getter::foo
+ it: self::@extensionType::A::@getter::it
''');
}
@@ -790,6 +806,10 @@
MethodMember
base: self::@class::A::@method::foo
substitution: {T: int}
+inheritedMap
+ foo: MethodMember
+ base: self::@class::A::@method::foo
+ substitution: {T: int}
''');
}
@@ -818,6 +838,9 @@
self::@class::A::@method::foo
it
self::@extensionType::B::@getter::it
+inheritedMap
+ foo: self::@extensionType::B::@method::foo
+ it: self::@extensionType::B::@getter::it
conflicts
HasExtensionAndNotExtensionMemberConflict
nonExtension
@@ -848,6 +871,8 @@
redeclared
foo
self::@class::A::@method::foo
+inheritedMap
+ foo: self::@class::A::@method::foo
''');
}
@@ -905,6 +930,8 @@
foo
self::@class::A::@method::foo
self::@class::B::@method::foo
+inheritedMap
+ foo: self::@class::A::@method::foo
''');
}
@@ -933,6 +960,8 @@
redeclared
foo
self::@class::A::@method::foo
+inheritedMap
+ foo: self::@class::A::@method::foo
''');
}
@@ -957,6 +986,8 @@
redeclared
foo=
self::@class::A::@setter::foo
+inheritedMap
+ foo=: self::@class::A::@setter::foo
''');
}
@@ -987,6 +1018,13 @@
PropertyAccessorMember
base: self::@extensionType::A::@getter::it
substitution: {T: int}
+inheritedMap
+ foo: MethodMember
+ base: self::@extensionType::A::@method::foo
+ substitution: {T: int}
+ it: PropertyAccessorMember
+ base: self::@extensionType::A::@getter::it
+ substitution: {T: int}
''');
}
@@ -1011,6 +1049,9 @@
self::@extensionType::A::@method::foo
it
self::@extensionType::A::@getter::it
+inheritedMap
+ foo: self::@extensionType::A::@method::foo
+ it: self::@extensionType::A::@getter::it
''');
}
@@ -1040,6 +1081,9 @@
it
self::@extensionType::A1::@getter::it
self::@extensionType::A2::@getter::it
+inheritedMap
+ foo: self::@extensionType::A1::@method::foo
+ it: self::@extensionType::A1::@getter::it
conflicts
NotUniqueExtensionMemberConflict
self::@extensionType::A1::@method::foo
@@ -1073,6 +1117,9 @@
it
self::@extensionType::B1::@getter::it
self::@extensionType::B2::@getter::it
+inheritedMap
+ foo: self::@extensionType::A::@method::foo
+ it: self::@extensionType::B1::@getter::it
''');
}
@@ -1104,6 +1151,12 @@
dart:core::@class::Object::@getter::runtimeType
toString
dart:core::@class::Object::@method::toString
+inheritedMap
+ ==: dart:core::@class::Object::@method::==
+ hashCode: dart:core::@class::Object::@getter::hashCode
+ noSuchMethod: dart:core::@class::Object::@method::noSuchMethod
+ runtimeType: dart:core::@class::Object::@getter::runtimeType
+ toString: dart:core::@class::Object::@method::toString
''');
}
@@ -1112,6 +1165,12 @@
final inheritance = library.session.inheritanceManager;
final interface = inheritance.getInterface(element);
+ // Should not throw.
+ inheritance.getInheritedConcreteMap2(element);
+
+ // Ensure that `inheritedMap` field is initialized.
+ inheritance.getInheritedMap2(element);
+
final buffer = StringBuffer();
final sink = TreeStringSink(
sink: buffer,