Skip to content

Commit 496db5d

Browse files
chloestefantsovaCommit Queue
authored andcommitted
[model] Mark constructors not initializing final fields as erroneous
Change-Id: I2f464ee708396cb916e420f0985cd39ca0bfe2f1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/424980 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent be6d2e3 commit 496db5d

19 files changed

+77
-63
lines changed

pkg/front_end/lib/src/kernel/kernel_target.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,6 +1426,7 @@ class KernelTarget {
14261426
in constructorInitializedFields.entries) {
14271427
ConstructorDeclarationBuilder constructorBuilder = entry.key;
14281428
Set<SourcePropertyBuilder> fieldBuilders = entry.value;
1429+
bool hasReportedErrors = false;
14291430
for (SourcePropertyBuilder fieldBuilder
14301431
in initializedFieldBuilders!.difference(fieldBuilders)) {
14311432
if (fieldBuilder.isExtensionTypeDeclaredInstanceField) continue;
@@ -1449,6 +1450,7 @@ class KernelTarget {
14491450
.withLocation(fieldBuilder.fileUri,
14501451
fieldBuilder.fileOffset, fieldBuilder.name.length)
14511452
]);
1453+
hasReportedErrors = true;
14521454
}
14531455
} else if (fieldBuilder.fieldType is! InvalidType &&
14541456
!fieldBuilder.isLate &&
@@ -1465,9 +1467,21 @@ class KernelTarget {
14651467
.withLocation(fieldBuilder.fileUri,
14661468
fieldBuilder.fileOffset, fieldBuilder.name.length)
14671469
]);
1470+
hasReportedErrors = true;
14681471
}
14691472
}
14701473
}
1474+
1475+
if (hasReportedErrors) {
1476+
switch (constructorBuilder.invokeTarget) {
1477+
case Constructor constructorParent:
1478+
constructorParent.isErroneous = true;
1479+
case Procedure procedureParent:
1480+
procedureParent.isErroneous = true;
1481+
default:
1482+
// Do nothing.
1483+
}
1484+
}
14711485
}
14721486
}
14731487

pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.strong.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static extension-type-member method ExtensionType|constructor#(core::int it) →
7070
}
7171
static extension-type-member synthetic method ExtensionType|constructor#_#new#tearOff(core::int it) → self::ExtensionType% /* erasure=core::int, declared=! */
7272
return self::ExtensionType|constructor#(it);
73-
static extension-type-member method ExtensionType|constructor#constructorAndMethod() → self::ExtensionType% /* erasure=core::int, declared=! */ {
73+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndMethod() → self::ExtensionType% /* erasure=core::int, declared=! */ {
7474
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
7575
return #this;
7676
}
@@ -93,7 +93,7 @@ static extension-type-member synthetic method ExtensionType|constructor#_#redire
9393
static extension-type-member method ExtensionType|redirectingFactoryAndMethod(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → void {}
9494
static extension-type-member method ExtensionType|get#redirectingFactoryAndMethod(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → () → void
9595
return () → void => self::ExtensionType|redirectingFactoryAndMethod(#this);
96-
static extension-type-member method ExtensionType|constructor#constructorAndGetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
96+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndGetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
9797
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
9898
return #this;
9999
}
@@ -113,7 +113,7 @@ static extension-type-member synthetic method ExtensionType|constructor#_#redire
113113
return self::ExtensionType|constructor#constructorAndGetter();
114114
static extension-type-member method ExtensionType|get#redirectingFactoryAndGetter(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → dynamic
115115
return null;
116-
static extension-type-member method ExtensionType|constructor#constructorAndSetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
116+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndSetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
117117
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
118118
return #this;
119119
}

pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.strong.modular.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static extension-type-member method ExtensionType|constructor#(core::int it) →
7070
}
7171
static extension-type-member synthetic method ExtensionType|constructor#_#new#tearOff(core::int it) → self::ExtensionType% /* erasure=core::int, declared=! */
7272
return self::ExtensionType|constructor#(it);
73-
static extension-type-member method ExtensionType|constructor#constructorAndMethod() → self::ExtensionType% /* erasure=core::int, declared=! */ {
73+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndMethod() → self::ExtensionType% /* erasure=core::int, declared=! */ {
7474
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
7575
return #this;
7676
}
@@ -93,7 +93,7 @@ static extension-type-member synthetic method ExtensionType|constructor#_#redire
9393
static extension-type-member method ExtensionType|redirectingFactoryAndMethod(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → void {}
9494
static extension-type-member method ExtensionType|get#redirectingFactoryAndMethod(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → () → void
9595
return () → void => self::ExtensionType|redirectingFactoryAndMethod(#this);
96-
static extension-type-member method ExtensionType|constructor#constructorAndGetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
96+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndGetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
9797
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
9898
return #this;
9999
}
@@ -113,7 +113,7 @@ static extension-type-member synthetic method ExtensionType|constructor#_#redire
113113
return self::ExtensionType|constructor#constructorAndGetter();
114114
static extension-type-member method ExtensionType|get#redirectingFactoryAndGetter(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → dynamic
115115
return null;
116-
static extension-type-member method ExtensionType|constructor#constructorAndSetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
116+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndSetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
117117
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
118118
return #this;
119119
}

pkg/front_end/testcases/extension_types/constructor_member_conflict.dart.strong.transformed.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static extension-type-member method ExtensionType|constructor#(core::int it) →
7070
}
7171
static extension-type-member synthetic method ExtensionType|constructor#_#new#tearOff(core::int it) → self::ExtensionType% /* erasure=core::int, declared=! */
7272
return self::ExtensionType|constructor#(it);
73-
static extension-type-member method ExtensionType|constructor#constructorAndMethod() → self::ExtensionType% /* erasure=core::int, declared=! */ {
73+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndMethod() → self::ExtensionType% /* erasure=core::int, declared=! */ {
7474
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
7575
return #this;
7676
}
@@ -93,7 +93,7 @@ static extension-type-member synthetic method ExtensionType|constructor#_#redire
9393
static extension-type-member method ExtensionType|redirectingFactoryAndMethod(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → void {}
9494
static extension-type-member method ExtensionType|get#redirectingFactoryAndMethod(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → () → void
9595
return () → void => self::ExtensionType|redirectingFactoryAndMethod(#this);
96-
static extension-type-member method ExtensionType|constructor#constructorAndGetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
96+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndGetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
9797
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
9898
return #this;
9999
}
@@ -113,7 +113,7 @@ static extension-type-member synthetic method ExtensionType|constructor#_#redire
113113
return self::ExtensionType|constructor#constructorAndGetter();
114114
static extension-type-member method ExtensionType|get#redirectingFactoryAndGetter(lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this) → dynamic
115115
return null;
116-
static extension-type-member method ExtensionType|constructor#constructorAndSetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
116+
static extension-type-member erroneous method ExtensionType|constructor#constructorAndSetter() → self::ExtensionType% /* erasure=core::int, declared=! */ {
117117
lowered final self::ExtensionType% /* erasure=core::int, declared=! */ #this;
118118
return #this;
119119
}

pkg/front_end/testcases/extension_types/issue52119.dart.strong.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ static extension-type-member method Foo|constructor#named(core::int value, {requ
8282
}
8383
static extension-type-member synthetic method Foo|constructor#_#named#tearOff(core::int value, {required core::int subtract}) → self::Foo% /* erasure=core::int, declared=! */
8484
return self::Foo|constructor#named(value, subtract: subtract);
85-
static extension-type-member method Foo|constructor#erroneous() → self::Foo% /* erasure=core::int, declared=! */ {
85+
static extension-type-member erroneous method Foo|constructor#erroneous() → self::Foo% /* erasure=core::int, declared=! */ {
8686
lowered final self::Foo% /* erasure=core::int, declared=! */ #this;
8787
final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
8888
Foo.erroneous() : this.unresolved(); // Error

pkg/front_end/testcases/extension_types/issue52119.dart.strong.modular.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ static extension-type-member method Foo|constructor#named(core::int value, {requ
8282
}
8383
static extension-type-member synthetic method Foo|constructor#_#named#tearOff(core::int value, {required core::int subtract}) → self::Foo% /* erasure=core::int, declared=! */
8484
return self::Foo|constructor#named(value, subtract: subtract);
85-
static extension-type-member method Foo|constructor#erroneous() → self::Foo% /* erasure=core::int, declared=! */ {
85+
static extension-type-member erroneous method Foo|constructor#erroneous() → self::Foo% /* erasure=core::int, declared=! */ {
8686
lowered final self::Foo% /* erasure=core::int, declared=! */ #this;
8787
final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
8888
Foo.erroneous() : this.unresolved(); // Error

pkg/front_end/testcases/extension_types/issue52119.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ static extension-type-member method Foo|constructor#named(core::int value, {requ
8282
}
8383
static extension-type-member synthetic method Foo|constructor#_#named#tearOff(core::int value, {required core::int subtract}) → self::Foo% /* erasure=core::int, declared=! */
8484
return self::Foo|constructor#named(value, subtract: subtract);
85-
static extension-type-member method Foo|constructor#erroneous() → self::Foo% /* erasure=core::int, declared=! */ {
85+
static extension-type-member erroneous method Foo|constructor#erroneous() → self::Foo% /* erasure=core::int, declared=! */ {
8686
lowered final self::Foo% /* erasure=core::int, declared=! */ #this;
8787
final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
8888
Foo.erroneous() : this.unresolved(); // Error

pkg/front_end/testcases/general/external_constructor.dart.strong.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ class D extends core::Object {
4242
final field self::A a1;
4343
final field self::A a2;
4444
external constructor •() → self::D;
45-
constructor named(self::A a1) → self::D
45+
erroneous constructor named(self::A a1) → self::D
4646
: self::D::a2 = null, self::D::a1 = a1, super core::Object::•()
4747
;
4848
}
4949
class E extends core::Object {
5050
final field self::A a1;
5151
final field self::A a2;
52-
constructor •(self::A a2) → self::E
52+
erroneous constructor •(self::A a2) → self::E
5353
: self::E::a1 = null, self::E::a2 = a2, super core::Object::•()
5454
;
5555
external constructor named() → self::E;

pkg/front_end/testcases/general/external_constructor.dart.strong.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ class D extends core::Object {
4242
final field self::A a1;
4343
final field self::A a2;
4444
external constructor •() → self::D;
45-
constructor named(self::A a1) → self::D
45+
erroneous constructor named(self::A a1) → self::D
4646
: self::D::a2 = null, self::D::a1 = a1, super core::Object::•()
4747
;
4848
}
4949
class E extends core::Object {
5050
final field self::A a1;
5151
final field self::A a2;
52-
constructor •(self::A a2) → self::E
52+
erroneous constructor •(self::A a2) → self::E
5353
: self::E::a1 = null, self::E::a2 = a2, super core::Object::•()
5454
;
5555
external constructor named() → self::E;

pkg/front_end/testcases/general/external_constructor.dart.strong.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ class D extends core::Object {
4242
final field self::A a1;
4343
final field self::A a2;
4444
external constructor •() → self::D;
45-
constructor named(self::A a1) → self::D
45+
erroneous constructor named(self::A a1) → self::D
4646
: self::D::a2 = null, self::D::a1 = a1, super core::Object::•()
4747
;
4848
}
4949
class E extends core::Object {
5050
final field self::A a1;
5151
final field self::A a2;
52-
constructor •(self::A a2) → self::E
52+
erroneous constructor •(self::A a2) → self::E
5353
: self::E::a1 = null, self::E::a2 = a2, super core::Object::•()
5454
;
5555
external constructor named() → self::E;

0 commit comments

Comments
 (0)