Skip to content

Commit 8296060

Browse files
chloestefantsovaCommit Queue
authored andcommitted
[model] Check setters of late lower fields in overrides
This CL includes the setters induced by late lower fields into the override checks. Due to this change the erroneous overrides will be marked as such. Change-Id: Ie1ca9e6ab7e55c076c713b55dc85c6284af45ffe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426100 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 01d42a9 commit 8296060

10 files changed

+74
-10
lines changed

pkg/front_end/lib/src/source/source_class_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,7 @@ class SourceClassBuilder extends ClassBuilderImpl
14421442
!declaredMember.isConst) ||
14431443
declaredMember is Procedure && declaredMember.isSetter;
14441444
bool interfaceMemberHasSetter = (interfaceMember is Field &&
1445-
!interfaceMember.isFinal &&
1445+
!(interfaceMember.isFinal && !interfaceMember.isLate) &&
14461446
!interfaceMember.isConst) ||
14471447
interfaceMember is Procedure && interfaceMember.isSetter;
14481448
if (declaredMemberHasGetter && interfaceMemberHasGetter) {

pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart.strong.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ library;
99
// late final int? property6;
1010
// ^^^^^^^^^
1111
//
12+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:12:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
13+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
14+
// void set property6(int i); // error
15+
// ^
16+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:8:19: Context: This is the overridden method ('property6').
17+
// late final int? property6;
18+
// ^
19+
//
1220
import self as self;
1321
import "dart:core" as core;
1422

@@ -22,5 +30,5 @@ abstract class B2 extends core::Object implements self::B1 {
2230
synthetic constructor •() → self::B2
2331
: super core::Object::•()
2432
;
25-
abstract set property6(core::int i) → void;
33+
abstract erroneous set property6(core::int i) → void;
2634
}

pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart.strong.modular.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ library;
99
// late final int? property6;
1010
// ^^^^^^^^^
1111
//
12+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:12:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
13+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
14+
// void set property6(int i); // error
15+
// ^
16+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:8:19: Context: This is the overridden method ('property6').
17+
// late final int? property6;
18+
// ^
19+
//
1220
import self as self;
1321
import "dart:core" as core;
1422

@@ -22,5 +30,5 @@ abstract class B2 extends core::Object implements self::B1 {
2230
synthetic constructor •() → self::B2
2331
: super core::Object::•()
2432
;
25-
abstract set property6(core::int i) → void;
33+
abstract erroneous set property6(core::int i) → void;
2634
}

pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart.strong.outline.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ library;
99
// late final int? property6;
1010
// ^^^^^^^^^
1111
//
12+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:12:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
13+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
14+
// void set property6(int i); // error
15+
// ^
16+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:8:19: Context: This is the overridden method ('property6').
17+
// late final int? property6;
18+
// ^
19+
//
1220
import self as self;
1321
import "dart:core" as core;
1422

@@ -20,5 +28,5 @@ abstract class B1 extends core::Object {
2028
abstract class B2 extends core::Object implements self::B1 {
2129
synthetic constructor •() → self::B2
2230
;
23-
abstract set property6(core::int i) → void;
31+
abstract erroneous set property6(core::int i) → void;
2432
}

pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart.strong.transformed.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ library;
99
// late final int? property6;
1010
// ^^^^^^^^^
1111
//
12+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:12:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
13+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
14+
// void set property6(int i); // error
15+
// ^
16+
// pkg/front_end/testcases/getter_setter_error/pre_feature/getter_vs_setter_type_late.dart:8:19: Context: This is the overridden method ('property6').
17+
// late final int? property6;
18+
// ^
19+
//
1220
import self as self;
1321
import "dart:core" as core;
1422

@@ -22,5 +30,5 @@ abstract class B2 extends core::Object implements self::B1 {
2230
synthetic constructor •() → self::B2
2331
: super core::Object::•()
2432
;
25-
abstract set property6(core::int i) → void;
33+
abstract erroneous set property6(core::int i) → void;
2634
}

pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ abstract class B2 implements B1 {
2727

2828
void set property5(int? i); // ok
2929

30-
void set property6(int i); // ok
30+
void set property6(int i); // error
3131
}
3232

3333
abstract class C1 {

pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ library;
22
//
33
// Problems in library:
44
//
5+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:30:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
6+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
7+
// void set property6(int i); // error
8+
// ^
9+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:20:19: Context: This is the overridden method ('property6').
10+
// late final int? property6;
11+
// ^
12+
//
513
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
614
// Change to a subtype of 'int'.
715
// int? get property6; // error
@@ -35,7 +43,7 @@ abstract class B2 extends core::Object implements self::B1 {
3543
;
3644
abstract set property4(core::int i) → void;
3745
abstract set property5(core::int? i) → void;
38-
abstract set property6(core::int i) → void;
46+
abstract erroneous set property6(core::int i) → void;
3947
}
4048
abstract class C1 extends core::Object {
4149
late field core::int property4;

pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.modular.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ library;
22
//
33
// Problems in library:
44
//
5+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:30:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
6+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
7+
// void set property6(int i); // error
8+
// ^
9+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:20:19: Context: This is the overridden method ('property6').
10+
// late final int? property6;
11+
// ^
12+
//
513
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
614
// Change to a subtype of 'int'.
715
// int? get property6; // error
@@ -35,7 +43,7 @@ abstract class B2 extends core::Object implements self::B1 {
3543
;
3644
abstract set property4(core::int i) → void;
3745
abstract set property5(core::int? i) → void;
38-
abstract set property6(core::int i) → void;
46+
abstract erroneous set property6(core::int i) → void;
3947
}
4048
abstract class C1 extends core::Object {
4149
late field core::int property4;

pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.outline.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ library;
22
//
33
// Problems in library:
44
//
5+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:30:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
6+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
7+
// void set property6(int i); // error
8+
// ^
9+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:20:19: Context: This is the overridden method ('property6').
10+
// late final int? property6;
11+
// ^
12+
//
513
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
614
// Change to a subtype of 'int'.
715
// int? get property6; // error
@@ -32,7 +40,7 @@ abstract class B2 extends core::Object implements self::B1 {
3240
;
3341
abstract set property4(core::int i) → void;
3442
abstract set property5(core::int? i) → void;
35-
abstract set property6(core::int i) → void;
43+
abstract erroneous set property6(core::int i) → void;
3644
}
3745
abstract class C1 extends core::Object {
3846
late field core::int property4;

pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ library;
22
//
33
// Problems in library:
44
//
5+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:30:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
6+
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
7+
// void set property6(int i); // error
8+
// ^
9+
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:20:19: Context: This is the overridden method ('property6').
10+
// late final int? property6;
11+
// ^
12+
//
513
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
614
// Change to a subtype of 'int'.
715
// int? get property6; // error
@@ -35,7 +43,7 @@ abstract class B2 extends core::Object implements self::B1 {
3543
;
3644
abstract set property4(core::int i) → void;
3745
abstract set property5(core::int? i) → void;
38-
abstract set property6(core::int i) → void;
46+
abstract erroneous set property6(core::int i) → void;
3947
}
4048
abstract class C1 extends core::Object {
4149
late field core::int property4;

0 commit comments

Comments
 (0)