Issue 52144. Required super formal parameters don't inherit default values.
Bug: https://github.com/dart-lang/sdk/issues/52144
Change-Id: I6f41ed4a8d36e6a7df26cc7cebf7fedcaf355d3c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/364880
Reviewed-by: Brian Wilkerson <brianwilkerson@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 4dad802..4758ce1 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1339,6 +1339,10 @@
@override
String? get defaultValueCode {
+ if (isRequired) {
+ return null;
+ }
+
final constantInitializer = this.constantInitializer;
if (constantInitializer != null) {
return constantInitializer.toSource();
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 715d89f..85ce51e 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
@@ -252,6 +252,42 @@
''');
}
+ test_constructor_generative_super_nonNullable_named_optional_noDefault() async {
+ await assertErrorsInCode('''
+class A {
+ final int a;
+ A({this.a = 0});
+}
+
+class B extends A {
+ B({required super.a});
+}
+
+class C extends B {
+ C({super.a});
+}
+''', [
+ error(CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER, 126, 1),
+ ]);
+ }
+
+ test_constructor_generative_super_nullable_named_optional_noDefault() async {
+ await assertNoErrorsInCode('''
+class A {
+ final int? a;
+ A({this.a});
+}
+
+class B extends A {
+ B({required super.a});
+}
+
+class C extends B {
+ C({super.a});
+}
+''');
+ }
+
test_constructor_redirectingFactory_nonNullable_named_optional() async {
await assertNoErrorsInCode('''
class A {
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 1e32f5c..f6ede25 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -1142,6 +1142,7 @@
if (e is FieldFormalParameterElement) {
_sink.write('this.');
} else if (e is SuperFormalParameterElement) {
+ _sink.writeIf(e.hasDefaultValue, 'hasDefaultValue ');
_sink.write('super.');
}
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 50f6271..81f8264 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -7249,6 +7249,43 @@
''');
}
+ test_class_constructor_parameters_super_optionalNamed_defaultValue() async {
+ var library = await buildLibrary('''
+class A {
+ A({int a = 0});
+}
+
+class B extends A {
+ B({super.a});
+}
+''');
+
+ checkElementText(library, r'''
+library
+ definingUnit
+ classes
+ class A @6
+ constructors
+ @12
+ parameters
+ optionalNamed default a @19
+ type: int
+ constantInitializer
+ IntegerLiteral
+ literal: 0 @23
+ staticType: int
+ class B @37
+ supertype: A
+ constructors
+ @53
+ parameters
+ optionalNamed default final hasDefaultValue super.a @62
+ type: int
+ superConstructorParameter: self::@class::A::@constructor::new::@parameter::a
+ superConstructor: self::@class::A::@constructor::new
+''');
+ }
+
test_class_constructor_parameters_super_optionalNamed_unresolved() async {
var library = await buildLibrary('''
class A {
@@ -7400,6 +7437,43 @@
''');
}
+ test_class_constructor_parameters_super_requiredNamed_defaultValue() async {
+ var library = await buildLibrary('''
+class A {
+ A({int a = 0});
+}
+
+class B extends A {
+ B({required super.a});
+}
+''');
+
+ checkElementText(library, r'''
+library
+ definingUnit
+ classes
+ class A @6
+ constructors
+ @12
+ parameters
+ optionalNamed default a @19
+ type: int
+ constantInitializer
+ IntegerLiteral
+ literal: 0 @23
+ staticType: int
+ class B @37
+ supertype: A
+ constructors
+ @53
+ parameters
+ requiredNamed default final super.a @71
+ type: int
+ superConstructorParameter: self::@class::A::@constructor::new::@parameter::a
+ superConstructor: self::@class::A::@constructor::new
+''');
+ }
+
test_class_constructor_parameters_super_requiredPositional() async {
var library = await buildLibrary('''
class A {