Extension type. Issue 54802. Use extensionTypeErasure to decide if use super default value.
Bug: https://github.com/dart-lang/sdk/issues/54802
Change-Id: I01984f6db0ff61d5b24a1363feeb4185e64d31ab
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/350160
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 844040f..40a0e4f1 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1349,11 +1349,22 @@
DartObject? get _superConstructorParameterDefaultValue {
var superDefault = superConstructorParameter?.computeConstantValue();
- var superDefaultType = superDefault?.type;
- var libraryElement = library;
- if (superDefaultType != null &&
- libraryElement != null &&
- libraryElement.typeSystem.isSubtypeOf(superDefaultType, type)) {
+ if (superDefault == null) {
+ return null;
+ }
+
+ var superDefaultType = superDefault.type;
+ if (superDefaultType == null) {
+ return null;
+ }
+
+ var typeSystem = library?.typeSystem;
+ if (typeSystem == null) {
+ return null;
+ }
+
+ var requiredType = type.extensionTypeErasure;
+ if (typeSystem.isSubtypeOf(superDefaultType, requiredType)) {
return superDefault;
}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart
index af22783..715d89f 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_default_value_for_parameter_test.dart
@@ -134,6 +134,20 @@
''');
}
+ test_constructor_generative_nonNullable_named_optional_super_hasDefault_fromSuper_extensionType() async {
+ await assertNoErrorsInCode('''
+extension type const E(int it) {}
+
+class A {
+ A({E a = const E(0)});
+}
+
+class B extends A {
+ B({super.a});
+}
+''');
+ }
+
test_constructor_generative_nonNullable_named_optional_super_noDefault() async {
await assertErrorsInCode('''
class A {