Skip to content

Commit d004127

Browse files
chloestefantsovaCommit Queue
authored andcommitted
[cfe] Implement getter-setter-error for extension types
Closes #58579 Change-Id: I64c4120d80982b38f1ac378acde04351325b632d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432260 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent fd9960f commit d004127

18 files changed

+49
-287
lines changed

pkg/front_end/lib/src/builder/member_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ abstract class BuilderClassMember implements ClassMember {
223223
ClassMember get interfaceMember => this;
224224

225225
@override
226+
// Coverage-ignore(suite): Not run.
226227
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
227228
if (isStatic) {
228-
// Coverage-ignore-block(suite): Not run.
229229
return new StaticMemberResult(getMember(membersBuilder), memberKind,
230230
isDeclaredAsField:
231231
isDeclaredAsField(memberBuilder, forSetter: forSetter),

pkg/front_end/lib/src/dill/dill_extension_type_member_builder.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class DillExtensionTypeSetterBuilder extends DillExtensionTypeMemberBuilder
121121
Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
122122

123123
@override
124+
// Coverage-ignore(suite): Not run.
124125
FieldQuality get fieldQuality => FieldQuality.Absent;
125126

126127
@override
@@ -168,6 +169,7 @@ class DillExtensionTypeGetterBuilder extends DillExtensionTypeMemberBuilder
168169
Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
169170

170171
@override
172+
// Coverage-ignore(suite): Not run.
171173
FieldQuality get fieldQuality => FieldQuality.Absent;
172174

173175
@override

pkg/front_end/lib/src/dill/dill_member_builder.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ class DillClassMember extends BuilderClassMember {
367367
"member $memberBuilder.");
368368

369369
@override
370+
// Coverage-ignore(suite): Not run.
370371
bool get isSourceDeclaration => false;
371372

372373
@override
@@ -428,6 +429,7 @@ class DillClassMember extends BuilderClassMember {
428429
}
429430

430431
@override
432+
// Coverage-ignore(suite): Not run.
431433
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
432434
Member member = getMember(membersBuilder);
433435
if (member is Procedure &&

pkg/front_end/lib/src/fragment/field/class_member.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ class _SynthesizedFieldClassMember implements ClassMember {
191191
}
192192

193193
@override
194+
// Coverage-ignore(suite): Not run.
194195
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
195196
return new TypeDeclarationInstanceMemberResult(
196197
getMember(membersBuilder), memberKind,

pkg/front_end/lib/src/kernel/hierarchy/class_member.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ sealed class MemberResult {
5555
ClassMembersBuilder membersBuilder, TypeDeclarationType thisType);
5656
}
5757

58+
// Coverage-ignore(suite): Not run.
5859
class TypeDeclarationInstanceMemberResult implements MemberResult {
5960
final Member member;
6061
final ClassMemberKind kind;
@@ -90,8 +91,7 @@ class TypeDeclarationInstanceMemberResult implements MemberResult {
9091
DartType getMemberType(
9192
ClassMembersBuilder membersBuilder, TypeDeclarationType thisType) {
9293
DartType type = switch (kind) {
93-
ClassMemberKind.Method => // Coverage-ignore(suite): Not run.
94-
member.getterType,
94+
ClassMemberKind.Method => member.getterType,
9595
ClassMemberKind.Getter => member.getterType,
9696
ClassMemberKind.Setter => member.setterType,
9797
};
@@ -107,6 +107,7 @@ class TypeDeclarationInstanceMemberResult implements MemberResult {
107107
}
108108
}
109109

110+
// Coverage-ignore(suite): Not run.
110111
class StaticMemberResult implements MemberResult {
111112
final Member member;
112113
final ClassMemberKind kind;
@@ -134,14 +135,14 @@ class StaticMemberResult implements MemberResult {
134135
DartType getMemberType(
135136
ClassMembersBuilder membersBuilder, TypeDeclarationType thisType) {
136137
return switch (kind) {
137-
ClassMemberKind.Method => // Coverage-ignore(suite): Not run.
138-
member.getterType,
138+
ClassMemberKind.Method => member.getterType,
139139
ClassMemberKind.Getter => member.getterType,
140140
ClassMemberKind.Setter => member.setterType,
141141
};
142142
}
143143
}
144144

145+
// Coverage-ignore(suite): Not run.
145146
class ExtensionTypeMemberResult implements MemberResult {
146147
final ExtensionTypeDeclaration extensionTypeDeclaration;
147148
final Member member;
@@ -177,15 +178,13 @@ class ExtensionTypeMemberResult implements MemberResult {
177178
"Unexpected member type for $member (${member.runtimeType}).");
178179
FunctionType type = member.getterType as FunctionType;
179180
if (type.typeParameters.isNotEmpty) {
180-
// Coverage-ignore-block(suite): Not run.
181181
type = FunctionTypeInstantiator.instantiate(
182182
type,
183183
membersBuilder.hierarchyBuilder.types.getTypeArgumentsAsInstanceOf(
184184
thisType, extensionTypeDeclaration)!);
185185
}
186186
switch (kind) {
187187
case ClassMemberKind.Method:
188-
// Coverage-ignore(suite): Not run.
189188
// For methods [member] is the tear-off so the member type is the return
190189
// type.
191190
return type.returnType;
@@ -373,6 +372,7 @@ abstract class SynthesizedMember extends ClassMember {
373372
bool get isSetter => forSetter;
374373

375374
@override
375+
// Coverage-ignore(suite): Not run.
376376
bool get isSourceDeclaration => false;
377377

378378
@override
@@ -388,6 +388,7 @@ abstract class SynthesizedMember extends ClassMember {
388388
ClassMembersBuilder membersBuilder, Set<ClassMember> overriddenMembers) {}
389389

390390
@override
391+
// Coverage-ignore(suite): Not run.
391392
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
392393
return new TypeDeclarationInstanceMemberResult(
393394
getMember(membersBuilder), memberKind,
@@ -1078,6 +1079,7 @@ bool isDeclaredAsField(MemberBuilder memberBuilder, {required bool forSetter}) {
10781079
// Coverage-ignore(suite): Not run.
10791080
memberBuilder.setterQuality == SetterQuality.ImplicitAbstract);
10801081
} else {
1082+
// Coverage-ignore-block(suite): Not run.
10811083
return memberBuilder is PropertyBuilder && memberBuilder.hasField;
10821084
}
10831085
}

pkg/front_end/lib/src/kernel/hierarchy/delayed.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ abstract class DelayedGetterSetterCheck implements DelayedCheck {
9191

9292
LibraryBuilder get libraryBuilder => declarationBuilder.libraryBuilder;
9393

94+
// Coverage-ignore(suite): Not run.
9495
int get declarationOffset => declarationBuilder.fileOffset;
9596

97+
// Coverage-ignore(suite): Not run.
9698
Uri get declarationUri => declarationBuilder.fileUri;
9799

98100
void _checkGetterSetter({
@@ -130,6 +132,7 @@ abstract class DelayedGetterSetterCheck implements DelayedCheck {
130132
.withLocation(setterUri, setterOffset, name.text.length)
131133
]);
132134
} else if (getterIsDeclared) {
135+
// Coverage-ignore-block(suite): Not run.
133136
Template<Message Function(DartType, String, DartType, String)>
134137
template = templateInvalidGetterSetterTypeSetterInheritedGetter;
135138
if (getterIsField) {
@@ -167,6 +170,7 @@ abstract class DelayedGetterSetterCheck implements DelayedCheck {
167170
.withLocation(getterUri, getterOffset, name.text.length)
168171
]);
169172
} else {
173+
// Coverage-ignore-block(suite): Not run.
170174
Template<Message Function(DartType, String, DartType, String)>
171175
template = templateInvalidGetterSetterTypeBothInheritedGetter;
172176
Template<Message Function(String)> context =
@@ -263,6 +267,7 @@ class DelayedClassGetterSetterCheck extends DelayedGetterSetterCheck {
263267
}
264268
}
265269

270+
// Coverage-ignore(suite): Not run.
266271
class DelayedExtensionTypeGetterSetterCheck extends DelayedGetterSetterCheck {
267272
final SourceExtensionTypeDeclarationBuilder extensionTypeDeclarationBuilder;
268273
final Name name;

pkg/front_end/lib/src/kernel/hierarchy/extension_type_members.dart

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,21 @@ class ExtensionTypeMembersNodeBuilder extends MembersNodeBuilder {
218218
/// `ET1.property2` is _not_ a subtype of the setter
219219
/// `ET2.property1`.
220220
///
221-
_membersBuilder.registerGetterSetterCheck(
222-
new DelayedExtensionTypeGetterSetterCheck(
223-
extensionTypeDeclarationBuilder
224-
as SourceExtensionTypeDeclarationBuilder,
225-
name,
226-
getableMember,
227-
setableMember));
221+
SourceExtensionTypeDeclarationBuilder
222+
sourceExtensionTypeDeclarationBuilder =
223+
extensionTypeDeclarationBuilder
224+
as SourceExtensionTypeDeclarationBuilder;
225+
if (!sourceExtensionTypeDeclarationBuilder
226+
.libraryBuilder.libraryFeatures.getterSetterError.isEnabled) {
227+
// Coverage-ignore-block(suite): Not run.
228+
_membersBuilder.registerGetterSetterCheck(
229+
new DelayedExtensionTypeGetterSetterCheck(
230+
extensionTypeDeclarationBuilder
231+
as SourceExtensionTypeDeclarationBuilder,
232+
name,
233+
getableMember,
234+
setableMember));
235+
}
228236
}
229237
}
230238
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ class GetterClassMember implements ClassMember {
611611
}
612612

613613
@override
614+
// Coverage-ignore(suite): Not run.
614615
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
615616
if (isStatic) {
616617
return new StaticMemberResult(getMember(membersBuilder), memberKind,
@@ -742,6 +743,7 @@ class SetterClassMember implements ClassMember {
742743
}
743744

744745
@override
746+
// Coverage-ignore(suite): Not run.
745747
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
746748
if (isStatic) {
747749
return new StaticMemberResult(getMember(membersBuilder), memberKind,

pkg/front_end/test/coverage_suite_expected.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
295295
),
296296
// 100.0%.
297297
"package:front_end/src/builder/formal_parameter_builder.dart": (
298-
hitCount: 170,
298+
hitCount: 173,
299299
missCount: 0,
300300
),
301301
// 100.0%.
@@ -330,7 +330,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
330330
),
331331
// 100.0%.
332332
"package:front_end/src/builder/member_builder.dart": (
333-
hitCount: 83,
333+
hitCount: 63,
334334
missCount: 0,
335335
),
336336
// 100.0%.
@@ -450,7 +450,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
450450
),
451451
// 100.0%.
452452
"package:front_end/src/dill/dill_extension_type_member_builder.dart": (
453-
hitCount: 156,
453+
hitCount: 154,
454454
missCount: 0,
455455
),
456456
// 100.0%.
@@ -465,7 +465,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
465465
),
466466
// 100.0%.
467467
"package:front_end/src/dill/dill_member_builder.dart": (
468-
hitCount: 255,
468+
hitCount: 245,
469469
missCount: 0,
470470
),
471471
// 100.0%.
@@ -565,7 +565,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
565565
),
566566
// 100.0%.
567567
"package:front_end/src/fragment/field/class_member.dart": (
568-
hitCount: 136,
568+
hitCount: 129,
569569
missCount: 0,
570570
),
571571
// 100.0%.
@@ -680,7 +680,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
680680
),
681681
// 100.0%.
682682
"package:front_end/src/kernel/body_builder.dart": (
683-
hitCount: 7213,
683+
hitCount: 7215,
684684
missCount: 0,
685685
),
686686
// 100.0%.
@@ -730,7 +730,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
730730
),
731731
// 100.0%.
732732
"package:front_end/src/kernel/dynamic_module_validator.dart": (
733-
hitCount: 411,
733+
hitCount: 408,
734734
missCount: 0,
735735
),
736736
// 100.0%.
@@ -760,17 +760,17 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
760760
),
761761
// 100.0%.
762762
"package:front_end/src/kernel/hierarchy/class_member.dart": (
763-
hitCount: 388,
763+
hitCount: 290,
764764
missCount: 0,
765765
),
766766
// 100.0%.
767767
"package:front_end/src/kernel/hierarchy/delayed.dart": (
768-
hitCount: 212,
768+
hitCount: 137,
769769
missCount: 0,
770770
),
771771
// 100.0%.
772772
"package:front_end/src/kernel/hierarchy/extension_type_members.dart": (
773-
hitCount: 389,
773+
hitCount: 390,
774774
missCount: 0,
775775
),
776776
// 100.0%.
@@ -986,7 +986,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
986986
),
987987
// 100.0%.
988988
"package:front_end/src/source/source_library_builder.dart": (
989-
hitCount: 1123,
989+
hitCount: 1125,
990990
missCount: 0,
991991
),
992992
// 100.0%.
@@ -1006,7 +1006,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
10061006
),
10071007
// 100.0%.
10081008
"package:front_end/src/source/source_property_builder.dart": (
1009-
hitCount: 520,
1009+
hitCount: 474,
10101010
missCount: 0,
10111011
),
10121012
// 100.0%.

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

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -79,61 +79,6 @@ library;
7979
// void set method4(int value) {}
8080
// ^^^^^^^
8181
//
82-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:89:11: Error: The type 'int' of the getter 'ExtensionType11.property' is not a subtype of the type 'String' of the setter 'ExtensionType11.property'.
83-
// int get property => 42; /* Error */
84-
// ^^^^^^^^
85-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:90:12: Context: This is the declaration of the setter 'ExtensionType11.property'.
86-
// void set property(String value) {} /* Error */
87-
// ^^^^^^^^
88-
//
89-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:93:16: Error: The type 'int' of the inherited getter 'ClassL.property' is not a subtype of the type 'String' of the inherited setter 'ClassM.property'.
90-
// extension type ExtensionType12a(ClassLM n) /* Error */
91-
// ^
92-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:93:11: Context: This is the declaration of the getter 'ClassL.property'.
93-
// int get property => 42;
94-
// ^^^^^^^^
95-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:97:12: Context: This is the declaration of the setter 'ClassM.property'.
96-
// void set property(String value) {}
97-
// ^^^^^^^^
98-
//
99-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:98:12: Error: The type 'int' of the inherited getter 'ClassL.property' is not a subtype of the type 'bool' of the setter 'ExtensionType12b.property'.
100-
// void set property(bool value) {} /* Error */
101-
// ^^^^^^^^
102-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:93:11: Context: This is the declaration of the getter 'ClassL.property'.
103-
// int get property => 42;
104-
// ^^^^^^^^
105-
//
106-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:103:12: Error: The type 'bool' of the getter 'ExtensionType12c.property' is not a subtype of the type 'String' of the inherited setter 'ClassM.property'.
107-
// bool get property => true; /* Error */
108-
// ^^^^^^^^
109-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:97:12: Context: This is the declaration of the setter 'ClassM.property'.
110-
// void set property(String value) {}
111-
// ^^^^^^^^
112-
//
113-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:112:16: Error: The type 'int' of the inherited getter 'ExtensionTypeL.property' is not a subtype of the type 'String' of the inherited setter 'ExtensionTypeM.property'.
114-
// extension type ExtensionType13a(ClassLM i) /* Error */
115-
// ^
116-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:103:11: Context: This is the declaration of the getter 'ExtensionTypeL.property'.
117-
// int get property => 42;
118-
// ^^^^^^^^
119-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:107:12: Context: This is the declaration of the setter 'ExtensionTypeM.property'.
120-
// void set property(String value) {}
121-
// ^^^^^^^^
122-
//
123-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:117:12: Error: The type 'int' of the inherited getter 'ExtensionTypeL.property' is not a subtype of the type 'bool' of the setter 'ExtensionType13b.property'.
124-
// void set property(bool value) {} /* Error */
125-
// ^^^^^^^^
126-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:103:11: Context: This is the declaration of the getter 'ExtensionTypeL.property'.
127-
// int get property => 42;
128-
// ^^^^^^^^
129-
//
130-
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:122:12: Error: The type 'bool' of the getter 'ExtensionType13c.property' is not a subtype of the type 'String' of the inherited setter 'ExtensionTypeM.property'.
131-
// bool get property => true; /* Error */
132-
// ^^^^^^^^
133-
// pkg/front_end/testcases/extension_types/implements_conflicts_lib.dart:107:12: Context: This is the declaration of the setter 'ExtensionTypeM.property'.
134-
// void set property(String value) {}
135-
// ^^^^^^^^
136-
//
13782
// pkg/front_end/testcases/extension_types/implements_conflicts.dart:42:16: Error: Extension type 'ExtensionType6a' inherits multiple members named 'method2' with incompatible signatures.
13883
// Try adding a declaration of 'method2' to 'ExtensionType6a'.
13984
// extension type ExtensionType6a(ClassF c) /* Error */

0 commit comments

Comments
 (0)