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;