Skip to content

Commit 4f65d69

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Handle duplicate getables and conflicting setables
Change-Id: Iea3cb2d74799f891367c27e1d5a460aa6e7ef803 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/183661 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Dmitry Stefantsov <[email protected]>
1 parent eea10ee commit 4f65d69

27 files changed

+7203
-749
lines changed

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2726,7 +2726,12 @@ class BodyBuilder extends ScopeListener<JumpTarget>
27262726
@override
27272727
void handleAssignmentExpression(Token token) {
27282728
assert(checkState(token, [
2729-
unionOfKinds(<ValueKind>[ValueKinds.Expression, ValueKinds.Generator]),
2729+
unionOfKinds(<ValueKind>[
2730+
ValueKinds.Expression,
2731+
ValueKinds.Generator,
2732+
// TODO(johnniwinther): Avoid problem builders here.
2733+
ValueKinds.ProblemBuilder
2734+
]),
27302735
unionOfKinds(<ValueKind>[
27312736
ValueKinds.Expression, ValueKinds.Generator,
27322737
// TODO(johnniwinther): Avoid problem builders here.

pkg/front_end/lib/src/fasta/source/source_library_builder.dart

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -892,55 +892,69 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
892892
assert(checkForMethodVsSetterConflict != null);
893893

894894
scope.forEachLocalSetter((String name, MemberBuilder setter) {
895-
Builder member = scope.lookupLocalMember(name, setter: false);
896-
if (member == null) {
895+
Builder getable = scope.lookupLocalMember(name, setter: false);
896+
if (getable == null) {
897897
// Setter without getter.
898898
return;
899899
}
900-
MemberBuilderImpl setterBuilder = setter;
901-
do {
902-
bool conflict = checkForInstanceVsStaticConflict &&
903-
member.isDeclarationInstanceMember !=
904-
setterBuilder.isDeclarationInstanceMember;
905-
if (member is FieldBuilder) {
906-
if (member.isAssignable) {
900+
901+
bool isConflictingSetter = false;
902+
Set<Builder> conflictingGetables = {};
903+
for (Builder currentGetable = getable;
904+
currentGetable != null;
905+
currentGetable = currentGetable.next) {
906+
if (currentGetable is FieldBuilder) {
907+
if (currentGetable.isAssignable) {
907908
// Setter with writable field.
908-
setterBuilder.isConflictingSetter = true;
909-
conflict = true;
909+
isConflictingSetter = true;
910+
conflictingGetables.add(currentGetable);
910911
}
911-
} else if (checkForMethodVsSetterConflict && !member.isGetter) {
912+
} else if (checkForMethodVsSetterConflict && !currentGetable.isGetter) {
912913
// Setter with method.
913-
conflict = true;
914+
conflictingGetables.add(currentGetable);
915+
}
916+
}
917+
for (MemberBuilderImpl currentSetter = setter;
918+
currentSetter != null;
919+
currentSetter = currentSetter.next) {
920+
bool conflict = conflictingGetables.isNotEmpty;
921+
for (Builder currentGetable = getable;
922+
currentGetable != null;
923+
currentGetable = currentGetable.next) {
924+
if (checkForInstanceVsStaticConflict &&
925+
currentGetable.isDeclarationInstanceMember !=
926+
currentSetter.isDeclarationInstanceMember) {
927+
conflict = true;
928+
conflictingGetables.add(currentGetable);
929+
}
930+
}
931+
if (isConflictingSetter) {
932+
currentSetter.isConflictingSetter = true;
914933
}
915934
if (conflict) {
916-
if (setterBuilder.isConflictingSetter) {
935+
if (currentSetter.isConflictingSetter) {
917936
sourceLibraryBuilder.addProblem(
918937
templateConflictsWithImplicitSetter.withArguments(name),
919-
setterBuilder.charOffset,
938+
currentSetter.charOffset,
920939
noLength,
921-
setterBuilder.fileUri);
922-
// TODO(ahe): Context argument to previous message?
923-
sourceLibraryBuilder.addProblem(
924-
templateConflictsWithSetter.withArguments(name),
925-
member.charOffset,
926-
noLength,
927-
member.fileUri);
940+
currentSetter.fileUri);
928941
} else {
929942
sourceLibraryBuilder.addProblem(
930943
templateConflictsWithMember.withArguments(name),
931-
setterBuilder.charOffset,
932-
noLength,
933-
setterBuilder.fileUri);
934-
// TODO(ahe): Context argument to previous message?
935-
sourceLibraryBuilder.addProblem(
936-
templateConflictsWithSetter.withArguments(name),
937-
member.charOffset,
944+
currentSetter.charOffset,
938945
noLength,
939-
member.fileUri);
946+
currentSetter.fileUri);
940947
}
941948
}
942-
setterBuilder = setterBuilder.next;
943-
} while (setterBuilder != null);
949+
}
950+
for (Builder conflictingGetable in conflictingGetables) {
951+
// TODO(ahe): Context argument to previous message?
952+
sourceLibraryBuilder.addProblem(
953+
templateConflictsWithSetter.withArguments(name),
954+
conflictingGetable.charOffset,
955+
noLength,
956+
conflictingGetable.fileUri);
957+
}
944958
});
945959
}
946960

pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.outline.expect

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,16 @@ library;
241241
// set Foo {
242242
// ^
243243
//
244+
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
245+
// set Foo => 0;
246+
// ^
247+
//
244248
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:10: Error: Conflicts with setter 'Foo'.
245249
// int A, Foo, B;
246250
// ^
247251
//
248-
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
249-
// set Foo => 0;
252+
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Conflicts with setter 'Foo'.
253+
// int Foo;
250254
// ^
251255
//
252256
import self as self;

pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.strong.expect

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,16 @@ library;
241241
// set Foo {
242242
// ^
243243
//
244+
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
245+
// set Foo => 0;
246+
// ^
247+
//
244248
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:10: Error: Conflicts with setter 'Foo'.
245249
// int A, Foo, B;
246250
// ^
247251
//
248-
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
249-
// set Foo => 0;
252+
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Conflicts with setter 'Foo'.
253+
// int Foo;
250254
// ^
251255
//
252256
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:5:13: Error: 'initializer' isn't an instance field of this class.

pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.strong.transformed.expect

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,16 @@ library;
241241
// set Foo {
242242
// ^
243243
//
244+
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
245+
// set Foo => 0;
246+
// ^
247+
//
244248
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:10: Error: Conflicts with setter 'Foo'.
245249
// int A, Foo, B;
246250
// ^
247251
//
248-
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
249-
// set Foo => 0;
252+
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Conflicts with setter 'Foo'.
253+
// int Foo;
250254
// ^
251255
//
252256
// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:5:13: Error: 'initializer' isn't an instance field of this class.

pkg/front_end/testcases/nnbd/field_vs_setter.dart

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ int? topLevelFieldAndDuplicateSetter;
99
void set topLevelFieldAndDuplicateSetter(int? value) {}
1010
void set topLevelFieldAndDuplicateSetter(int? value) {}
1111

12+
int? duplicateTopLevelFieldAndSetter1;
13+
final int? duplicateTopLevelFieldAndSetter1 = null;
14+
void set duplicateTopLevelFieldAndSetter1(int? value) {}
15+
16+
final int? duplicateTopLevelFieldAndSetter2 = null;
17+
int? duplicateTopLevelFieldAndSetter2;
18+
void set duplicateTopLevelFieldAndSetter2(int? value) {}
19+
1220
late final int? topLevelLateFinalFieldAndSetter;
1321
void set topLevelLateFinalFieldAndSetter(int? value) {}
1422

@@ -24,6 +32,14 @@ class Class {
2432
void set instanceFieldAndDuplicateSetter(int? value) {}
2533
void set instanceFieldAndDuplicateSetter(int? value) {}
2634

35+
int? duplicateInstanceFieldAndSetter1;
36+
final int? duplicateInstanceFieldAndSetter1 = null;
37+
void set duplicateInstanceFieldAndSetter1(int? value) {}
38+
39+
final int? duplicateInstanceFieldAndSetter2 = null;
40+
int? duplicateInstanceFieldAndSetter2;
41+
void set duplicateInstanceFieldAndSetter2(int? value) {}
42+
2743
late final int? instanceLateFinalFieldAndSetter;
2844
void set instanceLateFinalFieldAndSetter(int? value) {}
2945

@@ -38,6 +54,14 @@ class Class {
3854
static void set staticFieldAndDuplicateSetter(int? value) {}
3955
static void set staticFieldAndDuplicateSetter(int? value) {}
4056

57+
static int? duplicateStaticFieldAndSetter1;
58+
static final int? duplicateStaticFieldAndSetter1 = null;
59+
static void set duplicateStaticFieldAndSetter1(int? value) {}
60+
61+
static final int? duplicateStaticFieldAndSetter2 = null;
62+
static int? duplicateStaticFieldAndSetter2;
63+
static void set duplicateStaticFieldAndSetter2(int? value) {}
64+
4165
static late final int? staticLateFinalFieldAndSetter;
4266
static void set staticLateFinalFieldAndSetter(int? value) {}
4367

@@ -58,6 +82,22 @@ class Class {
5882
int? instanceFieldAndStaticDuplicateSetter;
5983
static void set instanceFieldAndStaticDuplicateSetter(int? value) {}
6084
static void set instanceFieldAndStaticDuplicateSetter(int? value) {}
85+
86+
int? duplicateInstanceFieldAndStaticSetter1;
87+
final int? duplicateInstanceFieldAndStaticSetter1 = null;
88+
static void set duplicateInstanceFieldAndStaticSetter1(int? value) {}
89+
90+
final int? duplicateInstanceFieldAndStaticSetter2 = null;
91+
int? duplicateInstanceFieldAndStaticSetter2;
92+
static void set duplicateInstanceFieldAndStaticSetter2(int? value) {}
93+
94+
static int? duplicateStaticFieldAndInstanceSetter1;
95+
static final int? duplicateStaticFieldAndInstanceSetter1 = null;
96+
void set duplicateStaticFieldAndInstanceSetter1(int? value) {}
97+
98+
static final int? duplicateStaticFieldAndInstanceSetter2 = null;
99+
static int? duplicateStaticFieldAndInstanceSetter2;
100+
void set duplicateStaticFieldAndInstanceSetter2(int? value) {}
61101
}
62102

63103
extension Extension on int? {
@@ -68,13 +108,29 @@ extension Extension on int? {
68108
void set extensionInstanceFieldAndDuplicateSetter(int? value) {}
69109
void set extensionInstanceFieldAndDuplicateSetter(int? value) {}
70110

111+
int? duplicateExtensionInstanceFieldAndSetter1;
112+
final int? duplicateExtensionInstanceFieldAndSetter1 = null;
113+
void set duplicateExtensionInstanceFieldAndSetter1(int? value) {}
114+
115+
final int? duplicateExtensionInstanceFieldAndSetter2 = null;
116+
int? duplicateExtensionInstanceFieldAndSetter2;
117+
void set duplicateExtensionInstanceFieldAndSetter2(int? value) {}
118+
71119
static int? extensionStaticFieldAndSetter;
72120
static void set extensionStaticFieldAndSetter(int? value) {}
73121

74122
static int? extensionStaticFieldAndDuplicateSetter;
75123
static void set extensionStaticFieldAndDuplicateSetter(int? value) {}
76124
static void set extensionStaticFieldAndDuplicateSetter(int? value) {}
77125

126+
static int? duplicateExtensionStaticFieldAndSetter1;
127+
static final int? duplicateExtensionStaticFieldAndSetter1 = null;
128+
static void set duplicateExtensionStaticFieldAndSetter1(int? value) {}
129+
130+
static final int? duplicateExtensionStaticFieldAndSetter2 = null;
131+
static int? duplicateExtensionStaticFieldAndSetter2;
132+
static void set duplicateExtensionStaticFieldAndSetter2(int? value) {}
133+
78134
static late final int? extensionStaticLateFinalFieldAndSetter;
79135
static void set extensionStaticLateFinalFieldAndSetter(int? value) {}
80136

@@ -95,6 +151,22 @@ extension Extension on int? {
95151
int? extensionInstanceFieldAndStaticDuplicateSetter;
96152
static void set extensionInstanceFieldAndStaticDuplicateSetter(int? value) {}
97153
static void set extensionInstanceFieldAndStaticDuplicateSetter(int? value) {}
154+
155+
int? duplicateExtensionInstanceFieldAndStaticSetter1;
156+
final int? duplicateExtensionInstanceFieldAndStaticSetter1 = null;
157+
static void set duplicateExtensionInstanceFieldAndStaticSetter1(int? value) {}
158+
159+
final int? duplicateExtensionInstanceFieldAndStaticSetter2 = null;
160+
int? duplicateExtensionInstanceFieldAndStaticSetter2;
161+
static void set duplicateExtensionInstanceFieldAndStaticSetter2(int? value) {}
162+
163+
static int? duplicateExtensionStaticFieldAndInstanceSetter1;
164+
static final int? duplicateExtensionStaticFieldAndInstanceSetter1 = null;
165+
void set duplicateExtensionStaticFieldAndInstanceSetter1(int? value) {}
166+
167+
static final int? duplicateExtensionStaticFieldAndInstanceSetter2 = null;
168+
static int? duplicateExtensionStaticFieldAndInstanceSetter2;
169+
void set duplicateExtensionStaticFieldAndInstanceSetter2(int? value) {}
98170
}
99171

100172
test() {
@@ -103,6 +175,8 @@ test() {
103175
topLevelLateFinalFieldAndSetter = topLevelLateFinalFieldAndSetter;
104176
topLevelLateFinalFieldAndDuplicateSetter =
105177
topLevelLateFinalFieldAndDuplicateSetter;
178+
duplicateTopLevelFieldAndSetter1 = duplicateTopLevelFieldAndSetter1;
179+
duplicateTopLevelFieldAndSetter2 = duplicateTopLevelFieldAndSetter2;
106180

107181
var c = new Class();
108182

@@ -111,12 +185,18 @@ test() {
111185
c.instanceLateFinalFieldAndSetter = c.instanceLateFinalFieldAndSetter;
112186
c.instanceLateFinalFieldAndDuplicateSetter =
113187
c.instanceLateFinalFieldAndDuplicateSetter;
188+
c.duplicateInstanceFieldAndStaticSetter1 =
189+
c.duplicateInstanceFieldAndStaticSetter1;
190+
c.duplicateInstanceFieldAndStaticSetter2 =
191+
c.duplicateInstanceFieldAndStaticSetter2;
114192

115193
Class.staticFieldAndSetter = Class.staticFieldAndSetter;
116194
Class.staticFieldAndDuplicateSetter = Class.staticFieldAndDuplicateSetter;
117195
Class.staticLateFinalFieldAndSetter = Class.staticLateFinalFieldAndSetter;
118196
Class.staticLateFinalFieldAndDuplicateSetter =
119197
Class.staticLateFinalFieldAndDuplicateSetter;
198+
Class.duplicateStaticFieldAndSetter1 = Class.duplicateStaticFieldAndSetter1;
199+
Class.duplicateStaticFieldAndSetter2 = Class.duplicateStaticFieldAndSetter2;
120200

121201
c.staticFieldAndInstanceSetter = Class.staticFieldAndInstanceSetter;
122202
Class.staticFieldAndInstanceSetter = Class.staticFieldAndInstanceSetter;
@@ -134,10 +214,30 @@ test() {
134214
c.instanceFieldAndStaticDuplicateSetter =
135215
c.instanceFieldAndStaticDuplicateSetter;
136216

217+
c.duplicateStaticFieldAndInstanceSetter1 =
218+
Class.duplicateStaticFieldAndInstanceSetter1;
219+
Class.duplicateStaticFieldAndInstanceSetter1 =
220+
Class.duplicateStaticFieldAndInstanceSetter1;
221+
222+
c.duplicateStaticFieldAndInstanceSetter2 =
223+
Class.duplicateStaticFieldAndInstanceSetter2;
224+
Class.duplicateStaticFieldAndInstanceSetter2 =
225+
Class.duplicateStaticFieldAndInstanceSetter2;
226+
227+
Class.duplicateInstanceFieldAndStaticSetter1 =
228+
0.duplicateInstanceFieldAndStaticSetter1;
229+
Class.duplicateInstanceFieldAndStaticSetter2 =
230+
0.duplicateInstanceFieldAndStaticSetter2;
231+
137232
0.extensionInstanceFieldAndSetter = 0.extensionInstanceFieldAndSetter;
138233
0.extensionInstanceFieldAndDuplicateSetter =
139234
0.extensionInstanceFieldAndDuplicateSetter;
140235

236+
0.duplicateExtensionInstanceFieldAndSetter1 =
237+
0.duplicateExtensionInstanceFieldAndSetter1;
238+
0.duplicateExtensionInstanceFieldAndSetter2 =
239+
0.duplicateExtensionInstanceFieldAndSetter2;
240+
141241
Extension.extensionStaticFieldAndSetter =
142242
Extension.extensionStaticFieldAndSetter;
143243

@@ -149,6 +249,10 @@ test() {
149249

150250
Extension.extensionStaticLateFinalFieldAndDuplicateSetter =
151251
Extension.extensionStaticLateFinalFieldAndDuplicateSetter;
252+
Extension.duplicateExtensionStaticFieldAndSetter1 =
253+
Extension.duplicateExtensionStaticFieldAndSetter1;
254+
Extension.duplicateExtensionStaticFieldAndSetter2 =
255+
Extension.duplicateExtensionStaticFieldAndSetter2;
152256

153257
0.extensionStaticFieldAndInstanceSetter =
154258
Extension.extensionStaticFieldAndInstanceSetter;
@@ -169,6 +273,26 @@ test() {
169273
0.extensionInstanceFieldAndStaticDuplicateSetter;
170274
0.extensionInstanceFieldAndStaticDuplicateSetter =
171275
0.extensionInstanceFieldAndStaticDuplicateSetter;
276+
277+
Extension.duplicateExtensionInstanceFieldAndStaticSetter1 =
278+
0.duplicateExtensionInstanceFieldAndStaticSetter1;
279+
0.duplicateExtensionInstanceFieldAndStaticSetter1 =
280+
0.duplicateExtensionInstanceFieldAndStaticSetter1;
281+
282+
Extension.duplicateExtensionInstanceFieldAndStaticSetter2 =
283+
0.duplicateExtensionInstanceFieldAndStaticSetter2;
284+
0.duplicateExtensionInstanceFieldAndStaticSetter2 =
285+
0.duplicateExtensionInstanceFieldAndStaticSetter2;
286+
287+
Extension.duplicateExtensionStaticFieldAndInstanceSetter1 =
288+
Extension.duplicateExtensionStaticFieldAndInstanceSetter1;
289+
0.duplicateExtensionStaticFieldAndInstanceSetter1 =
290+
Extension.duplicateExtensionStaticFieldAndInstanceSetter1;
291+
292+
Extension.duplicateExtensionStaticFieldAndInstanceSetter2 =
293+
Extension.duplicateExtensionStaticFieldAndInstanceSetter2;
294+
0.duplicateExtensionStaticFieldAndInstanceSetter2 =
295+
Extension.duplicateExtensionStaticFieldAndInstanceSetter2;
172296
}
173297

174298
main() {}

0 commit comments

Comments
 (0)