Extension type. Issue 54454. If no explicit interfaces, use implcit 'Object?' during UP.
Bug: https://github.com/dart-lang/sdk/issues/54454
Change-Id: Ib3229abf0229d2422047f22db05bcba605e5ad61
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/343641
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index a18ac66..6195a60 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -227,6 +227,14 @@
return type.nullabilitySuffix == NullabilitySuffix.none ? 1 : 0;
}
}
+
+ // Extension type without interfaces, implicit `Object?`
+ if (element is ExtensionTypeElement) {
+ if (element.interfaces.isEmpty) {
+ return 1;
+ }
+ }
+
int longestPath = 0;
try {
visitedElements.add(element);
diff --git a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
index 4b38968..298cf12 100644
--- a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
+++ b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
@@ -2861,6 +2861,38 @@
);
}
+ void test_extensionType_implementExtensionType_implicitObjectQuestion() {
+ // extension type A(Object?) {}
+ // extension type B(Object?) implements A {}
+ // extension type C(Object?) implements A {}
+
+ final A_none = interfaceTypeNone(
+ extensionType(
+ 'A',
+ representationType: objectQuestion,
+ interfaces: [],
+ ),
+ );
+
+ _checkLeastUpperBound(
+ interfaceTypeNone(
+ extensionType(
+ 'B',
+ representationType: objectQuestion,
+ interfaces: [A_none],
+ ),
+ ),
+ interfaceTypeNone(
+ extensionType(
+ 'C',
+ representationType: objectQuestion,
+ interfaces: [A_none],
+ ),
+ ),
+ A_none,
+ );
+ }
+
void test_extensionType_noTypeParameters_interfaces() {
// extension type A(int) implements int {}
// extension type B(double) implements double {}