Don't report conflicts twice
Change-Id: I9dca391da6a2afc747fcf73656ab0224201cb097
Reviewed-on: https://dart-review.googlesource.com/c/88943
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 89f5f51..5221ddd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -127,21 +127,45 @@
void reportInheritanceConflict(
KernelClassBuilder cls, Declaration a, Declaration b) {
String name = a.fullNameForErrors;
- if (a.parent != cls) {
- cls.addProblem(messageInheritedMembersConflict, cls.charOffset,
- cls.fullNameForErrors.length,
- context: <LocatedMessage>[
- messageInheritedMembersConflictCause1.withLocation(
- a.fileUri, a.charOffset, name.length),
- messageInheritedMembersConflictCause2.withLocation(
- b.fileUri, b.charOffset, name.length),
- ]);
+ if (a.parent != b.parent) {
+ if (a.parent == cls) {
+ cls.addProblem(messageDeclaredMemberConflictsWithInheritedMember,
+ a.charOffset, name.length,
+ context: <LocatedMessage>[
+ messageDeclaredMemberConflictsWithInheritedMemberCause
+ .withLocation(b.fileUri, b.charOffset, name.length)
+ ]);
+ } else {
+ cls.addProblem(messageInheritedMembersConflict, cls.charOffset,
+ cls.fullNameForErrors.length,
+ context: <LocatedMessage>[
+ messageInheritedMembersConflictCause1.withLocation(
+ a.fileUri, a.charOffset, name.length),
+ messageInheritedMembersConflictCause2.withLocation(
+ b.fileUri, b.charOffset, name.length),
+ ]);
+ }
} else {
- cls.addProblem(messageDeclaredMemberConflictsWithInheritedMember,
- a.charOffset, name.length,
+ // This message can be reported twice (when merging localMembers with
+ // classSetters, or localSetters with classMembers). By ensuring that
+ // we always report the one with higher charOffset as the duplicate,
+ // the message duplication logic ensures that we only report this
+ // problem once.
+ Declaration existing;
+ Declaration duplicate;
+ assert(a.fileUri == b.fileUri);
+ if (a.charOffset < b.charOffset) {
+ existing = a;
+ duplicate = b;
+ } else {
+ existing = b;
+ duplicate = a;
+ }
+ cls.library.addProblem(templateDuplicatedDeclaration.withArguments(name),
+ duplicate.charOffset, name.length, duplicate.fileUri,
context: <LocatedMessage>[
- messageDeclaredMemberConflictsWithInheritedMemberCause.withLocation(
- b.fileUri, b.charOffset, name.length)
+ templateDuplicatedDeclarationCause.withArguments(name).withLocation(
+ existing.fileUri, existing.charOffset, name.length)
]);
}
}
@@ -154,8 +178,7 @@
/// If [mergeKind] is `MergeKind.supertypes`, [member] isn't
/// implementing/overriding anything.
void handleOnlyA(Declaration member, MergeKind mergeKind) {
- Member target = member.target;
- if (mergeKind == MergeKind.superclass && target.isAbstract) {
+ if (mergeKind == MergeKind.superclass && member.target.isAbstract) {
(abstractMembers ??= <Declaration>[]).add(member);
}
}
@@ -372,21 +395,6 @@
final Declaration setter = setters[j];
final int compare = compareDeclarations(member, setter);
if (compare == 0) {
- if (member.isField ? impliesSetter(member) : !member.isGetter) {
- // [member] conflicts with [setter].
- final String name = member.fullNameForErrors;
- cls.library.addProblem(
- templateDuplicatedDeclaration.withArguments(name),
- setter.charOffset,
- name.length,
- setter.fileUri,
- context: <LocatedMessage>[
- templateDuplicatedDeclarationCause
- .withArguments(name)
- .withLocation(
- member.fileUri, member.charOffset, name.length)
- ]);
- }
mergedSetters[storeIndex++] = setter;
i++;
j++;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
index 1edaa65..6742c9b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
@@ -6,34 +6,12 @@
// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: Previous declaration of 'foo'.
// void foo(int x) {}
// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-// void foo(int x) {}
-// ^^^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
-// void set foo(int x);
-// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: Can't declare a member that conflicts with an inherited one.
-// void set foo(int x);
-// ^^^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: This is the inherited member.
-// void foo(int x) {}
-// ^^^
// Unhandled errors:
//
// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
// void set foo(int x);
// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-// void foo(int x) {}
-// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: Can't declare a member that conflicts with an inherited one.
-// void set foo(int x);
-// ^^^
library;
import self as self;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
index 882dc86..e9e7677 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
@@ -3,14 +3,6 @@
// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
// void set foo(int x);
// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-// void foo(int x) {}
-// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: Can't declare a member that conflicts with an inherited one.
-// void set foo(int x);
-// ^^^
library;
import self as self;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
index fbde11f..d8c8b38 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
@@ -6,20 +6,6 @@
// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: Previous declaration of 'foo'.
// void foo(int x) {}
// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-// void foo(int x) {}
-// ^^^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
-// void set foo(int x);
-// ^^^
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: Can't declare a member that conflicts with an inherited one.
-// void set foo(int x);
-// ^^^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: This is the inherited member.
-// void foo(int x) {}
-// ^^^
library;
import self as self;
diff --git a/pkg/front_end/testcases/rasta/super.dart.legacy.expect b/pkg/front_end/testcases/rasta/super.dart.legacy.expect
index f359ff5..473cece 100644
--- a/pkg/front_end/testcases/rasta/super.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.legacy.expect
@@ -7,20 +7,6 @@
// void n() {}
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-// void n() {}
-// ^
-// pkg/front_end/testcases/rasta/super.dart:27:7: Context: This is the inherited member.
-// set n(_) {}
-// ^
-//
-// pkg/front_end/testcases/rasta/super.dart:27:7: Error: Can't declare a member that conflicts with an inherited one.
-// set n(_) {}
-// ^
-// pkg/front_end/testcases/rasta/super.dart:26:8: Context: This is the inherited member.
-// void n() {}
-// ^
-//
// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
// Try removing '+'.
// +super;
@@ -257,14 +243,6 @@
// set n(_) {}
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-// void n() {}
-// ^
-//
-// pkg/front_end/testcases/rasta/super.dart:27:7: Error: Can't declare a member that conflicts with an inherited one.
-// set n(_) {}
-// ^
-//
// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
// Try removing '+'.
// +super;
diff --git a/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
index 3228f16..f92047d 100644
--- a/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
@@ -4,14 +4,6 @@
// set n(_) {}
// ^
//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-// void n() {}
-// ^
-//
-// pkg/front_end/testcases/rasta/super.dart:27:7: Error: Can't declare a member that conflicts with an inherited one.
-// set n(_) {}
-// ^
-//
// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
// Try removing '+'.
// +super;
diff --git a/pkg/front_end/testcases/rasta/super.dart.outline.expect b/pkg/front_end/testcases/rasta/super.dart.outline.expect
index 0203b77..c3496aa 100644
--- a/pkg/front_end/testcases/rasta/super.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.outline.expect
@@ -6,20 +6,6 @@
// pkg/front_end/testcases/rasta/super.dart:26:8: Context: Previous declaration of 'n'.
// void n() {}
// ^
-//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-// void n() {}
-// ^
-// pkg/front_end/testcases/rasta/super.dart:27:7: Context: This is the inherited member.
-// set n(_) {}
-// ^
-//
-// pkg/front_end/testcases/rasta/super.dart:27:7: Error: Can't declare a member that conflicts with an inherited one.
-// set n(_) {}
-// ^
-// pkg/front_end/testcases/rasta/super.dart:26:8: Context: This is the inherited member.
-// void n() {}
-// ^
library;
import self as self;