Report CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD for generative const constructors.
...and don't report for const factory redirecting constructors.
Bug: https://github.com/dart-lang/sdk/issues/46985
Change-Id: I4be654eaa923865de2372779f2ddf880ee98edcc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/211162
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 61462f2..80e0fb6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1949,6 +1949,9 @@
if (!_enclosingExecutable.isConstConstructor) {
return;
}
+ if (!_enclosingExecutable.isGenerativeConstructor) {
+ return;
+ }
// check if there is non-final field
ClassElement classElement = constructorElement.enclosingElement;
if (!classElement.hasNonFinalField) {
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
index 0b5cf6e..36adecf 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
@@ -15,7 +15,37 @@
@reflectiveTest
class ConstConstructorWithNonFinalFieldTest extends PubPackageResolutionTest {
- test_this_named() async {
+ test_constFactoryNamed_hasNonFinal_redirect() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ int x = 0;
+ const factory A.a() = B;
+}
+
+class B implements A {
+ const B();
+ int get x => 0;
+ void set x(_) {}
+}
+''');
+ }
+
+ test_constFactoryUnnamed_hasNonFinal_redirect() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ int x = 0;
+ const factory A() = B;
+}
+
+class B implements A {
+ const B();
+ int get x => 0;
+ void set x(_) {}
+}
+''');
+ }
+
+ test_constGenerativeNamed_hasNonFinal() async {
await assertErrorsInCode(r'''
class A {
int x = 0;
@@ -26,7 +56,7 @@
]);
}
- test_this_unnamed() async {
+ test_constGenerativeUnnamed_hasNonFinal() async {
await assertErrorsInCode(r'''
class A {
int x = 0;