[cfe] Refactor ClassHierarchyBuilder to use Tuple for computation

Change-Id: I8055552313786814bde6f66214a013a8bedb2078
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/177500
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/analysis_options_no_lints.yaml b/pkg/front_end/analysis_options_no_lints.yaml
index 25f50ec..d699e16 100644
--- a/pkg/front_end/analysis_options_no_lints.yaml
+++ b/pkg/front_end/analysis_options_no_lints.yaml
@@ -6,6 +6,7 @@
   exclude:
     - parser_testcases/**
     - test/analyser_ignored/**
+    - test/class_hierarchy/data/**
     - test/enable_non_nullable/data/**
     - test/extensions/data/**
     - test/id_testing/data/**
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index d778446..ce2ddc7 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -179,12 +179,8 @@
 
   void checkSupertypes(CoreTypes coreTypes);
 
-  void handleSeenCovariant(
-      Types types,
-      Member declaredMember,
-      Member interfaceMember,
-      bool isSetter,
-      callback(Member declaredMember, Member interfaceMember, bool isSetter));
+  void handleSeenCovariant(Types types, Member interfaceMember, bool isSetter,
+      callback(Member interfaceMember, bool isSetter));
 
   bool hasUserDefinedNoSuchMethod(
       Class klass, ClassHierarchy hierarchy, Class objectClass);
@@ -740,12 +736,8 @@
   }
 
   @override
-  void handleSeenCovariant(
-      Types types,
-      Member declaredMember,
-      Member interfaceMember,
-      bool isSetter,
-      callback(Member declaredMember, Member interfaceMember, bool isSetter)) {
+  void handleSeenCovariant(Types types, Member interfaceMember, bool isSetter,
+      callback(Member interfaceMember, bool isSetter)) {
     // When a parameter is covariant we have to check that we also
     // override the same member in all parents.
     for (Supertype supertype in interfaceMember.enclosingClass.supers) {
@@ -753,7 +745,7 @@
           supertype.classNode, interfaceMember.name,
           setter: isSetter);
       if (m != null) {
-        callback(declaredMember, m, isSetter);
+        callback(m, isSetter);
       }
     }
   }
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 1e3fce0..736be55 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -791,9 +791,6 @@
   bool get isProperty => true;
 
   @override
-  bool get isFunction => false;
-
-  @override
   bool isSameDeclaration(ClassMember other) {
     return other is SourceFieldMember && memberBuilder == other.memberBuilder;
   }
@@ -1460,9 +1457,6 @@
   bool get isProperty => isField || isGetter || isSetter;
 
   @override
-  bool get isFunction => !isProperty;
-
-  @override
   ClassBuilder get classBuilder => fieldBuilder.classBuilder;
 
   @override
@@ -1534,19 +1528,9 @@
   bool get isAbstract => _member.isAbstract;
 
   @override
-  bool get needsComputation => false;
-
-  @override
   bool get isSynthesized => false;
 
   @override
-  bool get isInheritableConflict => false;
-
-  @override
-  ClassMember withParent(ClassBuilder classBuilder) =>
-      throw new UnsupportedError("$runtimeType.withParent");
-
-  @override
   bool get hasDeclarations => false;
 
   @override
@@ -1554,10 +1538,7 @@
       throw new UnsupportedError("$runtimeType.declarations");
 
   @override
-  ClassMember get abstract => this;
-
-  @override
-  ClassMember get concrete => this;
+  ClassMember get interfaceMember => this;
 
   @override
   bool isSameDeclaration(ClassMember other) {
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index d28c5ac..b41a5a4 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -261,22 +261,12 @@
   bool get isAbstract => memberBuilder.member.isAbstract;
 
   @override
-  bool get needsComputation => false;
-
-  @override
   bool get isSynthesized => false;
 
   @override
   bool get isInternalImplementation => false;
 
   @override
-  bool get isInheritableConflict => false;
-
-  @override
-  ClassMember withParent(ClassBuilder classBuilder) =>
-      throw new UnsupportedError("$runtimeType.withParent");
-
-  @override
   bool get hasDeclarations => false;
 
   @override
@@ -284,10 +274,7 @@
       throw new UnsupportedError("$runtimeType.declarations");
 
   @override
-  ClassMember get abstract => this;
-
-  @override
-  ClassMember get concrete => this;
+  ClassMember get interfaceMember => this;
 
   @override
   String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index a56d974..388ba1d 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -639,9 +639,6 @@
       memberBuilder.kind == ProcedureKind.Setter;
 
   @override
-  bool get isFunction => !isProperty;
-
-  @override
   bool isSameDeclaration(ClassMember other) {
     return other is SourceProcedureMember &&
         memberBuilder == other.memberBuilder;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 861e245..de71663d 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -254,6 +254,7 @@
   bool get isSynthesized {
     Member member = memberBuilder.member;
     return member is Procedure &&
+        // TODO(johnniwinther): Should this just be `member.isSynthesized`?
         (member.isMemberSignature ||
             (member.isForwardingStub && !member.isForwardingSemiStub));
   }
@@ -268,9 +269,6 @@
   }
 
   @override
-  bool get isFunction => !isProperty;
-
-  @override
   void inferType(ClassHierarchyBuilder hierarchy) {
     // Do nothing; this is only for source members.
   }
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 a0fc2ac..cbc684d 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
@@ -22,6 +22,7 @@
 import 'package:kernel/src/standard_bounds.dart';
 import 'package:kernel/src/types.dart' show Types;
 
+import '../../base/common.dart';
 import '../../testing/id_testing_utils.dart' show typeToText;
 
 import '../builder/builder.dart';
@@ -62,7 +63,6 @@
 
 import '../names.dart' show noSuchMethodName;
 
-import '../problems.dart';
 import '../scope.dart' show Scope;
 
 import '../source/source_class_builder.dart';
@@ -227,13 +227,15 @@
   bool get isFinal;
   bool get isConst;
   bool get forSetter;
-  bool get isSourceDeclaration;
 
-  /// Returns `true` if this member is a regular method or operator.
-  bool get isFunction;
+  /// Returns `true` if this member corresponds to a declaration in the source
+  /// code.
+  bool get isSourceDeclaration;
 
   /// Returns `true` if this member is a field, getter or setter.
   bool get isProperty;
+
+  /// Computes the [Member] node resulting from this class member.
   Member getMember(ClassHierarchyBuilder hierarchy);
 
   /// Returns the member [Covariance] for this class member.
@@ -243,12 +245,17 @@
   String get fullName;
   String get fullNameForErrors;
   ClassBuilder get classBuilder;
+
+  /// Returns `true` if this class member is declared in Object from dart:core.
   bool isObjectMember(ClassBuilder objectClass);
   Uri get fileUri;
   int get charOffset;
+
+  /// Returns `true` if this class member is an interface member.
   bool get isAbstract;
 
-  bool get needsComputation;
+  /// Returns `true` if this member doesn't corresponds to a declaration in the
+  /// source code.
   bool get isSynthesized;
 
   // If `true` this member is not part of the interface but only part of the
@@ -258,17 +265,71 @@
   // lowering.
   bool get isInternalImplementation;
 
-  bool get isInheritableConflict;
-  ClassMember withParent(ClassBuilder classBuilder);
+  /// Returns `true` if this member is composed from a list of class members
+  /// accessible through [declarations].
   bool get hasDeclarations;
+
+  /// If [hasDeclaration] is `true`, this returns the list of class members
+  /// from which this class member is composed.
+  ///
+  /// This is used in [unfoldDeclarations] to retrieve all underlying member
+  /// source declarations, and in [toSet] to retrieve all members used for
+  /// this class member wrt. certain level of the hierarchy.
+  /// TODO(johnniwinther): Can the use of [toSet] be replaced with a direct
+  /// use of [declarations]?
   List<ClassMember> get declarations;
-  ClassMember get abstract;
-  ClassMember get concrete;
+
+  /// The interface member corresponding to this member.
+  ///
+  /// If this member is declared on the source, the interface member is
+  /// the member itself. For instance
+  ///
+  ///     abstract class Class {
+  ///        void concreteMethod() {}
+  ///        void abstractMethod();
+  ///     }
+  ///
+  /// the interface members for `concreteMethod` and `abstractMethod` are the
+  /// members themselves.
+  ///
+  /// If this member is a synthesized interface member, the
+  /// interface member is the member itself. For instance
+  ///
+  ///     abstract class Interface1 {
+  ///        void method() {}
+  ///     }
+  ///     abstract class Interface2 {
+  ///        void method() {}
+  ///     }
+  ///     abstract class Class implements Interface1, Interface2 {}
+  ///
+  /// the interface member for `method` in `Class` is the synthesized interface
+  /// member created for the implemented members `Interface1.method` and
+  /// `Interface2.method`.
+  ///
+  /// If this member is a concrete member that implements an interface member,
+  /// the interface member is the implemented interface member. For instance
+  ///
+  ///     class Super {
+  ///        void method() {}
+  ///     }
+  ///     class Interface {
+  ///        void method() {}
+  ///     }
+  ///     class Class extends Super implements Interface {}
+  ///
+  /// the interface member for `Super.method` implementing `method` in `Class`
+  /// is the synthesized interface member created for the implemented members
+  /// `Super.method` and `Interface.method`.
+  ClassMember get interfaceMember;
 
   void inferType(ClassHierarchyBuilder hierarchy);
   void registerOverrideDependency(Set<ClassMember> overriddenMembers);
 
   /// Returns `true` if this has the same underlying declaration as [other].
+  ///
+  /// This is used for avoiding unnecessary checks and can this trivially
+  /// return `false`.
   bool isSameDeclaration(ClassMember other);
 }
 
@@ -381,9 +442,10 @@
     _delayedTypeComputations.add(computation);
   }
 
-  void registerOverrideCheck(
-      SourceClassBuilder classBuilder, ClassMember a, ClassMember b) {
-    _delayedChecks.add(new DelayedOverrideCheck(classBuilder, a, b));
+  void registerOverrideCheck(SourceClassBuilder classBuilder,
+      ClassMember declaredMember, Set<ClassMember> overriddenMembers) {
+    _delayedChecks.add(new DelayedOverrideCheck(
+        classBuilder, declaredMember, overriddenMembers));
   }
 
   void registerGetterSetterCheck(
@@ -646,8 +708,6 @@
 
   bool hasNoSuchMethod = false;
 
-  List<ClassMember> abstractMembers = null;
-
   final Map<Class, Substitution> substitutions;
 
   ClassHierarchyNodeBuilder(
@@ -985,7 +1045,7 @@
     }
   }
 
-  /// Infers the field type of [declaredMember] based on [overriddenMembers].
+  /// Infers the field type of [fieldBuilder] based on [overriddenMembers].
   static void inferFieldType(
       ClassHierarchyBuilder hierarchy,
       ClassBuilder classBuilder,
@@ -1088,6 +1148,15 @@
               messageDeclaredMemberConflictsWithInheritedMemberCause
                   .withLocation(b.fileUri, b.charOffset, name.length)
             ]);
+      } else if (b.classBuilder == classBuilder) {
+        classBuilder.addProblem(
+            messageDeclaredMemberConflictsWithInheritedMember,
+            b.charOffset,
+            name.length,
+            context: <LocatedMessage>[
+              messageDeclaredMemberConflictsWithInheritedMemberCause
+                  .withLocation(a.fileUri, a.charOffset, name.length)
+            ]);
       } else {
         classBuilder.addProblem(messageInheritedMembersConflict,
             classBuilder.charOffset, classBuilder.fullNameForErrors.length,
@@ -1137,15 +1206,6 @@
     }
   }
 
-  void recordAbstractMember(ClassMember member) {
-    abstractMembers ??= <ClassMember>[];
-    if (member.hasDeclarations && classBuilder == member.classBuilder) {
-      abstractMembers.addAll(member.declarations);
-    } else {
-      abstractMembers.add(member);
-    }
-  }
-
   ClassHierarchyNode build() {
     assert(!classBuilder.isPatch);
     ClassHierarchyNode supernode;
@@ -1158,12 +1218,23 @@
       assert(supernode != null);
     }
 
+    /// Set to `true` if the class needs interfaces, that is, if it has any
+    /// members where the interface member is different from its corresponding
+    /// class members.
+    ///
+    /// This is an optimization to avoid unnecessary computation of interface
+    /// members.
+    bool hasInterfaces = false;
+
     Map<Name, Tuple> memberMap = {};
 
     Scope scope = classBuilder.scope;
 
     for (MemberBuilder memberBuilder in scope.localMembers) {
       for (ClassMember classMember in memberBuilder.localMembers) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
         Tuple tuple = memberMap[classMember.name];
         if (tuple == null) {
           memberMap[classMember.name] = new Tuple.declareMember(classMember);
@@ -1172,6 +1243,9 @@
         }
       }
       for (ClassMember classMember in memberBuilder.localSetters) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
         Tuple tuple = memberMap[classMember.name];
         if (tuple == null) {
           memberMap[classMember.name] = new Tuple.declareSetter(classMember);
@@ -1183,6 +1257,9 @@
 
     for (MemberBuilder memberBuilder in scope.localSetters) {
       for (ClassMember classMember in memberBuilder.localMembers) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
         Tuple tuple = memberMap[classMember.name];
         if (tuple == null) {
           memberMap[classMember.name] = new Tuple.declareMember(classMember);
@@ -1191,6 +1268,9 @@
         }
       }
       for (ClassMember classMember in memberBuilder.localSetters) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
         Tuple tuple = memberMap[classMember.name];
         if (tuple == null) {
           memberMap[classMember.name] = new Tuple.declareSetter(classMember);
@@ -1219,6 +1299,9 @@
 
         for (MemberBuilder memberBuilder in scope.localMembers) {
           for (ClassMember classMember in memberBuilder.localMembers) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
             Tuple tuple = memberMap[classMember.name];
             if (tuple == null) {
               memberMap[classMember.name] = new Tuple.mixInMember(classMember);
@@ -1227,6 +1310,9 @@
             }
           }
           for (ClassMember classMember in memberBuilder.localSetters) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
             Tuple tuple = memberMap[classMember.name];
             if (tuple == null) {
               memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
@@ -1238,6 +1324,9 @@
 
         for (MemberBuilder memberBuilder in scope.localSetters) {
           for (ClassMember classMember in memberBuilder.localMembers) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
             Tuple tuple = memberMap[classMember.name];
             if (tuple == null) {
               memberMap[classMember.name] = new Tuple.mixInMember(classMember);
@@ -1246,6 +1335,9 @@
             }
           }
           for (ClassMember classMember in memberBuilder.localSetters) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
             Tuple tuple = memberMap[classMember.name];
             if (tuple == null) {
               memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
@@ -1309,7 +1401,6 @@
       }
     }
 
-    bool hasInterfaces = false;
     if (supernode == null) {
       // This should be Object.
       superclasses = new List<Supertype>.filled(0, null);
@@ -1365,8 +1456,10 @@
         hasInterfaces = true;
       }
 
-      implement(supernode.interfaceMemberMap);
-      implement(supernode.interfaceSetterMap);
+      if (hasInterfaces) {
+        implement(supernode.interfaceMemberMap ?? supernode.classMemberMap);
+        implement(supernode.interfaceSetterMap ?? supernode.classSetterMap);
+      }
 
       if (directInterfaceBuilders != null) {
         for (int i = 0; i < directInterfaceBuilders.length; i++) {
@@ -1459,516 +1552,1460 @@
     /// [ClassHierarchyNode].
     Map<Name, ClassMember> interfaceSetterMap = {};
 
-    void registerOverrideCheck(
-        ClassMember member, ClassMember overriddenMember) {
+    /// Map for members declared in this class to the members that they
+    /// override. This is used for checking valid overrides and to ensure that
+    /// override inference correctly propagates inferred types through the
+    /// class hierarchy.
+    Map<ClassMember, Set<ClassMember>> declaredOverridesMap = {};
+
+    /// In case this class is a mixin application, this maps members declared in
+    /// the mixin to the members that they override. This is used for checking
+    /// valid overrides but _not_ as for [declaredOverridesMap] for override
+    /// inference.
+    Map<ClassMember, Set<ClassMember>> mixinApplicationOverridesMap = {};
+
+    /// In case this class is concrete, this maps concrete members that are
+    /// inherited into this class to the members they should override to validly
+    /// implement the interface of this class.
+    Map<ClassMember, Set<ClassMember>> inheritedImplementsMap = {};
+
+    /// In case this class is concrete, this holds the interface members
+    /// without a corresponding class member. These are either reported as
+    /// missing implementations or trigger insertion of noSuchMethod forwarders.
+    List<ClassMember> abstractMembers = [];
+
+    ClassHierarchyNodeDataForTesting dataForTesting;
+    if (retainDataForTesting) {
+      dataForTesting = new ClassHierarchyNodeDataForTesting(
+          abstractMembers,
+          declaredOverridesMap,
+          mixinApplicationOverridesMap,
+          inheritedImplementsMap);
+    }
+
+    /// Registers that the current class has an interface member without a
+    /// corresponding class member.
+    ///
+    /// This is used to report missing implementation or, in the case the class
+    /// has a user defined concrete noSuchMethod, to insert noSuchMethod
+    /// forwarders. (Currently, insertion of forwarders is handled elsewhere.)
+    ///
+    /// For instance:
+    ///
+    ///    abstract class Interface {
+    ///      method();
+    ///    }
+    ///    class Class1 implements Interface {
+    ///      // Missing implementation for `Interface.method`.
+    ///    }
+    ///    class Class2 implements Interface {
+    ///      noSuchMethod(_) {}
+    ///      // A noSuchMethod forwarder is added for `Interface.method`.
+    ///    }
+    ///
+    void registerAbstractMember(ClassMember abstractMember) {
+      if (!abstractMember.isInternalImplementation) {
+        /// If `isInternalImplementation` is `true`, the member is synthesized
+        /// implementation that does not require implementation in other
+        /// classes.
+        ///
+        /// This is for instance used for late lowering where
+        ///
+        ///    class Interface {
+        ///      late int? field;
+        ///    }
+        ///    class Class implements Interface {
+        ///      int? field;
+        ///    }
+        ///
+        /// is encoded as
+        ///
+        ///    class Interface {
+        ///      bool _#field#isSet = false;
+        ///      int? _#field = null;
+        ///      int? get field => _#field#isSet ? _#field : throw ...;
+        ///      void set field(int? value) { ... }
+        ///    }
+        ///    class Class implements Interface {
+        ///      int? field;
+        ///    }
+        ///
+        /// and `Class` should not be required to implement
+        /// `Interface._#field#isSet` and `Interface._#field`.
+        abstractMembers.add(abstractMember);
+      }
+    }
+
+    /// Registers that [inheritedMember] should be checked to validly override
+    /// [overrides].
+    ///
+    /// This is needed in the case where a concrete member is inherited into
+    /// a concrete subclass. For instance:
+    ///
+    ///    class Super {
+    ///      void method() {}
+    ///    }
+    ///    abstract class Interface {
+    ///      void method();
+    ///    }
+    ///    class Class extends Super implements Interface {}
+    ///
+    /// Here `Super.method` must be checked to be a valid implementation for
+    /// `Interface.method` by being a valid override of it.
+    void registerInheritedImplements(
+        ClassMember inheritedMember, Set<ClassMember> overrides,
+        {ClassMember aliasForTesting}) {
       if (classBuilder is SourceClassBuilder) {
-        if (overriddenMember.hasDeclarations &&
-            classBuilder == overriddenMember.classBuilder) {
-          for (int i = 0; i < overriddenMember.declarations.length; i++) {
-            hierarchy.registerOverrideCheck(
-                classBuilder, member, overriddenMember.declarations[i]);
-          }
-        } else {
-          hierarchy.registerOverrideCheck(
-              classBuilder, member, overriddenMember);
+        assert(
+            inheritedMember.classBuilder != classBuilder,
+            "Only inherited members can implement by inheritance: "
+            "${inheritedMember}");
+        inheritedImplementsMap[inheritedMember] = overrides;
+        if (dataForTesting != null && aliasForTesting != null) {
+          dataForTesting.aliasMap[aliasForTesting] = inheritedMember;
         }
       }
     }
 
-    memberMap.forEach((Name name, Tuple tuple) {
-      Set<ClassMember> overriddenMembers = {};
+    /// Returns `true` if the current class is from an opt-out library and
+    /// [classMember] is from an opt-in library.
+    ///
+    /// In this case a member signature needs to be inserted to show the
+    /// legacy erased type of the interface member. For instance:
+    ///
+    ///    // Opt-in library:
+    ///    class Super {
+    ///      int? method(int i) {}
+    ///    }
+    ///    // Opt-out library:
+    ///    class Class extends Super {
+    ///      // A member signature is inserted:
+    ///      // int* method(int* i);
+    ///    }
+    ///
+    bool needsMemberSignatureFor(ClassMember classMember) {
+      return !classBuilder.library.isNonNullableByDefault &&
+          classMember.classBuilder.library.isNonNullableByDefault;
+    }
 
-      void registerOverrideDependency(
-          ClassMember member, ClassMember overriddenMember) {
-        if (classBuilder == member.classBuilder && member.isSourceDeclaration) {
-          if (overriddenMember.hasDeclarations &&
-              classBuilder == overriddenMember.classBuilder) {
-            for (int i = 0; i < overriddenMember.declarations.length; i++) {
-              registerOverrideDependency(
-                  member, overriddenMember.declarations[i]);
-            }
+    memberMap.forEach((Name name, Tuple tuple) {
+      /// The computation starts by sanitizing the members. Conflicts between
+      /// methods and properties (getters/setters) or between static and
+      /// instance members are reported. Conflicting members and members
+      /// overridden by duplicates are removed.
+      ///
+      /// For this [definingGetable] and [definingSetable] hold the first member
+      /// of its kind found among declared, mixed in, extended and implemented
+      /// members.
+      ///
+      /// Conflicts between [definingGetable] and [definingSetable] are reported
+      /// afterwards.
+
+      ClassMember definingGetable;
+      ClassMember definingSetable;
+
+      ClassMember declaredGetable = tuple.declaredMember;
+      if (declaredGetable != null) {
+        /// class Class {
+        ///   method() {}
+        /// }
+        definingGetable = declaredGetable;
+      }
+      ClassMember declaredSetable = tuple.declaredSetter;
+      if (declaredSetable != null) {
+        /// class Class {
+        ///   set setter(value) {}
+        /// }
+        definingSetable = declaredSetable;
+      }
+
+      ClassMember mixedInGetable;
+      if (tuple.mixedInMember != null &&
+          !tuple.mixedInMember.isStatic &&
+          !tuple.mixedInMember.isDuplicate) {
+        /// We treat
+        ///
+        ///   class Mixin {
+        ///     static method1() {}
+        ///     method2() {}
+        ///     method2() {}
+        ///   }
+        ///   class Class with Mixin {}
+        ///
+        /// as
+        ///
+        ///   class Mixin {}
+        ///   class Class with Mixin {}
+        ///
+        if (definingGetable == null) {
+          /// class Mixin {
+          ///   method() {}
+          /// }
+          /// class Class with Mixin {}
+          definingGetable = mixedInGetable = tuple.mixedInMember;
+        } else if (!definingGetable.isDuplicate) {
+          // This case is currently unreachable from source code since classes
+          // cannot both declare and mix in members. From dill, this can occur
+          // but should not conflicting members.
+          //
+          // The case is handled for consistency.
+          if (definingGetable.isStatic ||
+              definingGetable.isProperty != tuple.mixedInMember.isProperty) {
+            reportInheritanceConflict(definingGetable, tuple.mixedInMember);
           } else {
-            overriddenMembers.add(overriddenMember);
+            mixedInGetable = tuple.mixedInMember;
+          }
+        }
+      }
+      ClassMember mixedInSetable;
+      if (tuple.mixedInSetter != null &&
+          !tuple.mixedInSetter.isStatic &&
+          !tuple.mixedInSetter.isDuplicate) {
+        /// We treat
+        ///
+        ///   class Mixin {
+        ///     static set setter1(value) {}
+        ///     set setter2(value) {}
+        ///     set setter2(value) {}
+        ///   }
+        ///   class Class with Mixin {}
+        ///
+        /// as
+        ///
+        ///   class Mixin {}
+        ///   class Class with Mixin {}
+        ///
+        if (definingSetable == null) {
+          /// class Mixin {
+          ///   set setter(value) {}
+          /// }
+          /// class Class with Mixin {}
+          definingSetable = mixedInSetable = tuple.mixedInSetter;
+        } else if (!definingSetable.isDuplicate) {
+          if (definingSetable.isStatic ||
+              definingSetable.isProperty != tuple.mixedInSetter.isProperty) {
+            reportInheritanceConflict(definingGetable, tuple.mixedInSetter);
+          } else {
+            mixedInSetable = tuple.mixedInSetter;
           }
         }
       }
 
-      ClassMember computeClassMember(
+      ClassMember extendedGetable;
+      if (tuple.extendedMember != null &&
+          !tuple.extendedMember.isStatic &&
+          !tuple.extendedMember.isDuplicate) {
+        /// We treat
+        ///
+        ///   class Super {
+        ///     static method1() {}
+        ///     method2() {}
+        ///     method2() {}
+        ///   }
+        ///   class Class extends Super {}
+        ///
+        /// as
+        ///
+        ///   class Super {}
+        ///   class Class extends Super {}
+        ///
+        if (definingGetable == null) {
+          /// class Super {
+          ///   method() {}
+          /// }
+          /// class Class extends Super {}
+          definingGetable = extendedGetable = tuple.extendedMember;
+        } else if (!definingGetable.isDuplicate) {
+          if (definingGetable.isStatic ||
+              definingGetable.isProperty != tuple.extendedMember.isProperty) {
+            ///   class Super {
+            ///     method() {}
+            ///   }
+            ///   class Class extends Super {
+            ///     static method() {}
+            ///   }
+            ///
+            /// or
+            ///
+            ///   class Super {
+            ///     method() {}
+            ///   }
+            ///   class Class extends Super {
+            ///     get getter => 0;
+            ///   }
+            reportInheritanceConflict(definingGetable, tuple.extendedMember);
+          } else {
+            extendedGetable = tuple.extendedMember;
+          }
+        }
+      }
+      ClassMember extendedSetable;
+      if (tuple.extendedSetter != null &&
+          !tuple.extendedSetter.isStatic &&
+          !tuple.extendedSetter.isDuplicate) {
+        /// We treat
+        ///
+        ///   class Super {
+        ///     static set setter1(value) {}
+        ///     set setter2(value) {}
+        ///     set setter2(value) {}
+        ///   }
+        ///   class Class extends Super {}
+        ///
+        /// as
+        ///
+        ///   class Super {}
+        ///   class Class extends Super {}
+        ///
+        if (definingSetable == null) {
+          /// class Super {
+          ///   set setter(value) {}
+          /// }
+          /// class Class extends Super {}
+          definingSetable = extendedSetable = tuple.extendedSetter;
+        } else if (!definingSetable.isDuplicate) {
+          if (definingSetable.isStatic ||
+              definingSetable.isProperty != tuple.extendedSetter.isProperty) {
+            reportInheritanceConflict(definingSetable, tuple.extendedSetter);
+          } else {
+            extendedSetable = tuple.extendedSetter;
+          }
+        }
+      }
+
+      // TODO(johnniwinther): Remove extended and mixed in members/setters
+      // from implemented members/setters. Mixin applications always implement
+      // the mixin class leading to unnecessary interface members.
+      List<ClassMember> implementedGetables;
+      if (tuple.implementedMembers != null &&
+          // Skip implemented members if we already have a duplicate.
+          !(definingGetable != null && definingGetable.isDuplicate)) {
+        for (int i = 0; i < tuple.implementedMembers.length; i++) {
+          ClassMember implementedGetable = tuple.implementedMembers[i];
+          if (implementedGetable.isStatic || implementedGetable.isDuplicate) {
+            /// We treat
+            ///
+            ///   class Interface {
+            ///     static method1() {}
+            ///     method2() {}
+            ///     method2() {}
+            ///   }
+            ///   class Class implements Interface {}
+            ///
+            /// as
+            ///
+            ///   class Interface {}
+            ///   class Class implements Interface {}
+            ///
+            implementedGetable = null;
+          } else {
+            if (definingGetable == null) {
+              /// class Interface {
+              ///   method() {}
+              /// }
+              /// class Class implements Interface {}
+              definingGetable = implementedGetable;
+            } else if (definingGetable.isStatic ||
+                definingGetable.isProperty != implementedGetable.isProperty) {
+              ///   class Interface {
+              ///     method() {}
+              ///   }
+              ///   class Class implements Interface {
+              ///     static method() {}
+              ///   }
+              ///
+              /// or
+              ///
+              ///   class Interface {
+              ///     method() {}
+              ///   }
+              ///   class Class implements Interface {
+              ///     get getter => 0;
+              ///   }
+              reportInheritanceConflict(definingGetable, implementedGetable);
+              implementedGetable = null;
+            }
+          }
+          if (implementedGetable == null) {
+            // On the first skipped member we add all previous.
+            implementedGetables ??= tuple.implementedMembers.take(i).toList();
+          } else if (implementedGetables != null) {
+            // If already skipping members we add [implementedGetable]
+            // explicitly.
+            implementedGetables.add(implementedGetable);
+          }
+        }
+        if (implementedGetables == null) {
+          // No members were skipped so we use the full list.
+          implementedGetables = tuple.implementedMembers;
+        } else if (implementedGetables.isEmpty) {
+          // No members were included.
+          implementedGetables = null;
+        }
+      }
+
+      List<ClassMember> implementedSetables;
+      if (tuple.implementedSetters != null &&
+          // Skip implemented setters if we already have a duplicate.
+          !(definingSetable != null && definingSetable.isDuplicate)) {
+        for (int i = 0; i < tuple.implementedSetters.length; i++) {
+          ClassMember implementedSetable = tuple.implementedSetters[i];
+          if (implementedSetable.isStatic || implementedSetable.isDuplicate) {
+            /// We treat
+            ///
+            ///   class Interface {
+            ///     static set setter1(value) {}
+            ///     set setter2(value) {}
+            ///     set setter2(value) {}
+            ///   }
+            ///   class Class implements Interface {}
+            ///
+            /// as
+            ///
+            ///   class Interface {}
+            ///   class Class implements Interface {}
+            ///
+            implementedSetable = null;
+          } else {
+            if (definingSetable == null) {
+              /// class Interface {
+              ///   set setter(value) {}
+              /// }
+              /// class Class implements Interface {}
+              definingSetable = implementedSetable;
+            } else if (definingSetable.isStatic ||
+                definingSetable.isProperty != implementedSetable.isProperty) {
+              /// class Interface {
+              ///   set setter(value) {}
+              /// }
+              /// class Class implements Interface {
+              ///   static set setter(value) {}
+              /// }
+              reportInheritanceConflict(definingSetable, implementedSetable);
+              implementedSetable = null;
+            }
+          }
+          if (implementedSetable == null) {
+            // On the first skipped setter we add all previous.
+            implementedSetables ??= tuple.implementedSetters.take(i).toList();
+          } else if (implementedSetables != null) {
+            // If already skipping setters we add [implementedSetable]
+            // explicitly.
+            implementedSetables.add(implementedSetable);
+          }
+        }
+        if (implementedSetables == null) {
+          // No setters were skipped so we use the full list.
+          implementedSetables = tuple.implementedSetters;
+        } else if (implementedSetables.isEmpty) {
+          // No setters were included.
+          implementedSetables = null;
+        }
+      }
+
+      if (definingGetable != null && definingSetable != null) {
+        if (definingGetable.isStatic != definingSetable.isStatic ||
+            definingGetable.isProperty != definingSetable.isProperty) {
+          reportInheritanceConflict(definingGetable, definingSetable);
+          // TODO(johnniwinther): Should we remove [definingSetable]? If we
+          // leave it in this conflict will also be reported in subclasses. If
+          // we remove it, any write to the setable will be unresolved.
+        }
+      }
+
+      // TODO(johnniwinther): Handle declared members together with mixed in
+      // members. This should only occur from .dill, though.
+      if (mixedInGetable != null) {
+        declaredGetable = null;
+      }
+      if (mixedInSetable != null) {
+        declaredSetable = null;
+      }
+
+      /// Set to `true` if declared members have been registered in
+      /// [registerDeclaredOverride] or [registerMixedInOverride].
+      bool hasDeclaredMembers = false;
+
+      /// Declared methods, getters and setters registered in
+      /// [registerDeclaredOverride].
+      ClassMember declaredMethod;
+      List<ClassMember> declaredProperties;
+
+      /// Declared methods, getters and setters registered in
+      /// [registerDeclaredOverride].
+      ClassMember mixedInMethod;
+      List<ClassMember> mixedInProperties;
+
+      /// Registers that [declaredMember] overrides extended and implemented
+      /// members.
+      ///
+      /// Getters and setters share overridden members so the registration
+      /// of override relations is performed after the interface members have
+      /// been computed.
+      ///
+      /// Declared members must be checked for valid override of the overridden
+      /// members _and_ must register an override dependency with the overridden
+      /// members so that override inference can propagate inferred types
+      /// correctly. For instance:
+      ///
+      ///    class Super {
+      ///      int get property => 42;
+      ///    }
+      ///    class Class extends Super {
+      ///      void set property(value) {}
+      ///    }
+      ///
+      /// Here the parameter type of the setter `Class.property` must be
+      /// inferred from the type of the getter `Super.property`.
+      void registerDeclaredOverride(ClassMember declaredMember,
+          {ClassMember aliasForTesting}) {
+        if (classBuilder is SourceClassBuilder && !declaredMember.isStatic) {
+          assert(
+              declaredMember.isSourceDeclaration &&
+                  declaredMember.classBuilder == classBuilder,
+              "Only declared members can override: ${declaredMember}");
+          hasDeclaredMembers = true;
+          if (declaredMember.isProperty) {
+            declaredProperties ??= [];
+            declaredProperties.add(declaredMember);
+          } else {
+            assert(
+                declaredMethod == null,
+                "Multiple methods unexpectedly declared: "
+                "${declaredMethod} and ${declaredMember}.");
+            declaredMethod = declaredMember;
+          }
+          if (dataForTesting != null && aliasForTesting != null) {
+            dataForTesting.aliasMap[aliasForTesting] = declaredMember;
+          }
+        }
+      }
+
+      /// Registers that [mixedMember] overrides extended and implemented
+      /// members through application.
+      ///
+      /// Getters and setters share overridden members so the registration
+      /// of override relations in performed after the interface members have
+      /// been computed.
+      ///
+      /// Declared mixed in members must be checked for valid override of the
+      /// overridden members but _not_ register an override dependency with the
+      /// overridden members. This is in contrast to declared members. For
+      /// instance:
+      ///
+      ///    class Super {
+      ///      int get property => 42;
+      ///    }
+      ///    class Mixin {
+      ///      void set property(value) {}
+      ///    }
+      ///    class Class = Super with Mixin;
+      ///
+      /// Here the parameter type of the setter `Mixin.property` must _not_ be
+      /// inferred from the type of the getter `Super.property`, but should
+      /// instead default to `dynamic`.
+      void registerMixedInOverride(ClassMember mixedInMember,
+          {ClassMember aliasForTesting}) {
+        assert(mixedInMember.classBuilder != classBuilder,
+            "Only mixin members can override by application: ${mixedInMember}");
+        if (classBuilder is SourceClassBuilder) {
+          hasDeclaredMembers = true;
+          if (mixedInMember.isProperty) {
+            mixedInProperties ??= [];
+            mixedInProperties.add(mixedInMember);
+          } else {
+            assert(
+                mixedInMethod == null,
+                "Multiple methods unexpectedly declared in mixin: "
+                "${mixedInMethod} and ${mixedInMember}.");
+            mixedInMethod = mixedInMember;
+          }
+          if (dataForTesting != null && aliasForTesting != null) {
+            dataForTesting.aliasMap[aliasForTesting] = mixedInMember;
+          }
+        }
+      }
+
+      /// Computes the class and interface members for a method, getter, or
+      /// setter in the current [tuple].
+      ///
+      /// [definingMember] is the member which defines whether the computation
+      /// is for a method, a getter or a setter.
+      /// [declaredMember] is the member declared in the current class, if any.
+      /// [mixedInMember] is the member declared in a mixin that is mixed into
+      /// the current current class, if any.
+      /// [extendedMember] is the member inherited from the super class.
+      /// [implementedMembers] are the members inherited from the super
+      /// interfaces, if none this is `null`.
+      ///
+      /// The computed class and interface members are added to [classMemberMap]
+      /// and [interfaceMemberMap], respectively.
+      ClassMember computeMembers(
+          {ClassMember definingMember,
           ClassMember declaredMember,
           ClassMember mixedInMember,
           ClassMember extendedMember,
-          bool forSetter) {
+          List<ClassMember> implementedMembers,
+          Map<Name, ClassMember> classMemberMap,
+          Map<Name, ClassMember> interfaceMemberMap}) {
+        ClassMember classMember;
+        ClassMember interfaceMember;
+
         if (mixedInMember != null) {
-          // TODO(johnniwinther): Handle members declared in mixin applications
-          // correctly.
-          declaredMember = null;
-        }
-        if (declaredMember != null) {
-          if (extendedMember != null && !extendedMember.isStatic) {
-            if (declaredMember == extendedMember) return declaredMember;
-            if (declaredMember.isDuplicate || extendedMember.isDuplicate) {
-              // Don't check overrides involving duplicated members.
-              return declaredMember;
-            }
-            ClassMember result =
-                checkInheritanceConflict(declaredMember, extendedMember);
-            if (result != null) return result;
-            assert(
-                declaredMember.isProperty == extendedMember.isProperty,
-                "Unexpected member combination: "
-                "$declaredMember vs $extendedMember");
-            result = declaredMember;
+          if (mixedInMember.isAbstract) {
+            ///    class Mixin {
+            ///      method();
+            ///    }
+            ///    class Class = Object with Mixin;
 
-            // [declaredMember] is a method declared in [cls]. This means it
-            // defines the interface of this class regardless if its abstract.
-            if (!declaredMember.isSynthesized) {
-              registerOverrideDependency(
-                  declaredMember, extendedMember.abstract);
-              registerOverrideCheck(declaredMember, extendedMember.abstract);
+            /// Interface members from the extended, mixed in, and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {};
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method();
+              ///    }
+              ///    class Class = Super with Mixin;
+              interfaceMembers.add(extendedMember.interfaceMember);
             }
 
-            if (declaredMember.isAbstract) {
-              if (extendedMember.isAbstract) {
-                recordAbstractMember(declaredMember);
-              } else {
-                if (!classBuilder.isAbstract) {
-                  // The interface of this class is [declaredMember]. But the
-                  // implementation is [extendedMember]. So [extendedMember]
-                  // must implement [declaredMember], unless [cls] is abstract.
-                  registerOverrideCheck(extendedMember, declaredMember);
-                }
-                ClassMember concrete = extendedMember.concrete;
-                result = new AbstractMemberOverridingImplementation(
-                    classBuilder,
-                    declaredMember,
-                    concrete,
-                    declaredMember.isProperty,
-                    forSetter,
-                    shouldModifyKernel,
-                    concrete.isAbstract,
-                    concrete.name);
-                hierarchy.registerMemberComputation(result);
+            interfaceMembers.add(mixedInMember);
+
+            if (implementedMembers != null) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method();
+              ///    }
+              ///    class Class = Object with Mixin implements Interface;
+              interfaceMembers.addAll(implementedMembers);
+            }
+
+            /// We always create a synthesized interface member, even in the
+            /// case of [interfaceMembers] being a singleton, to insert the
+            /// abstract mixin stub.
+            interfaceMember = new SynthesizedInterfaceMember(
+                classBuilder, name, interfaceMembers.toList(),
+                superClassMember: extendedMember,
+                canonicalMember: mixedInMember,
+                mixedInMember: mixedInMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter,
+                shouldModifyKernel: shouldModifyKernel);
+            hierarchy.registerMemberComputation(interfaceMember);
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method();
+              ///    }
+              ///    class Class = Super with Mixin;
+              ///
+              /// The concrete extended member is the class member but might
+              /// be overwritten by a concrete forwarding stub:
+              ///
+              ///    class Super {
+              ///      method(int i) {}
+              ///    }
+              ///    class Interface {
+              ///      method(covariant int i) {}
+              ///    }
+              ///    class Mixin {
+              ///      method(int i);
+              ///    }
+              ///    // A concrete forwarding stub
+              ///    //   method(covariant int i) => super.method(i);
+              ///    // will be inserted.
+              ///    class Class = Super with Mixin implements Interface;
+              ///
+              classMember = new InheritedClassMemberImplementsInterface(
+                  classBuilder, name,
+                  inheritedClassMember: extendedMember,
+                  implementedInterfaceMember: interfaceMember,
+                  forSetter: definingMember.forSetter,
+                  isProperty: definingMember.isProperty);
+              hierarchy.registerMemberComputation(classMember);
+              if (!classBuilder.isAbstract) {
+                registerInheritedImplements(extendedMember, {interfaceMember},
+                    aliasForTesting: classMember);
               }
+            } else if (!classBuilder.isAbstract) {
+              ///    class Mixin {
+              ///      method(); // Missing implementation.
+              ///    }
+              ///    class Class = Object with Mixin;
+              registerAbstractMember(interfaceMember);
             }
-            assert(
-                !(classBuilder.isMixinApplication &&
-                    declaredMember.classBuilder != classBuilder),
-                "Unexpected declared member ${declaredMember} in "
-                "${classBuilder} from foreign class.");
 
-            if (result.name == noSuchMethodName &&
-                !result.isObjectMember(objectClass)) {
-              hasNoSuchMethod = true;
-            }
-            return result;
-          } else {
-            if (declaredMember.isAbstract) {
-              recordAbstractMember(declaredMember);
-            }
-            return declaredMember;
-          }
-        } else if (mixedInMember != null) {
-          if (extendedMember != null && !extendedMember.isStatic) {
-            if (mixedInMember == extendedMember) return mixedInMember;
-            if (mixedInMember.isDuplicate || extendedMember.isDuplicate) {
-              // Don't check overrides involving duplicated members.
-              return mixedInMember;
-            }
-            ClassMember result =
-                checkInheritanceConflict(mixedInMember, extendedMember);
-            if (result != null) return result;
-            assert(
-                mixedInMember.isProperty == extendedMember.isProperty,
-                "Unexpected member combination: "
-                "$mixedInMember vs $extendedMember");
-            result = mixedInMember;
-
-            // [declaredMember] is a method declared in [cls]. This means it
-            // defines the interface of this class regardless if its abstract.
             if (!mixedInMember.isSynthesized) {
-              registerOverrideDependency(
-                  mixedInMember, extendedMember.abstract);
-              registerOverrideCheck(mixedInMember, extendedMember.abstract);
+              /// Members declared in the mixin must override extended and
+              /// implemented members.
+              ///
+              /// When loading from .dill the mixed in member might be
+              /// synthesized, for instance a member signature or forwarding
+              /// stub, and this should not be checked to override the extended
+              /// and implemented members:
+              ///
+              ///    // Opt-out library, from source:
+              ///    class Mixin {}
+              ///    // Opt-out library, from .dill:
+              ///    class Mixin {
+              ///      ...
+              ///      String* toString(); // member signature
+              ///    }
+              ///    // Opt-out library, from source:
+              ///    class Class = Object with Mixin;
+              ///    // Mixin.toString should not be checked to override
+              ///    // Object.toString.
+              ///
+              registerMixedInOverride(mixedInMember,
+                  aliasForTesting: interfaceMember);
             }
-
-            if (mixedInMember.isAbstract) {
-              if (extendedMember.isAbstract) {
-                recordAbstractMember(mixedInMember);
-              } else {
-                if (!classBuilder.isAbstract) {
-                  // The interface of this class is [declaredMember]. But the
-                  // implementation is [extendedMember]. So [extendedMember]
-                  // must implement [declaredMember], unless [cls] is abstract.
-                  registerOverrideCheck(extendedMember, mixedInMember);
-                }
-                ClassMember concrete = extendedMember.concrete;
-                result = new AbstractMemberOverridingImplementation(
-                    classBuilder,
-                    mixedInMember,
-                    concrete,
-                    mixedInMember.isProperty,
-                    forSetter,
-                    shouldModifyKernel,
-                    concrete.isAbstract,
-                    concrete.name);
-                hierarchy.registerMemberComputation(result);
-              }
-            } else {
-              assert(
-                  (classBuilder.isMixinApplication &&
-                      mixedInMember.classBuilder != classBuilder),
-                  "Unexpected mixed in member ${mixedInMember} in "
-                  "${classBuilder} from the current class.");
-              result = InheritedImplementationInterfaceConflict.combined(
-                  classBuilder,
-                  mixedInMember,
-                  /*isSuperClassMemberMixedIn = */ true,
-                  extendedMember,
-                  forSetter,
-                  shouldModifyKernel,
-                  isInheritableConflict: false);
-              if (result.needsComputation) {
-                hierarchy.registerMemberComputation(result);
-              }
-            }
-
-            if (result.name == noSuchMethodName &&
-                !result.isObjectMember(objectClass)) {
-              hasNoSuchMethod = true;
-            }
-            return result;
           } else {
-            if (mixedInMember.isAbstract) {
-              recordAbstractMember(mixedInMember);
+            assert(!mixedInMember.isAbstract);
+
+            ///    class Mixin {
+            ///      method() {}
+            ///    }
+            ///    class Class = Object with Mixin;
+            ///
+
+            /// Interface members from the extended, mixed in, and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {};
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Super with Mixin;
+              interfaceMembers.add(extendedMember.interfaceMember);
+            }
+
+            interfaceMembers.add(mixedInMember);
+
+            if (implementedMembers != null) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Object with Mixin implements Interface;
+              interfaceMembers.addAll(implementedMembers);
+            }
+
+            /// We always create a synthesized interface member, even in the
+            /// case of [interfaceMembers] being a singleton, to insert the
+            /// concrete mixin stub.
+            interfaceMember = new SynthesizedInterfaceMember(
+                classBuilder, name, interfaceMembers.toList(),
+                superClassMember: mixedInMember,
+                canonicalMember: mixedInMember,
+                mixedInMember: mixedInMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter,
+                shouldModifyKernel: shouldModifyKernel);
+            hierarchy.registerMemberComputation(interfaceMember);
+
+            /// The concrete mixed in member is the class member but will
+            /// be overwritten by a concrete mixin stub:
+            ///
+            ///    class Mixin {
+            ///       method() {}
+            ///    }
+            ///    // A concrete mixin stub
+            ///    //   method() => super.method();
+            ///    // will be inserted.
+            ///    class Class = Object with Mixin;
+            ///
+            classMember = new InheritedClassMemberImplementsInterface(
+                classBuilder, name,
+                inheritedClassMember: mixedInMember,
+                implementedInterfaceMember: interfaceMember,
+                forSetter: definingMember.forSetter,
+                isProperty: definingMember.isProperty);
+            hierarchy.registerMemberComputation(classMember);
+
+            if (!classBuilder.isAbstract) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Object with Mixin;
+              ///
+              /// [mixinMember] must implemented interface member.
+              registerInheritedImplements(mixedInMember, {interfaceMember},
+                  aliasForTesting: classMember);
+            }
+            if (!mixedInMember.isSynthesized) {
+              /// Members declared in the mixin must override extended and
+              /// implemented members.
+              ///
+              /// When loading from .dill the mixed in member might be
+              /// synthesized, for instance a member signature or forwarding
+              /// stub, and this should not be checked to override the extended
+              /// and implemented members.
+              ///
+              /// These synthesized mixed in members should always be abstract
+              /// and therefore not be handled here, but we handled them here
+              /// for consistency.
+              registerMixedInOverride(mixedInMember);
+            }
+          }
+        } else if (declaredMember != null) {
+          if (declaredMember.isAbstract) {
+            ///    class Class {
+            ///      method();
+            ///    }
+            interfaceMember = declaredMember;
+
+            /// Interface members from the declared, extended, and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {};
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super {
+              ///      method();
+              ///    }
+              interfaceMembers.add(extendedMember);
+            }
+
+            interfaceMembers.add(declaredMember);
+
+            if (implementedMembers != null) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface {
+              ///      method();
+              ///    }
+              interfaceMembers.addAll(implementedMembers);
+            }
+
+            /// If only one member defines the interface member there is no
+            /// need for a synthesized interface member, since its result will
+            /// simply be that one member.
+            if (interfaceMembers.length > 1) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super implements Interface {
+              ///      method();
+              ///    }
+              interfaceMember = new SynthesizedInterfaceMember(
+                  classBuilder, name, interfaceMembers.toList(),
+                  superClassMember: extendedMember,
+                  canonicalMember: declaredMember,
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter,
+                  shouldModifyKernel: shouldModifyKernel);
+              hierarchy.registerMemberComputation(interfaceMember);
+            }
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super {
+              ///      method();
+              ///    }
+              ///
+              /// The concrete extended member is the class member but might
+              /// be overwritten by a concrete forwarding stub:
+              ///
+              ///    class Super {
+              ///      method(int i) {}
+              ///    }
+              ///    class Interface {
+              ///      method(covariant int i) {}
+              ///    }
+              ///    class Class extends Super implements Interface {
+              ///      // This will be turned into the concrete forwarding stub
+              ///      //    method(covariant int i) => super.method(i);
+              ///      method(int i);
+              ///    }
+              ///
+              classMember = new InheritedClassMemberImplementsInterface(
+                  classBuilder, name,
+                  inheritedClassMember: extendedMember,
+                  implementedInterfaceMember: interfaceMember,
+                  forSetter: definingMember.forSetter,
+                  isProperty: definingMember.isProperty);
+              hierarchy.registerMemberComputation(classMember);
+
+              if (!classBuilder.isAbstract) {
+                ///    class Super {
+                ///      method() {}
+                ///    }
+                ///    class Class extends Super {
+                ///      method();
+                ///    }
+                ///
+                /// [extendedMember] must implemented interface member.
+                registerInheritedImplements(extendedMember, {interfaceMember},
+                    aliasForTesting: classMember);
+              }
+            } else if (!classBuilder.isAbstract) {
+              ///    class Class {
+              ///      method(); // Missing implementation.
+              ///    }
+              registerAbstractMember(declaredMember);
+            }
+
+            /// The declared member must override extended and implemented
+            /// members.
+            registerDeclaredOverride(declaredMember,
+                aliasForTesting: interfaceMember);
+          } else {
+            assert(!declaredMember.isAbstract);
+
+            ///    class Class {
+            ///      method() {}
+            ///    }
+            classMember = declaredMember;
+
+            /// The declared member must override extended and implemented
+            /// members.
+            registerDeclaredOverride(declaredMember);
+          }
+        } else if (extendedMember != null) {
+          ///    class Super {
+          ///      method() {}
+          ///    }
+          ///    class Class extends Super {}
+          assert(!extendedMember.isAbstract,
+              "Abstract extended member: ${extendedMember}");
+
+          classMember = extendedMember;
+
+          if (implementedMembers != null) {
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    class Interface {
+            ///      method() {}
+            ///    }
+            ///    class Class extends Super implements Interface {}
+            ClassMember extendedInterfaceMember =
+                extendedMember.interfaceMember;
+
+            /// Interface members from the extended and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {extendedInterfaceMember};
+
+            // TODO(johnniwinther): The extended member might be included in
+            // a synthesized implemented member. For instance:
+            //
+            //    class Super {
+            //      void method() {}
+            //    }
+            //    class Interface {
+            //      void method() {}
+            //    }
+            //    abstract class Class extends Super implements Interface {
+            //      // Synthesized interface member of
+            //      //   {Super.method, Interface.method}
+            //    }
+            //    class Sub extends Class {
+            //      // Super.method implements Class.method =
+            //      //   {Super.method, Interface.method}
+            //      // Synthesized interface member of
+            //      //   {Super.method, Class.method}
+            //    }
+            //
+            // Maybe we should recognized this.
+            interfaceMembers.addAll(implementedMembers);
+
+            /// Normally, if only one member defines the interface member there
+            /// is no need for a synthesized interface member, since its result
+            /// will simply be that one member, but if the extended member is
+            /// from an opt-in library and the current class is from an opt-out
+            /// library we need to create a member signature:
+            ///
+            ///    // Opt-in:
+            ///    class Super {
+            ///      int? method() => null;
+            ///    }
+            ///    class Interface implements Super {}
+            ///    // Opt-out:
+            ///    class Class extends Super implements Interface {
+            ///      // Member signature added:
+            ///      int* method();
+            ///    }
+            ///
+            if (interfaceMembers.length == 1 &&
+                !needsMemberSignatureFor(extendedInterfaceMember)) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface implements Super {}
+              ///    class Class extends Super implements Interface {}
+              interfaceMember = interfaceMembers.first;
             } else {
-              if (!mixedInMember.isSynthesized) {
-                mixedInMember = new InterfaceConflict(
-                    classBuilder,
-                    mixedInMember,
-                    /*_isSuperClassMemberMixedIn = */ true,
-                    [mixedInMember],
-                    mixedInMember.isProperty,
-                    forSetter,
-                    shouldModifyKernel,
-                    mixedInMember.isAbstract,
-                    mixedInMember.name,
-                    isImplicitlyAbstract: mixedInMember.isAbstract);
-                hierarchy.registerMemberComputation(mixedInMember);
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super implements Interface {}
+              interfaceMember = new SynthesizedInterfaceMember(
+                  classBuilder, name, interfaceMembers.toList(),
+                  superClassMember: extendedMember,
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter,
+                  shouldModifyKernel: shouldModifyKernel);
+              hierarchy.registerMemberComputation(interfaceMember);
+            }
+            if (interfaceMember == classMember) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface implements Super {}
+              ///    class Class extends Super implements Interface {}
+              ///
+              /// We keep track of whether a class needs interfaces, that is,
+              /// whether is has any members that have an interface member
+              /// different from its corresponding class member, so we set
+              /// [interfaceMember] to `null` so show that the interface member
+              /// is not needed.
+              interfaceMember = null;
+            } else {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super implements Interface {}
+              ///
+              /// The concrete extended member is the class member but might
+              /// be overwritten by a concrete forwarding stub:
+              ///
+              ///    class Super {
+              ///      method(int i) {}
+              ///    }
+              ///    class Interface {
+              ///      method(covariant int i) {}
+              ///    }
+              ///    class Class extends Super implements Interface {
+              ///      // A concrete forwarding stub will be created:
+              ///      //    method(covariant int i) => super.method(i);
+              ///    }
+              ///
+              classMember = new InheritedClassMemberImplementsInterface(
+                  classBuilder, name,
+                  inheritedClassMember: extendedMember,
+                  implementedInterfaceMember: interfaceMember,
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter);
+              hierarchy.registerMemberComputation(classMember);
+              if (!classBuilder.isAbstract) {
+                ///    class Super {
+                ///      method() {}
+                ///    }
+                ///    class Interface {
+                ///      method() {}
+                ///    }
+                ///    class Class extends Super implements Interface {}
+                registerInheritedImplements(extendedMember, {interfaceMember},
+                    aliasForTesting: classMember);
               }
             }
-            return mixedInMember;
+          } else if (needsMemberSignatureFor(extendedMember)) {
+            ///    // Opt-in library:
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    // opt-out library:
+            ///    class Class extends Super {}
+            interfaceMember = new SynthesizedInterfaceMember(
+                classBuilder, name, [extendedMember],
+                superClassMember: extendedMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter,
+                shouldModifyKernel: shouldModifyKernel);
+            hierarchy.registerMemberComputation(interfaceMember);
+
+            /// The concrete extended member is the class member and should
+            /// be able to be overwritten by a synthesized concrete member here,
+            /// but we handle the case for consistency.
+            classMember = new InheritedClassMemberImplementsInterface(
+                classBuilder, name,
+                inheritedClassMember: extendedMember,
+                implementedInterfaceMember: interfaceMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter);
+            hierarchy.registerMemberComputation(classMember);
           }
-        } else if (extendedMember != null && !extendedMember.isStatic) {
-          if (extendedMember.isAbstract) {
-            if (isNameVisibleIn(extendedMember.name, classBuilder.library)) {
-              recordAbstractMember(extendedMember);
+        } else if (implementedMembers != null) {
+          ///    class Interface {
+          ///      method() {}
+          ///    }
+          ///    class Class implements Interface {}
+          Set<ClassMember> interfaceMembers = implementedMembers.toSet();
+          if (interfaceMembers.isNotEmpty) {
+            /// Normally, if only one member defines the interface member there
+            /// is no need for a synthesized interface member, since its result
+            /// will simply be that one member, but if the implemented member is
+            /// from an opt-in library and the current class is from an opt-out
+            /// library we need to create a member signature:
+            ///
+            ///    // Opt-in:
+            ///    class Interface {
+            ///      int? method() => null;
+            ///    }
+            ///    // Opt-out:
+            ///    class Class implements Interface {
+            ///      // Member signature added:
+            ///      int* method();
+            ///    }
+            ///
+            if (interfaceMembers.length == 1 &&
+                !needsMemberSignatureFor(interfaceMembers.first)) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface {}
+              interfaceMember = interfaceMembers.first;
+            } else {
+              ///    class Interface1 {
+              ///      method() {}
+              ///    }
+              ///    class Interface2 {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface1, Interface2 {}
+              interfaceMember = new SynthesizedInterfaceMember(
+                  classBuilder, name, interfaceMembers.toList(),
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter,
+                  shouldModifyKernel: shouldModifyKernel);
+              hierarchy.registerMemberComputation(interfaceMember);
+            }
+            if (!classBuilder.isAbstract) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface {}
+              for (ClassMember abstractMember in interfaceMembers) {
+                registerAbstractMember(abstractMember);
+              }
             }
           }
-          if (extendedMember.name == noSuchMethodName &&
-              !extendedMember.isObjectMember(objectClass)) {
+        }
+
+        if (interfaceMember != null) {
+          // We have an explicit interface.
+          hasInterfaces = true;
+        }
+        if (classMember != null) {
+          if (name == noSuchMethodName &&
+              !classMember.isObjectMember(objectClass)) {
             hasNoSuchMethod = true;
           }
-          if (extendedMember.isInheritableConflict) {
-            extendedMember = extendedMember.withParent(classBuilder);
-            hierarchy.registerMemberComputation(extendedMember);
-          }
-          if (extendedMember.classBuilder.library.isNonNullableByDefault &&
-              !classBuilder.library.isNonNullableByDefault) {
-            if (!extendedMember.isSynthesized) {
-              extendedMember = new InterfaceConflict(
-                  classBuilder,
-                  extendedMember.concrete,
-                  /*_isSuperClassMemberMixedIn = */ false,
-                  [extendedMember],
-                  extendedMember.isProperty,
-                  forSetter,
-                  shouldModifyKernel,
-                  extendedMember.isAbstract,
-                  extendedMember.name,
-                  isImplicitlyAbstract: extendedMember.isAbstract);
-              hierarchy.registerMemberComputation(extendedMember);
-            }
-          }
-          return extendedMember;
+          classMemberMap[name] = classMember;
+          interfaceMember ??= classMember.interfaceMember;
         }
-        return null;
-      }
-
-      ClassMember computeInterfaceMember(ClassMember classMember,
-          List<ClassMember> implementedMembers, bool forSetter) {
-        ClassMember interfaceMember;
-        if (implementedMembers != null) {
-          for (ClassMember member in implementedMembers) {
-            if (member.isStatic) continue;
-            if (interfaceMember == null) {
-              interfaceMember = member;
-            } else {
-              ClassMember handleMergeConflict(ClassMember a, ClassMember b) {
-                if (a == b) return a;
-                if (a.isDuplicate || b.isDuplicate) {
-                  // Don't check overrides involving duplicated members.
-                  return a;
-                }
-                ClassMember result = checkInheritanceConflict(a, b);
-                if (result != null) return result;
-                assert(a.isProperty == b.isProperty,
-                    "Unexpected member combination: $a vs $b");
-                result = a;
-                result = InterfaceConflict.combined(
-                    classBuilder, a, b, forSetter, shouldModifyKernel);
-                return result;
-              }
-
-              interfaceMember = handleMergeConflict(interfaceMember, member);
-            }
-          }
-        }
-        if (hasInterfaces) {
-          if (interfaceMember != null) {
-            if (classMember != null) {
-              if (classMember == interfaceMember) return classMember;
-              if (classMember.isDuplicate || interfaceMember.isDuplicate) {
-                // Don't check overrides involving duplicated members.
-                return classMember;
-              }
-              ClassMember result =
-                  checkInheritanceConflict(classMember, interfaceMember);
-              if (result != null) return result;
-              assert(
-                  classMember.isProperty == interfaceMember.isProperty,
-                  "Unexpected member combination: "
-                  "$classMember vs $interfaceMember");
-              result = classMember;
-
-              // [interfaceMember] is inherited from an interface so it is
-              // implicitly abstract.
-              classMember = classMember.abstract;
-              interfaceMember = interfaceMember.abstract;
-
-              // If [classMember] is declared in this class, it defines the
-              // interface.
-              if (classMember.classBuilder == classBuilder) {
-                if (!classMember.isSynthesized) {
-                  registerOverrideDependency(classMember, interfaceMember);
-                  registerOverrideCheck(classMember, interfaceMember);
-                }
-                if (classMember.hasDeclarations) {
-                  if (interfaceMember.hasDeclarations &&
-                      interfaceMember.classBuilder == classBuilder) {
-                    addAllDeclarationsTo(
-                        interfaceMember, classMember.declarations);
-                  } else {
-                    addDeclarationIfDifferent(
-                        interfaceMember, classMember.declarations);
-                  }
-                }
-              } else {
-                if (classMember.isAbstract) {
-                  result = InterfaceConflict.combined(classBuilder, classMember,
-                      interfaceMember, forSetter, shouldModifyKernel);
-                } else {
-                  result = InheritedImplementationInterfaceConflict.combined(
-                      classBuilder,
-                      classMember,
-                      /* _isSuperClassMemberMixedIn = */ false,
-                      interfaceMember,
-                      forSetter,
-                      shouldModifyKernel);
-                }
-                if (result.needsComputation) {
-                  hierarchy.registerMemberComputation(result);
-                }
-              }
-
-              return result;
-            } else {
-              if (isNameVisibleIn(interfaceMember.name, classBuilder.library)) {
-                if (!interfaceMember.isInternalImplementation) {
-                  recordAbstractMember(interfaceMember);
-                }
-              }
-              if (interfaceMember.isInheritableConflict) {
-                interfaceMember = interfaceMember.withParent(classBuilder);
-                hierarchy.registerMemberComputation(interfaceMember);
-              }
-              if (interfaceMember.classBuilder.library.isNonNullableByDefault &&
-                  !classBuilder.library.isNonNullableByDefault) {
-                if (!interfaceMember.isSynthesized) {
-                  interfaceMember = new InterfaceConflict(
-                      classBuilder,
-                      null,
-                      /*_isSuperClassMemberMixedIn = */ false,
-                      [interfaceMember],
-                      interfaceMember.isProperty,
-                      forSetter,
-                      shouldModifyKernel,
-                      interfaceMember.isAbstract,
-                      interfaceMember.name,
-                      isImplicitlyAbstract: interfaceMember.isAbstract);
-                  hierarchy.registerMemberComputation(interfaceMember);
-                }
-              }
-              return interfaceMember;
-            }
-          } else if (classMember != null) {
-            return classMember;
-          }
+        if (interfaceMember != null) {
+          interfaceMemberMap[name] = interfaceMember;
         }
         return interfaceMember;
       }
 
-      void checkMemberVsSetter(
-          ClassMember member, ClassMember overriddenMember) {
-        if (overriddenMember.classBuilder == classBuilder &&
-            overriddenMember.hasDeclarations) {
-          for (ClassMember declaration in overriddenMember.declarations) {
-            checkMemberVsSetter(member, declaration);
-          }
-          return;
-        }
-
-        if (classBuilder is! SourceClassBuilder) return;
-        if (overriddenMember.isStatic) return;
-        if (member == overriddenMember) return;
-        if (member.isDuplicate || overriddenMember.isDuplicate) {
-          // Don't check overrides involving duplicated members.
-          return;
-        }
-        ClassMember result = checkInheritanceConflict(member, overriddenMember);
-        if (result != null) return;
-        assert(member.isProperty == overriddenMember.isProperty,
-            "Unexpected member combination: $member vs $overriddenMember");
-        if (member.classBuilder == classBuilder &&
-            overriddenMember.classBuilder != classBuilder) {
-          if (member is SourceFieldMember) {
-            registerOverrideDependency(member, overriddenMember);
-            hierarchy.registerOverrideCheck(
-                classBuilder, member, overriddenMember);
-          } else if (member is SourceProcedureMember) {
-            registerOverrideDependency(member, overriddenMember);
-            hierarchy.registerOverrideCheck(
-                classBuilder, member, overriddenMember);
-          }
-        }
+      ClassMember interfaceGetable;
+      if (definingGetable != null) {
+        interfaceGetable = computeMembers(
+            definingMember: definingGetable,
+            declaredMember: declaredGetable,
+            mixedInMember: mixedInGetable,
+            extendedMember: extendedGetable,
+            implementedMembers: implementedGetables,
+            classMemberMap: classMemberMap,
+            interfaceMemberMap: interfaceMemberMap);
       }
-
-      ClassMember classMember = computeClassMember(tuple.declaredMember,
-          tuple.mixedInMember, tuple.extendedMember, false);
-      ClassMember interfaceMember =
-          computeInterfaceMember(classMember, tuple.implementedMembers, false);
-      ClassMember classSetter = computeClassMember(tuple.declaredSetter,
-          tuple.mixedInSetter, tuple.extendedSetter, true);
-      ClassMember interfaceSetter =
-          computeInterfaceMember(classSetter, tuple.implementedSetters, true);
-
-      if ((tuple.mixedInMember != null || tuple.declaredMember != null) &&
-          classSetter != null) {
-        checkMemberVsSetter(
-            tuple.mixedInMember ?? tuple.declaredMember, classSetter);
-      }
-      if ((tuple.mixedInSetter != null || tuple.declaredSetter != null) &&
-          classMember != null) {
-        checkMemberVsSetter(
-            tuple.mixedInSetter ?? tuple.declaredSetter, classMember);
-      }
-      if (classMember != null && interfaceSetter != null) {
-        checkMemberVsSetter(classMember, interfaceSetter);
-      }
-      if (classSetter != null && interfaceMember != null) {
-        checkMemberVsSetter(classSetter, interfaceMember);
-      }
-
-      if (classMember != null &&
-          interfaceMember != null &&
-          classMember != interfaceMember) {
-        if (classMember.isAbstract == interfaceMember.isAbstract) {
-          // TODO(johnniwinther): Ensure that we don't have both class and
-          //  interface members that can give rise to a forwarding stub in
-          //  the current class. We might already have registered a delayed
-          //  member computation for the [classMember] that we're replacing
-          //  and therefore create two stubs for this member.
-          classMember = interfaceMember;
-        }
-      }
-      if (classSetter != null &&
-          interfaceSetter != null &&
-          classSetter != interfaceSetter) {
-        if (classSetter.isAbstract == interfaceSetter.isAbstract) {
-          // TODO(johnniwinther): Ensure that we don't have both class and
-          //  interface members that can give rise to a forwarding stub in
-          //  the current class. We might already have registered a delayed
-          //  member computation for the [classMember] that we're replacing
-          //  and therefore create two stubs for this member.
-          classSetter = interfaceSetter;
-        }
+      ClassMember interfaceSetable;
+      if (definingSetable != null) {
+        interfaceSetable = computeMembers(
+            definingMember: definingSetable,
+            declaredMember: declaredSetable,
+            mixedInMember: mixedInSetable,
+            extendedMember: extendedSetable,
+            implementedMembers: implementedSetables,
+            classMemberMap: classSetterMap,
+            interfaceMemberMap: interfaceSetterMap);
       }
       if (classBuilder is SourceClassBuilder) {
-        ClassMember member = interfaceMember ?? classMember;
-        ClassMember setter = interfaceSetter ?? classSetter;
-        if (member != null &&
-            setter != null &&
-            member.isProperty &&
-            setter.isProperty &&
-            member.isStatic == setter.isStatic &&
-            !member.isSameDeclaration(setter)) {
-          hierarchy.registerGetterSetterCheck(classBuilder, member, setter);
+        if (interfaceGetable != null &&
+            interfaceSetable != null &&
+            interfaceGetable.isProperty &&
+            interfaceSetable.isProperty &&
+            interfaceGetable.isStatic == interfaceSetable.isStatic &&
+            !interfaceGetable.isSameDeclaration(interfaceSetable)) {
+          /// We need to check that the getter type is a subtype of the setter
+          /// type. For instance
+          ///
+          ///    class Super {
+          ///       int get property1 => null;
+          ///       num get property2 => null;
+          ///    }
+          ///    class Mixin {
+          ///       void set property1(num value) {}
+          ///       void set property2(int value) {}
+          ///    }
+          ///    class Class = Super with Mixin;
+          ///
+          /// Here `Super.property1` and `Mixin.property1` form a valid getter/
+          /// setter pair in `Class` because the type of the getter
+          /// `Super.property1` is a subtype of the setter `Mixin.property1`.
+          ///
+          /// In contrast the pair `Super.property2` and `Mixin.property2` is
+          /// not a valid getter/setter in `Class` because the type of the getter
+          /// `Super.property2` is _not_ a subtype of the setter
+          /// `Mixin.property1`.
+          hierarchy.registerGetterSetterCheck(
+              classBuilder, interfaceGetable, interfaceSetable);
         }
       }
-      if (classMember != null) {
-        classMemberMap[name] = classMember;
-      }
-      if (interfaceMember != null) {
-        interfaceMemberMap[name] = interfaceMember;
-      }
-      if (classSetter != null) {
-        classSetterMap[name] = classSetter;
-      }
-      if (interfaceSetter != null) {
-        interfaceSetterMap[name] = interfaceSetter;
-      }
-      if (overriddenMembers.isNotEmpty) {
-        void registerOverrideDependencies(ClassMember member) {
-          if (member != null &&
-              member.classBuilder == classBuilder &&
-              member.isSourceDeclaration) {
-            member.registerOverrideDependency(overriddenMembers);
-            DelayedTypeComputation computation =
-                new DelayedTypeComputation(this, member, overriddenMembers);
-            hierarchy.registerDelayedTypeComputation(computation);
+      if (hasDeclaredMembers) {
+        Set<ClassMember> getableOverrides = {};
+        Set<ClassMember> setableOverrides = {};
+        if (extendedGetable != null) {
+          ///    (abstract) class Super {
+          ///      method() {}
+          ///      int get property => 0;
+          ///    }
+          ///    (abstract) class Class extends Super {
+          ///      method() {}
+          ///      set property(int value) {}
+          ///    }
+          getableOverrides.add(extendedGetable.interfaceMember);
+        }
+        if (extendedSetable != null) {
+          ///    (abstract) class Super {
+          ///      set setter(int value) {}
+          ///      set property(int value) {}
+          ///    }
+          ///    (abstract) class Class extends Super {
+          ///      set setter(int value) {}
+          ///      int get property => 0;
+          ///    }
+          setableOverrides.add(extendedSetable.interfaceMember);
+        }
+        if (implementedGetables != null) {
+          ///    (abstract) class Interface {
+          ///      method() {}
+          ///      int get property => 0;
+          ///    }
+          ///    (abstract) class Class implements Interface {
+          ///      method() {}
+          ///      set property(int value) {}
+          ///    }
+          getableOverrides.addAll(implementedGetables);
+        }
+        if (implementedSetables != null) {
+          ///    (abstract) class Interface {
+          ///      set setter(int value) {}
+          ///      set property(int value) {}
+          ///    }
+          ///    (abstract) class Class implements Interface {
+          ///      set setter(int value) {}
+          ///      int get property => 0;
+          ///    }
+          setableOverrides.addAll(implementedSetables);
+        }
+        if (getableOverrides.isNotEmpty || setableOverrides.isNotEmpty) {
+          if (declaredMethod != null && getableOverrides.isNotEmpty) {
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    class Class extends Super {
+            ///      method() {}
+            ///    }
+            declaredOverridesMap[declaredMethod] = getableOverrides;
+          }
+          if (declaredProperties != null) {
+            Set<ClassMember> overrides;
+            if (declaredMethod != null) {
+              ///    class Super {
+              ///      set setter() {}
+              ///    }
+              ///    class Class extends Super {
+              ///      method() {}
+              ///    }
+              overrides = setableOverrides;
+            } else {
+              ///    class Super {
+              ///      get property => null
+              ///      void set property(value) {}
+              ///    }
+              ///    class Class extends Super {
+              ///      get property => null
+              ///      void set property(value) {}
+              ///    }
+              overrides = {...getableOverrides, ...setableOverrides};
+            }
+            if (overrides.isNotEmpty) {
+              for (ClassMember declaredMember in declaredProperties) {
+                declaredOverridesMap[declaredMember] = overrides;
+              }
+            }
+          }
+          if (mixedInMethod != null && getableOverrides.isNotEmpty) {
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    class Mixin {
+            ///      method() {}
+            ///    }
+            ///    class Class = Super with Mixin;
+            mixinApplicationOverridesMap[mixedInMethod] = getableOverrides;
+          }
+          if (mixedInProperties != null) {
+            Set<ClassMember> overrides;
+            if (mixedInMethod != null) {
+              ///    class Super {
+              ///      set setter() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Super with Mixin;
+              overrides = setableOverrides;
+            } else {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin extends Super {
+              ///      method() {}
+              ///    }
+              overrides = {...getableOverrides, ...setableOverrides};
+            }
+            if (overrides.isNotEmpty) {
+              for (ClassMember mixedInMember in mixedInProperties) {
+                mixinApplicationOverridesMap[mixedInMember] = overrides;
+              }
+            }
           }
         }
-
-        registerOverrideDependencies(
-            tuple.mixedInMember ?? tuple.declaredMember);
-        registerOverrideDependencies(
-            tuple.mixedInSetter ?? tuple.declaredSetter);
       }
     });
 
+    if (classBuilder is SourceClassBuilder) {
+      // TODO(johnniwinther): Avoid duplicate override check computations
+      //  between [declaredOverridesMap], [mixinApplicationOverridesMap] and
+      //  [inheritedImplementsMap].
+
+      // TODO(johnniwinther): Ensure that a class member is only checked to
+      // validly override another member once. Currently it can happen multiple
+      // times as an inherited implementation.
+
+      declaredOverridesMap.forEach(
+          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+        /// A declared member can inherit its type from the overridden members.
+        ///
+        /// We register this with the class member itself so the it can force
+        /// computation of type on the overridden members before determining its
+        /// own type.
+        ///
+        /// Member types can be queried at arbitrary points during top level
+        /// inference so we need to ensure that types are computed in dependency
+        /// order.
+        classMember.registerOverrideDependency(overriddenMembers);
+
+        /// Not all member type are queried during top level inference so we
+        /// register delayed computation to ensure that all types have been
+        /// computed before override checks are performed.
+        DelayedTypeComputation computation =
+            new DelayedTypeComputation(this, classMember, overriddenMembers);
+        hierarchy.registerDelayedTypeComputation(computation);
+
+        /// Declared members must be checked to validly override the the
+        /// overridden members.
+        hierarchy.registerOverrideCheck(
+            classBuilder, classMember, overriddenMembers);
+      });
+
+      mixinApplicationOverridesMap.forEach(
+          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+        /// Declared mixed in members must be checked to validly override the
+        /// overridden members.
+        hierarchy.registerOverrideCheck(
+            classBuilder, classMember, overriddenMembers);
+      });
+
+      inheritedImplementsMap.forEach(
+          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+        /// Concrete members must be checked to validly override the overridden
+        /// members in concrete classes.
+        hierarchy.registerOverrideCheck(
+            classBuilder, classMember, overriddenMembers);
+      });
+    }
+
     if (!hasInterfaces) {
+      /// All interface members also class members to we don't need to store
+      /// the interface members separately.
+      assert(
+          classMemberMap.length == interfaceMemberMap.length,
+          "Class/interface member mismatch. Class members: "
+          "$classMemberMap, interface members: $interfaceMemberMap.");
+      assert(
+          classSetterMap.length == interfaceSetterMap.length,
+          "Class/interface setter mismatch. Class setters: "
+          "$classSetterMap, interface setters: $interfaceSetterMap.");
+      assert(
+          classMemberMap.keys.every((Name name) =>
+              identical(classMemberMap[name], interfaceMemberMap[name])),
+          "Class/interface member mismatch. Class members: "
+          "$classMemberMap, interface members: $interfaceMemberMap.");
+      assert(
+          classSetterMap.keys.every((Name name) =>
+              identical(classSetterMap[name], interfaceSetterMap[name])),
+          "Class/interface setter mismatch. Class setters: "
+          "$classSetterMap, interface setters: $interfaceSetterMap.");
       interfaceMemberMap = null;
       interfaceSetterMap = null;
     }
 
     if (abstractMembers != null && !classBuilder.isAbstract) {
       if (!hasNoSuchMethod) {
-        reportMissingMembers();
+        reportMissingMembers(abstractMembers);
       } else {
         installNsmHandlers();
       }
     }
 
     return new ClassHierarchyNode(
-      classBuilder,
-      classMemberMap,
-      classSetterMap,
-      interfaceMemberMap,
-      interfaceSetterMap,
-      superclasses,
-      interfaces,
-      maxInheritancePath,
-      hasNoSuchMethod,
-    );
+        classBuilder,
+        classMemberMap,
+        classSetterMap,
+        interfaceMemberMap,
+        interfaceSetterMap,
+        superclasses,
+        interfaces,
+        maxInheritancePath,
+        hasNoSuchMethod,
+        dataForTesting);
   }
 
   Supertype recordSupertype(Supertype supertype) {
@@ -2081,10 +3118,9 @@
     interfaces.add(type);
   }
 
-  void reportMissingMembers() {
+  void reportMissingMembers(List<ClassMember> abstractMembers) {
     Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
-    for (int i = 0; i < abstractMembers.length; i++) {
-      ClassMember declaration = abstractMembers[i];
+    for (ClassMember declaration in unfoldDeclarations(abstractMembers)) {
       if (isNameVisibleIn(declaration.name, classBuilder.library)) {
         String name = declaration.fullNameForErrors;
         String className = declaration.classBuilder?.fullNameForErrors;
@@ -2196,6 +3232,8 @@
 
   final bool hasNoSuchMethod;
 
+  final ClassHierarchyNodeDataForTesting dataForTesting;
+
   ClassHierarchyNode(
       this.classBuilder,
       this.classMemberMap,
@@ -2205,7 +3243,8 @@
       this.superclasses,
       this.interfaces,
       this.maxInheritancePath,
-      this.hasNoSuchMethod);
+      this.hasNoSuchMethod,
+      this.dataForTesting);
 
   /// Returns a list of all supertypes of [classBuilder], including this node.
   List<ClassHierarchyNode> computeAllSuperNodes(
@@ -2327,6 +3366,17 @@
   }
 }
 
+class ClassHierarchyNodeDataForTesting {
+  final List<ClassMember> abstractMembers;
+  final Map<ClassMember, Set<ClassMember>> declaredOverrides;
+  final Map<ClassMember, Set<ClassMember>> mixinApplicationOverrides;
+  final Map<ClassMember, Set<ClassMember>> inheritedImplements;
+  final Map<ClassMember, ClassMember> aliasMap = {};
+
+  ClassHierarchyNodeDataForTesting(this.abstractMembers, this.declaredOverrides,
+      this.mixinApplicationOverrides, this.inheritedImplements);
+}
+
 List<LocatedMessage> _inheritedConflictContext(ClassMember a, ClassMember b) {
   int length = a.fullNameForErrors.length;
   // TODO(ahe): Delete this method when it isn't used by [InterfaceResolver].
@@ -2436,25 +3486,57 @@
 }
 
 class DelayedOverrideCheck implements DelayedCheck {
-  final SourceClassBuilder classBuilder;
-  final ClassMember declaredMember;
-  final ClassMember overriddenMember;
+  final SourceClassBuilder _classBuilder;
+  final ClassMember _declaredMember;
+  final Set<ClassMember> _overriddenMembers;
 
-  const DelayedOverrideCheck(
-      this.classBuilder, this.declaredMember, this.overriddenMember);
+  DelayedOverrideCheck(
+      this._classBuilder, this._declaredMember, this._overriddenMembers);
 
   void check(ClassHierarchyBuilder hierarchy) {
-    void callback(
-        Member declaredMember, Member interfaceMember, bool isSetter) {
-      classBuilder.checkOverride(
+    Member declaredMember = _declaredMember.getMember(hierarchy);
+
+    /// If [_declaredMember] is a class member that is declared in an opt-in
+    /// library but inherited to [_classBuilder] through an opt-out class then
+    /// we need to apply legacy erasure to the declared type to get the
+    /// inherited type.
+    ///
+    /// For interface members this is handled by member signatures but since
+    /// these are abstract they will never be the inherited class member.
+    ///
+    /// For instance:
+    ///
+    ///    // Opt in:
+    ///    class Super {
+    ///      int extendedMethod(int i, {required int j}) => i;
+    ///    }
+    ///    class Mixin {
+    ///      int mixedInMethod(int i, {required int j}) => i;
+    ///    }
+    ///    // Opt out:
+    ///    class Legacy extends Super with Mixin {}
+    ///    // Opt in:
+    ///    class Class extends Legacy {
+    ///      // Valid overrides since the type of `Legacy.extendedMethod` is
+    ///      // `int* Function(int*, {int* j})`.
+    ///      int? extendedMethod(int? i, {int? j}) => i;
+    ///      // Valid overrides since the type of `Legacy.mixedInMethod` is
+    ///      // `int* Function(int*, {int* j})`.
+    ///      int? mixedInMethod(int? i, {int? j}) => i;
+    ///    }
+    ///
+    bool declaredNeedsLegacyErasure =
+        needsLegacyErasure(_classBuilder.cls, declaredMember.enclosingClass);
+    void callback(Member interfaceMember, bool isSetter) {
+      _classBuilder.checkOverride(
           hierarchy.types, declaredMember, interfaceMember, isSetter, callback,
-          isInterfaceCheck: !classBuilder.isMixinApplication);
+          isInterfaceCheck: !_classBuilder.isMixinApplication,
+          declaredNeedsLegacyErasure: declaredNeedsLegacyErasure);
     }
 
-    debug?.log("Delayed override check of ${declaredMember.fullName} "
-        "${overriddenMember.fullName} wrt. ${classBuilder.fullNameForErrors}");
-    callback(declaredMember.getMember(hierarchy),
-        overriddenMember.getMember(hierarchy), declaredMember.isSetter);
+    for (ClassMember overriddenMember in _overriddenMembers) {
+      callback(overriddenMember.getMember(hierarchy), _declaredMember.isSetter);
+    }
   }
 }
 
@@ -2504,564 +3586,6 @@
       '${builder.classBuilder.name},$declaredMember,$overriddenMembers)';
 }
 
-abstract class DelayedMember implements ClassMember {
-  /// The class which has inherited [declarations].
-  @override
-  final ClassBuilder classBuilder;
-
-  bool get hasDeclarations => true;
-
-  /// Conflicting declarations.
-  final List<ClassMember> declarations;
-
-  final bool isProperty;
-
-  final bool isSetter;
-
-  final bool modifyKernel;
-
-  final bool isExplicitlyAbstract;
-
-  @override
-  final Name name;
-
-  DelayedMember(this.classBuilder, this.declarations, this.isProperty,
-      this.isSetter, this.modifyKernel, this.isExplicitlyAbstract, this.name) {
-    assert(declarations.every((element) => element.isProperty == isProperty),
-        "isProperty mismatch for $this");
-  }
-
-  @override
-  bool get isSourceDeclaration => false;
-
-  @override
-  bool get needsComputation => true;
-
-  @override
-  bool get isSynthesized => true;
-
-  @override
-  bool get isInternalImplementation => false;
-
-  @override
-  bool get forSetter => isSetter;
-
-  @override
-  bool get isFunction => !isProperty;
-
-  @override
-  bool get isAbstract => isExplicitlyAbstract;
-
-  bool get isStatic => false;
-  bool get isField => false;
-  bool get isGetter => false;
-  bool get isFinal => false;
-  bool get isConst => false;
-  bool get isAssignable => false;
-  bool get isDuplicate => false;
-
-  DelayedMember withParent(ClassBuilder parent);
-
-  @override
-  ClassMember get abstract => this;
-
-  @override
-  ClassMember get concrete => this;
-
-  @override
-  Uri get fileUri => classBuilder.fileUri;
-
-  @override
-  int get charOffset => classBuilder.charOffset;
-
-  @override
-  String get fullNameForErrors =>
-      declarations.map((ClassMember m) => m.fullName).join("%");
-
-  bool get isInheritableConflict => true;
-
-  String get fullName {
-    String suffix = isSetter ? "=" : "";
-    return "${fullNameForErrors}$suffix";
-  }
-
-  @override
-  void inferType(ClassHierarchyBuilder hierarchy) {
-    // Do nothing; this is only for declared members.
-  }
-
-  @override
-  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
-    // Do nothing; this is only for declared members.
-  }
-}
-
-/// This represents a concrete implementation inherited from a superclass that
-/// has conflicts with methods inherited from an interface. The concrete
-/// implementation is the first element of [declarations].
-class InheritedImplementationInterfaceConflict extends DelayedMember {
-  Member _member;
-  Covariance _covariance;
-  final ClassMember concreteMember;
-  final bool _isSuperClassMemberMixedIn;
-
-  @override
-  final bool isInheritableConflict;
-
-  InheritedImplementationInterfaceConflict(
-      ClassBuilder parent,
-      this.concreteMember,
-      this._isSuperClassMemberMixedIn,
-      List<ClassMember> declarations,
-      bool isProperty,
-      bool isSetter,
-      bool modifyKernel,
-      bool isAbstract,
-      Name name,
-      {this.isInheritableConflict = true})
-      : assert(!concreteMember.isAbstract),
-        super(parent, declarations, isProperty, isSetter, modifyKernel,
-            isAbstract, name);
-
-  @override
-  bool isObjectMember(ClassBuilder objectClass) {
-    return concreteMember.isObjectMember(objectClass);
-  }
-
-  @override
-  String toString() {
-    return "InheritedImplementationInterfaceConflict("
-        "${classBuilder.fullNameForErrors}, $concreteMember, "
-        "[${declarations.join(', ')}])";
-  }
-
-  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
-    if (_member == null) {
-      if (!classBuilder.isAbstract) {
-        if (classBuilder is SourceClassBuilder) {
-          for (int i = 0; i < declarations.length; i++) {
-            if (concreteMember != declarations[i]) {
-              new DelayedOverrideCheck(
-                      classBuilder, concreteMember, declarations[i])
-                  .check(hierarchy);
-            }
-          }
-        }
-      }
-      InterfaceConflict interfaceConflict = new InterfaceConflict(
-          classBuilder,
-          concreteMember,
-          /*_isSuperClassMemberMixedIn = */ _isSuperClassMemberMixedIn,
-          declarations,
-          isProperty,
-          isSetter,
-          modifyKernel,
-          isAbstract,
-          name);
-      _member = interfaceConflict.getMember(hierarchy);
-      _covariance = interfaceConflict.getCovariance(hierarchy);
-    }
-  }
-
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _member;
-  }
-
-  @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _covariance;
-  }
-
-  @override
-  DelayedMember withParent(ClassBuilder parent) {
-    return parent == this.classBuilder
-        ? this
-        : new InheritedImplementationInterfaceConflict(
-            parent,
-            concreteMember,
-            /*_isSuperClassMemberMixedIn = */ false,
-            [this],
-            isProperty,
-            isSetter,
-            modifyKernel,
-            isAbstract,
-            name);
-  }
-
-  @override
-  bool isSameDeclaration(ClassMember other) {
-    // This could be more precise but it currently has no benefit.
-    return identical(this, other);
-  }
-
-  static ClassMember combined(
-      ClassBuilder parent,
-      ClassMember concreteImplementation,
-      bool isSuperClassMemberMixedIn,
-      ClassMember other,
-      bool isSetter,
-      bool createForwarders,
-      {bool isInheritableConflict = true}) {
-    assert(concreteImplementation.isProperty == other.isProperty,
-        "Unexpected member combination: $concreteImplementation vs $other");
-    List<ClassMember> declarations = <ClassMember>[];
-    if (concreteImplementation.hasDeclarations &&
-        concreteImplementation.classBuilder == parent) {
-      addAllDeclarationsTo(concreteImplementation, declarations);
-    } else {
-      declarations.add(concreteImplementation);
-    }
-    if (other.hasDeclarations && other.classBuilder == parent) {
-      addAllDeclarationsTo(other, declarations);
-    } else {
-      addDeclarationIfDifferent(other, declarations);
-    }
-    if (declarations.length == 1) {
-      return declarations.single;
-    } else {
-      return new InheritedImplementationInterfaceConflict(
-          parent,
-          concreteImplementation.concrete,
-          isSuperClassMemberMixedIn,
-          declarations,
-          concreteImplementation.isProperty,
-          isSetter,
-          createForwarders,
-          declarations.first.isAbstract,
-          declarations.first.name,
-          isInheritableConflict: isInheritableConflict);
-    }
-  }
-}
-
-class InterfaceConflict extends DelayedMember {
-  final ClassMember _superClassMember;
-  final bool _isSuperClassMemberMixedIn;
-  final bool isImplicitlyAbstract;
-
-  InterfaceConflict(
-      ClassBuilder parent,
-      this._superClassMember,
-      this._isSuperClassMemberMixedIn,
-      List<ClassMember> declarations,
-      bool isProperty,
-      bool isSetter,
-      bool modifyKernel,
-      bool isAbstract,
-      Name name,
-      {this.isImplicitlyAbstract: true})
-      : super(parent, declarations, isProperty, isSetter, modifyKernel,
-            isAbstract, name);
-
-  @override
-  bool isObjectMember(ClassBuilder objectClass) =>
-      declarations.first.isObjectMember(objectClass);
-
-  @override
-  bool get isAbstract => isExplicitlyAbstract || isImplicitlyAbstract;
-
-  Member _member;
-  Covariance _covariance;
-
-  @override
-  String toString() {
-    return "InterfaceConflict(${classBuilder.fullNameForErrors}, "
-        "[${declarations.join(', ')}])";
-  }
-
-  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
-    if (_member != null) {
-      return;
-    }
-    if (classBuilder.library is! SourceLibraryBuilder) {
-      _member = declarations.first.getMember(hierarchy);
-      _covariance = declarations.first.getCovariance(hierarchy);
-      return;
-    }
-
-    CombinedClassMemberSignature combinedMemberSignature =
-        new CombinedClassMemberSignature(hierarchy, classBuilder, declarations,
-            forSetter: isSetter);
-
-    if (combinedMemberSignature.canonicalMember == null) {
-      String name = classBuilder.fullNameForErrors;
-      int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
-      List<LocatedMessage> context = declarations.map((ClassMember d) {
-        return messageDeclaredMemberConflictsWithOverriddenMembersCause
-            .withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
-      }).toList();
-
-      classBuilder.addProblem(
-          templateCombinedMemberSignatureFailed.withArguments(
-              classBuilder.fullNameForErrors,
-              declarations.first.fullNameForErrors),
-          classBuilder.charOffset,
-          length,
-          context: context);
-      // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
-      // cascading errors.
-      _member = declarations.first.getMember(hierarchy);
-      _covariance = declarations.first.getCovariance(hierarchy);
-      return;
-    }
-    debug?.log("Combined Member Signature of ${fullNameForErrors}: "
-        "${combinedMemberSignature.canonicalMember.fullName}");
-
-    if (modifyKernel) {
-      ProcedureKind kind = ProcedureKind.Method;
-      Member bestMemberSoFar =
-          combinedMemberSignature.canonicalMember.getMember(hierarchy);
-      if (combinedMemberSignature.canonicalMember.isProperty) {
-        kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
-      } else if (bestMemberSoFar is Procedure &&
-          bestMemberSoFar.kind == ProcedureKind.Operator) {
-        kind = ProcedureKind.Operator;
-      }
-
-      debug?.log("Combined Member Signature of ${fullNameForErrors}: new "
-          "ForwardingNode($classBuilder, "
-          "${combinedMemberSignature.canonicalMember}, "
-          "$declarations, $kind)");
-      Member stub = new ForwardingNode(combinedMemberSignature, kind,
-              _superClassMember, _isSuperClassMemberMixedIn)
-          .finalize();
-      if (stub != null && classBuilder.cls == stub.enclosingClass) {
-        if (stub is Procedure) {
-          classBuilder.cls.addProcedure(stub);
-        } else if (stub is Field) {
-          classBuilder.cls.addField(stub);
-        } else if (stub is Constructor) {
-          classBuilder.cls.addConstructor(stub);
-        } else if (stub is RedirectingFactoryConstructor) {
-          classBuilder.cls.addRedirectingFactoryConstructor(stub);
-        } else {
-          unhandled("${stub.runtimeType}", "getMember", stub.fileOffset,
-              stub.fileUri);
-        }
-        SourceLibraryBuilder library = classBuilder.library;
-        Member bestMemberSoFar =
-            combinedMemberSignature.canonicalMember.getMember(hierarchy);
-        if (bestMemberSoFar is Procedure) {
-          library.forwardersOrigins..add(stub)..add(bestMemberSoFar);
-        }
-        debug?.log("Combined Member Signature of ${fullNameForErrors}: "
-            "added stub $stub");
-        _member = stub;
-        _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
-        assert(
-            _covariance ==
-                new Covariance.fromMember(_member, forSetter: forSetter),
-            "Unexpected covariance for combined members signature "
-            "$_member. Found $_covariance, expected "
-            "${new Covariance.fromMember(_member, forSetter: forSetter)}.");
-        return;
-      }
-    }
-
-    debug?.log(
-        "Combined Member Signature of ${fullNameForErrors}: picked bestSoFar");
-    _member = combinedMemberSignature.canonicalMember.getMember(hierarchy);
-    _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
-  }
-
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _member;
-  }
-
-  @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _covariance;
-  }
-
-  @override
-  DelayedMember withParent(ClassBuilder parent) {
-    return parent == this.classBuilder
-        ? this
-        : new InterfaceConflict(
-            parent,
-            _superClassMember,
-            /*_isSuperClassMemberMixedIn = */ false,
-            [this],
-            isProperty,
-            isSetter,
-            modifyKernel,
-            isAbstract,
-            name,
-            isImplicitlyAbstract: isImplicitlyAbstract);
-  }
-
-  @override
-  bool isSameDeclaration(ClassMember other) {
-    // This could be more precise but it currently has no benefit.
-    return identical(this, other);
-  }
-
-  static ClassMember combined(ClassBuilder parent, ClassMember a, ClassMember b,
-      bool isSetter, bool createForwarders) {
-    assert(a.isProperty == b.isProperty,
-        "Unexpected member combination: $a vs $b");
-    List<ClassMember> declarations = <ClassMember>[];
-    if (a.hasDeclarations && a.classBuilder == parent) {
-      addAllDeclarationsTo(a, declarations);
-    } else {
-      declarations.add(a);
-    }
-    if (b.hasDeclarations && b.classBuilder == parent) {
-      addAllDeclarationsTo(b, declarations);
-    } else {
-      addDeclarationIfDifferent(b, declarations);
-    }
-    if (declarations.length == 1) {
-      return declarations.single;
-    } else {
-      return new InterfaceConflict(
-          parent,
-          null,
-          /*_isSuperClassMemberMixedIn = */ false,
-          declarations,
-          a.isProperty,
-          isSetter,
-          createForwarders,
-          declarations.first.isAbstract,
-          declarations.first.name);
-    }
-  }
-
-  @override
-  ClassMember get concrete {
-    if (isAbstract) {
-      return declarations.first.concrete;
-    }
-    return this;
-  }
-}
-
-class AbstractMemberOverridingImplementation extends DelayedMember {
-  AbstractMemberOverridingImplementation(
-      ClassBuilder parent,
-      ClassMember abstractMember,
-      ClassMember concreteImplementation,
-      bool isProperty,
-      bool isSetter,
-      bool modifyKernel,
-      bool isAbstract,
-      Name name)
-      : super(parent, <ClassMember>[concreteImplementation, abstractMember],
-            isProperty, isSetter, modifyKernel, isAbstract, name);
-
-  @override
-  bool isObjectMember(ClassBuilder objectClass) =>
-      concreteImplementation.isObjectMember(objectClass);
-
-  ClassMember get concreteImplementation => declarations[0];
-
-  ClassMember get abstractMember => declarations[1];
-
-  bool _isChecked = false;
-
-  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
-    if (!_isChecked) {
-      _isChecked = true;
-      if (!classBuilder.isAbstract &&
-          !hierarchy.nodes[classBuilder.cls].hasNoSuchMethod) {
-        if (classBuilder is SourceClassBuilder) {
-          new DelayedOverrideCheck(
-                  classBuilder, concreteImplementation, abstractMember)
-              .check(hierarchy);
-        }
-      }
-
-      ProcedureKind kind = ProcedureKind.Method;
-      if (abstractMember.isProperty) {
-        kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
-      }
-      if (modifyKernel) {
-        // This call will add a body to the abstract method if needed for
-        // isGenericCovariantImpl checks.
-        new ForwardingNode(
-                new CombinedClassMemberSignature.internal(
-                    hierarchy, classBuilder, 1, declarations,
-                    forSetter: isSetter),
-                kind,
-                concrete,
-                /*_isSuperClassMemberMixedIn =*/ false)
-            .finalize();
-      }
-    }
-  }
-
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return abstractMember.getMember(hierarchy);
-  }
-
-  @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return abstractMember.getCovariance(hierarchy);
-  }
-
-  @override
-  DelayedMember withParent(ClassBuilder parent) {
-    return parent == this.classBuilder
-        ? this
-        : new AbstractMemberOverridingImplementation(
-            parent,
-            abstractMember,
-            concreteImplementation,
-            isProperty,
-            isSetter,
-            modifyKernel,
-            isAbstract,
-            name);
-  }
-
-  @override
-  String toString() {
-    return "AbstractMemberOverridingImplementation("
-        "${classBuilder.fullNameForErrors}, "
-        "[${declarations.join(', ')}])";
-  }
-
-  @override
-  ClassMember get abstract => abstractMember;
-
-  @override
-  ClassMember get concrete => concreteImplementation;
-
-  @override
-  bool isSameDeclaration(ClassMember other) {
-    if (identical(this, other)) return false;
-    return other is AbstractMemberOverridingImplementation &&
-        classBuilder == other.classBuilder &&
-        abstract.isSameDeclaration(other.abstract) &&
-        concrete.isSameDeclaration(other.concrete);
-  }
-}
-
-void addDeclarationIfDifferent(
-    ClassMember declaration, List<ClassMember> declarations) {
-  for (int i = 0; i < declarations.length; i++) {
-    if (declaration == declarations[i]) return;
-  }
-  declarations.add(declaration);
-}
-
-void addAllDeclarationsTo(ClassMember member, List<ClassMember> declarations) {
-  assert(member.hasDeclarations);
-  for (int i = 0; i < member.declarations.length; i++) {
-    addDeclarationIfDifferent(member.declarations[i], declarations);
-  }
-  assert(declarations.toSet().length == declarations.length);
-}
-
 int compareNamedParameters(VariableDeclaration a, VariableDeclaration b) {
   return a.name.compareTo(b.name);
 }
@@ -3227,3 +3751,482 @@
     }
   }
 }
+
+Set<ClassMember> unfoldDeclarations(Iterable<ClassMember> members) {
+  Set<ClassMember> result = <ClassMember>{};
+  _unfoldDeclarations(members, result);
+  return result;
+}
+
+void _unfoldDeclarations(
+    Iterable<ClassMember> members, Set<ClassMember> result) {
+  for (ClassMember member in members) {
+    if (member.hasDeclarations) {
+      _unfoldDeclarations(member.declarations, result);
+    } else {
+      result.add(member);
+    }
+  }
+}
+
+abstract class SynthesizedMember extends ClassMember {
+  @override
+  final ClassBuilder classBuilder;
+
+  @override
+  final Name name;
+
+  @override
+  final bool forSetter;
+
+  @override
+  final bool isProperty;
+
+  SynthesizedMember(this.classBuilder, this.name,
+      {this.forSetter, this.isProperty})
+      : assert(forSetter != null),
+        assert(isProperty != null);
+
+  @override
+  List<ClassMember> get declarations => throw new UnimplementedError();
+
+  @override
+  void inferType(ClassHierarchyBuilder hierarchy) {}
+
+  @override
+  bool get isAssignable => throw new UnimplementedError();
+
+  @override
+  bool get isConst => throw new UnimplementedError();
+
+  @override
+  bool get isDuplicate => false;
+
+  @override
+  bool get isField => throw new UnimplementedError();
+
+  @override
+  bool get isFinal => throw new UnimplementedError();
+
+  @override
+  bool get isGetter => throw new UnimplementedError();
+
+  @override
+  bool get isInternalImplementation => false;
+
+  @override
+  bool get isSetter => forSetter;
+
+  @override
+  bool get isSourceDeclaration => false;
+
+  @override
+  bool get isStatic => false;
+
+  @override
+  bool get isSynthesized => true;
+
+  @override
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {}
+}
+
+/// Class member for a set of interface members.
+///
+/// This is used to compute combined member signature of a set of interface
+/// members inherited into the same class, and to insert forwarding stubs,
+/// mixin stubs, and member signatures where needed.
+class SynthesizedInterfaceMember extends SynthesizedMember {
+  @override
+  final List<ClassMember> declarations;
+
+  /// The concrete member in the super class overridden by [declarations], if
+  /// any.
+  ///
+  /// This is used to as the target when creating concrete forwarding and mixin
+  /// stub. For instance:
+  ///
+  ///    class Super {
+  ///      method(int i) {}
+  ///    }
+  ///    class Interface {
+  ///      method(covariant int i) {}
+  ///    }
+  ///    class Class extends Super implements Interface {
+  ///      // Concrete forwarding stub calling [_superClassMember]:
+  ///      method(covariant int i) => super.method(i);
+  ///
+  final ClassMember _superClassMember;
+
+  /// The canonical member of the combined member signature if it is known by
+  /// construction. The canonical member defines the type of combined member
+  /// signature.
+  ///
+  /// This is used when a declared member is part of a set of implemented
+  /// members. For instance
+  ///
+  ///     class Super {
+  ///       method(int i) {}
+  ///     }
+  ///     class Interface {
+  ///       method(covariant num i) {}
+  ///     }
+  ///     class Class implements Interface {
+  ///       // This member is updated to be a concrete forwarding stub with an
+  ///       // covariant parameter but with its declared parameter type:
+  ///       //    method(covariant int i) => super.method(i);
+  ///       method(int i);
+  ///     }
+  final ClassMember _canonicalMember;
+
+  /// The member in [declarations] that is mixed in, if any.
+  ///
+  /// This is used to create mixin stubs. If the mixed in member is abstract,
+  /// an abstract mixin stub is created:
+  ///
+  ///    class Super {
+  ///      void method() {}
+  ///    }
+  ///    class Mixin {
+  ///      void method();
+  ///    }
+  ///    // Abstract mixin stub with `Mixin.method` as target inserted:
+  ///    //   void method();
+  ///    class Class = Super with Mixin;
+  ///
+  /// If the mixed in member is concrete, a concrete mixin member is created:
+  ///
+  ///    class Super {
+  ///      void method() {}
+  ///    }
+  ///    class Mixin {
+  ///      void method() {}
+  ///    }
+  ///    // Concrete mixin stub with `Mixin.method` as target inserted:
+  ///    //   void method() => super.method();
+  ///    class Class = Super with Mixin;
+  ///
+  /// If a forwarding stub is needed, the created stub will be a possibly
+  /// concrete forwarding stub:
+  ///
+  ///    class Super {
+  ///      void method(int i) {}
+  ///    }
+  ///    class Interface {
+  ///      void method(covariant num i) {}
+  ///    }
+  ///    class Mixin {
+  ///      void method(int i);
+  ///    }
+  ///    // Concrete forwarding stub with `Super.method` as target inserted:
+  ///    //   void method(covariant int i) => super.method(i);
+  ///    class Class = Super with Mixin implements Interface;
+  ///
+  final ClassMember _mixedInMember;
+
+  /// If `true`, a stub should be inserted, if needed.
+  final bool _shouldModifyKernel;
+
+  Member _member;
+  Covariance _covariance;
+
+  SynthesizedInterfaceMember(
+      ClassBuilder classBuilder, Name name, this.declarations,
+      {ClassMember superClassMember,
+      ClassMember canonicalMember,
+      ClassMember mixedInMember,
+      bool isProperty,
+      bool forSetter,
+      bool shouldModifyKernel})
+      : this._superClassMember = superClassMember,
+        this._canonicalMember = canonicalMember,
+        this._mixedInMember = mixedInMember,
+        this._shouldModifyKernel = shouldModifyKernel,
+        super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
+
+  @override
+  bool get hasDeclarations => true;
+
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+    if (_member != null) {
+      return;
+    }
+    if (classBuilder.library is! SourceLibraryBuilder) {
+      if (_canonicalMember != null) {
+        _member = _canonicalMember.getMember(hierarchy);
+        _covariance = _canonicalMember.getCovariance(hierarchy);
+      } else {
+        _member = declarations.first.getMember(hierarchy);
+        _covariance = declarations.first.getCovariance(hierarchy);
+      }
+      return;
+    }
+    CombinedClassMemberSignature combinedMemberSignature;
+    if (_canonicalMember != null) {
+      combinedMemberSignature = new CombinedClassMemberSignature.internal(
+          hierarchy,
+          classBuilder,
+          declarations.indexOf(_canonicalMember),
+          declarations,
+          forSetter: isSetter);
+    } else {
+      combinedMemberSignature = new CombinedClassMemberSignature(
+          hierarchy, classBuilder, declarations,
+          forSetter: isSetter);
+
+      if (combinedMemberSignature.canonicalMember == null) {
+        String name = classBuilder.fullNameForErrors;
+        int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
+        List<LocatedMessage> context = declarations.map((ClassMember d) {
+          return messageDeclaredMemberConflictsWithOverriddenMembersCause
+              .withLocation(
+                  d.fileUri, d.charOffset, d.fullNameForErrors.length);
+        }).toList();
+
+        classBuilder.addProblem(
+            templateCombinedMemberSignatureFailed.withArguments(
+                classBuilder.fullNameForErrors,
+                declarations.first.fullNameForErrors),
+            classBuilder.charOffset,
+            length,
+            context: context);
+        // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
+        // cascading errors.
+        _member = declarations.first.getMember(hierarchy);
+        _covariance = declarations.first.getCovariance(hierarchy);
+        return;
+      }
+    }
+
+    if (_shouldModifyKernel) {
+      ProcedureKind kind = ProcedureKind.Method;
+      Member canonicalMember =
+          combinedMemberSignature.canonicalMember.getMember(hierarchy);
+      if (combinedMemberSignature.canonicalMember.isProperty) {
+        kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
+      } else if (canonicalMember is Procedure &&
+          canonicalMember.kind == ProcedureKind.Operator) {
+        kind = ProcedureKind.Operator;
+      }
+
+      Procedure stub = new ForwardingNode(
+              combinedMemberSignature, kind, _superClassMember, _mixedInMember)
+          .finalize();
+      if (stub != null) {
+        assert(classBuilder.cls == stub.enclosingClass);
+        assert(stub != canonicalMember);
+        classBuilder.cls.addProcedure(stub);
+        SourceLibraryBuilder library = classBuilder.library;
+        if (canonicalMember is Procedure) {
+          library.forwardersOrigins..add(stub)..add(canonicalMember);
+        }
+        _member = stub;
+        _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+        assert(
+            _covariance ==
+                new Covariance.fromMember(_member, forSetter: forSetter),
+            "Unexpected covariance for combined members signature "
+            "$_member. Found $_covariance, expected "
+            "${new Covariance.fromMember(_member, forSetter: forSetter)}.");
+        return;
+      }
+    }
+
+    _member = combinedMemberSignature.canonicalMember.getMember(hierarchy);
+    _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _member;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _covariance;
+  }
+
+  @override
+  ClassMember get interfaceMember => this;
+
+  @override
+  bool isObjectMember(ClassBuilder objectClass) {
+    return false;
+  }
+
+  @override
+  bool isSameDeclaration(ClassMember other) {
+    // TODO(johnniwinther): Optimize this.
+    return false;
+  }
+
+  @override
+  int get charOffset => declarations.first.charOffset;
+
+  @override
+  Uri get fileUri => declarations.first.fileUri;
+
+  @override
+  bool get isAbstract => true;
+
+  @override
+  String get fullNameForErrors =>
+      declarations.map((ClassMember m) => m.fullName).join("%");
+
+  @override
+  String get fullName {
+    String suffix = isSetter ? "=" : "";
+    return "${fullNameForErrors}$suffix";
+  }
+
+  String toString() => 'SynthesizedInterfaceMember($classBuilder,$name,'
+      '$declarations,forSetter=$forSetter)';
+}
+
+/// Class member for an inherited concrete member that implements an interface
+/// member.
+///
+/// This is used to ensure that both the inherited concrete member and the
+/// interface member is taken into account when computing the resulting [Member]
+/// node.
+///
+/// This is needed because an interface member, though initially abstract, can
+/// result in a concrete stub that overrides the concrete member. For instance
+///
+///    class Super {
+///      method(int i) {}
+///    }
+///    class Interface {
+///      method(covariant int i) {}
+///    }
+///    class Class extends Super implements Interface {
+///      // A concrete forwarding stub is inserted:
+///      method(covariant int i) => super.method(i);
+///    }
+///    class Sub extends Class implements Interface {
+///      // No forwarding stub should be inserted since `Class.method` is
+///      // adequate.
+///    }
+///
+///
+///  Here the create stub `Class.method` overrides `Super.method` and should
+///  be used to determine whether to insert a forwarding stub in subclasses.
+class InheritedClassMemberImplementsInterface extends SynthesizedMember {
+  final ClassMember inheritedClassMember;
+  final ClassMember implementedInterfaceMember;
+
+  Member _member;
+  Covariance _covariance;
+
+  InheritedClassMemberImplementsInterface(ClassBuilder classBuilder, Name name,
+      {this.inheritedClassMember,
+      this.implementedInterfaceMember,
+      bool isProperty,
+      bool forSetter})
+      : assert(inheritedClassMember != null),
+        assert(implementedInterfaceMember != null),
+        super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
+
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+    if (_member == null) {
+      Member classMember = inheritedClassMember.getMember(hierarchy);
+      Member interfaceMember = implementedInterfaceMember.getMember(hierarchy);
+      if (!interfaceMember.isAbstract &&
+          interfaceMember.enclosingClass == classBuilder.cls) {
+        /// The interface member resulted in a concrete stub being inserted.
+        /// For instance for `method1` but _not_ for `method2` here:
+        ///
+        ///    class Super {
+        ///      method1(int i) {}
+        ///      method2(covariant int i) {}
+        ///    }
+        ///    class Interface {
+        ///      method1(covariant int i) {}
+        ///      method2(int i) {}
+        ///    }
+        ///    class Class extends Super implements Interface {
+        ///      // A concrete forwarding stub is inserted for `method1` since
+        ///      // the parameter on `Super.method1` is _not_ marked as
+        ///      // covariant:
+        ///      method1(covariant int i) => super.method(i);
+        ///      // No concrete forwarding stub is inserted for `method2` since
+        ///      // the parameter on `Super.method2` is already marked as
+        ///      // covariant.
+        ///    }
+        ///
+        /// The inserted stub should be used as the resulting member.
+        _member = interfaceMember;
+        _covariance = implementedInterfaceMember.getCovariance(hierarchy);
+      } else {
+        /// The interface member did not result in an inserted stub or the
+        /// inserted stub was abstract. For instance:
+        ///
+        ///    // Opt-in:
+        ///    class Super {
+        ///      method(int? i) {}
+        ///    }
+        ///    // Opt-out:
+        ///    class Class extends Super {
+        ///      // An abstract member signature stub is inserted:
+        ///      method(int* i);
+        ///    }
+        ///
+        /// The inserted stub should _not_ be used as the resulting member
+        /// since it is abstract and therefore not a class member.
+        _member = classMember;
+        _covariance = inheritedClassMember.getCovariance(hierarchy);
+      }
+    }
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _member;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _covariance;
+  }
+
+  @override
+  ClassMember get interfaceMember => implementedInterfaceMember;
+
+  @override
+  bool isObjectMember(ClassBuilder objectClass) {
+    return inheritedClassMember.isObjectMember(objectClass);
+  }
+
+  @override
+  bool isSameDeclaration(ClassMember other) {
+    // TODO(johnniwinther): Optimize this.
+    return false;
+  }
+
+  @override
+  int get charOffset => inheritedClassMember.charOffset;
+
+  @override
+  Uri get fileUri => inheritedClassMember.fileUri;
+
+  @override
+  bool get hasDeclarations => false;
+
+  @override
+  bool get isAbstract => false;
+
+  @override
+  String get fullNameForErrors => inheritedClassMember.fullNameForErrors;
+
+  String get fullName => inheritedClassMember.fullName;
+
+  @override
+  String toString() =>
+      'InheritedClassMemberImplementsInterface($classBuilder,$name,'
+      'inheritedClassMember=$inheritedClassMember,'
+      'implementedInterfaceMember=$implementedInterfaceMember,'
+      'forSetter=$forSetter)';
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 00467ed..2f22878 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -263,17 +263,6 @@
     return _containsNnbdTypes;
   }
 
-  /// Returns `true` if the covariance of the combined member signature is
-  /// different from the covariance of the overridden member in the superclass.
-  ///
-  /// If `true` a concrete forwarding stub that checks the covariance must
-  /// be generated.
-  // TODO(johnniwinther): This is imprecise. It assumes that the 0th member is
-  // from the superclass which might not be the case.
-  bool get needsSuperImpl {
-    return _getMemberCovariance(0) != combinedMemberSignatureCovariance;
-  }
-
   /// The this type of [classBuilder].
   DartType get thisType {
     return _thisType ??= _coreTypes.thisInterfaceType(
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index a647cbf..590534c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -40,14 +40,16 @@
 
   final ClassMember _superClassMember;
 
-  final bool _isSuperClassMemberMixedIn;
+  final ClassMember _mixedInMember;
 
   ForwardingNode(this._combinedMemberSignature, this.kind,
-      this._superClassMember, this._isSuperClassMemberMixedIn);
+      this._superClassMember, this._mixedInMember);
 
   /// Finishes handling of this node by propagating covariance and creating
   /// forwarding stubs if necessary.
-  Member finalize() => _computeCovarianceFixes();
+  ///
+  /// If a stub is created, this is returned. Otherwise `null` is returned.
+  Procedure finalize() => _computeCovarianceFixes();
 
   /// Tag the parameters of [interfaceMember] that need type checks
   ///
@@ -59,15 +61,16 @@
   /// occurs in [enclosingClass]'s interface.  If parameters need checks but
   /// they would not be checked in an inherited implementation, a forwarding
   /// stub is introduced as a place to put the checks.
-  Member _computeCovarianceFixes() {
+  ///
+  /// If a stub is created, this is returned. Otherwise `null` is returned.
+  Procedure _computeCovarianceFixes() {
     SourceClassBuilder classBuilder = _combinedMemberSignature.classBuilder;
     ClassMember canonicalMember = _combinedMemberSignature.canonicalMember;
     Member interfaceMember =
         canonicalMember.getMember(_combinedMemberSignature.hierarchy);
 
-    // TODO(johnniwinther): Support abstract mixin stubs.
     bool needMixinStub =
-        classBuilder.isMixinApplication && _isSuperClassMemberMixedIn;
+        classBuilder.isMixinApplication && _mixedInMember != null;
 
     if (_combinedMemberSignature.members.length == 1 && !needMixinStub) {
       // Covariance can only come from [interfaceMember] so we never need a
@@ -79,10 +82,13 @@
             copyLocation: false);
       } else {
         // Nothing to do.
-        return interfaceMember;
+        return null;
       }
     }
 
+    // TODO(johnniwinther): Remove this. This relies upon the order of the
+    // declarations matching the order in which members are returned from the
+    // [ClassHierarchy].
     bool cannotReuseExistingMember =
         !(_combinedMemberSignature.isCanonicalMemberFirst ||
             _combinedMemberSignature.isCanonicalMemberDeclared);
@@ -94,43 +100,46 @@
         (canonicalMember.classBuilder != classBuilder &&
             needsTypeOrCovarianceUpdate) ||
         needMixinStub;
+    bool needsSuperImpl = _superClassMember != null &&
+        _superClassMember.getCovariance(_combinedMemberSignature.hierarchy) !=
+            _combinedMemberSignature.combinedMemberSignatureCovariance;
     if (stubNeeded) {
       Procedure stub = _combinedMemberSignature.createMemberFromSignature(
           copyLocation: false);
       bool needsForwardingStub =
-          _combinedMemberSignature.needsCovarianceMerging ||
-              _combinedMemberSignature.needsSuperImpl;
+          _combinedMemberSignature.needsCovarianceMerging || needsSuperImpl;
       if (needsForwardingStub || needMixinStub) {
         ProcedureStubKind stubKind;
+        Member finalTarget;
         if (needsForwardingStub) {
           stubKind = ProcedureStubKind.AbstractForwardingStub;
-        } else {
-          stubKind = ProcedureStubKind.AbstractMixinStub;
-        }
-
-        // This is a forward stub.
-        Member finalTarget;
-        if (interfaceMember is Procedure) {
-          switch (interfaceMember.stubKind) {
-            case ProcedureStubKind.Regular:
-            case ProcedureStubKind.NoSuchMethodForwarder:
-              finalTarget = interfaceMember;
-              break;
-            case ProcedureStubKind.AbstractForwardingStub:
-            case ProcedureStubKind.ConcreteForwardingStub:
-            case ProcedureStubKind.AbstractMixinStub:
-            case ProcedureStubKind.ConcreteMixinStub:
-            case ProcedureStubKind.MemberSignature:
-              finalTarget = interfaceMember.stubTarget;
-              break;
+          if (interfaceMember is Procedure) {
+            switch (interfaceMember.stubKind) {
+              case ProcedureStubKind.Regular:
+              case ProcedureStubKind.NoSuchMethodForwarder:
+                finalTarget = interfaceMember;
+                break;
+              case ProcedureStubKind.AbstractForwardingStub:
+              case ProcedureStubKind.ConcreteForwardingStub:
+              case ProcedureStubKind.MemberSignature:
+              case ProcedureStubKind.AbstractMixinStub:
+              case ProcedureStubKind.ConcreteMixinStub:
+                finalTarget = interfaceMember.stubTarget;
+                break;
+            }
+          } else {
+            finalTarget = interfaceMember;
           }
         } else {
-          finalTarget = interfaceMember;
+          stubKind = ProcedureStubKind.AbstractMixinStub;
+          finalTarget =
+              _mixedInMember.getMember(_combinedMemberSignature.hierarchy);
         }
+
         stub.stubKind = stubKind;
         stub.stubTarget = finalTarget;
-        if (_combinedMemberSignature.needsSuperImpl ||
-            (needMixinStub && _superClassMember != null)) {
+        if (needsSuperImpl ||
+            (needMixinStub && _superClassMember == _mixedInMember)) {
           _createForwardingImplIfNeeded(
               stub.function, stub.name, classBuilder.cls,
               isForwardingStub: needsForwardingStub);
@@ -143,12 +152,12 @@
         _combinedMemberSignature.combinedMemberSignatureCovariance
             .applyCovariance(interfaceMember);
       }
-      if (_combinedMemberSignature.needsSuperImpl) {
+      if (needsSuperImpl) {
         _createForwardingImplIfNeeded(
             interfaceMember.function, interfaceMember.name, classBuilder.cls,
             isForwardingStub: true);
       }
-      return interfaceMember;
+      return null;
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index e7f9b2a..1e80ebb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -5964,12 +5964,7 @@
     }
     assert(node.interfaceTarget == null || node.interfaceTarget is Procedure);
     return inferrer.inferSuperMethodInvocation(
-        node,
-        typeContext,
-        node.interfaceTarget != null
-            ? new ObjectAccessTarget.interfaceMember(node.interfaceTarget,
-                isPotentiallyNullable: false)
-            : const ObjectAccessTarget.missing());
+        node, typeContext, node.interfaceTarget);
   }
 
   @override
@@ -5983,12 +5978,7 @@
           new InstrumentationValueForMember(node.interfaceTarget));
     }
     return inferrer.inferSuperPropertyGet(
-        node,
-        typeContext,
-        node.interfaceTarget != null
-            ? new ObjectAccessTarget.interfaceMember(node.interfaceTarget,
-                isPotentiallyNullable: false)
-            : const ObjectAccessTarget.missing());
+        node, typeContext, node.interfaceTarget);
   }
 
   @override
@@ -6004,6 +5994,10 @@
             isPotentiallyNullable: false)
         : const ObjectAccessTarget.missing();
     DartType writeContext = inferrer.getSetterType(writeTarget, receiverType);
+    if (node.interfaceTarget != null) {
+      writeContext = inferrer.computeTypeFromSuperClass(
+          node.interfaceTarget.enclosingClass, writeContext);
+    }
     ExpressionInferenceResult rhsResult = inferrer.inferExpression(
         node.value, writeContext ?? const UnknownType(), true,
         isVoidAllowed: true);
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 5d920b5..32b969f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -969,13 +969,11 @@
     return count;
   }
 
-  void checkOverride(
-      Types types,
-      Member declaredMember,
-      Member interfaceMember,
-      bool isSetter,
-      callback(Member declaredMember, Member interfaceMember, bool isSetter),
-      {bool isInterfaceCheck = false}) {
+  void checkOverride(Types types, Member declaredMember, Member interfaceMember,
+      bool isSetter, callback(Member interfaceMember, bool isSetter),
+      {bool isInterfaceCheck, bool declaredNeedsLegacyErasure}) {
+    assert(isInterfaceCheck != null);
+    assert(declaredNeedsLegacyErasure != null);
     if (declaredMember == interfaceMember) {
       return;
     }
@@ -989,21 +987,34 @@
       if (declaredMember.kind == interfaceMember.kind) {
         if (declaredMember.kind == ProcedureKind.Method ||
             declaredMember.kind == ProcedureKind.Operator) {
-          bool seenCovariant = checkMethodOverride(types, declaredMember,
-              interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
+          bool seenCovariant = checkMethodOverride(
+              types,
+              declaredMember,
+              interfaceMember,
+              interfaceMemberOrigin,
+              isInterfaceCheck,
+              declaredNeedsLegacyErasure);
           if (seenCovariant) {
-            handleSeenCovariant(
-                types, declaredMember, interfaceMember, isSetter, callback);
+            handleSeenCovariant(types, interfaceMember, isSetter, callback);
           }
         } else if (declaredMember.kind == ProcedureKind.Getter) {
-          checkGetterOverride(types, declaredMember, interfaceMember,
-              interfaceMemberOrigin, isInterfaceCheck);
+          checkGetterOverride(
+              types,
+              declaredMember,
+              interfaceMember,
+              interfaceMemberOrigin,
+              isInterfaceCheck,
+              declaredNeedsLegacyErasure);
         } else if (declaredMember.kind == ProcedureKind.Setter) {
-          bool seenCovariant = checkSetterOverride(types, declaredMember,
-              interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
+          bool seenCovariant = checkSetterOverride(
+              types,
+              declaredMember,
+              interfaceMember,
+              interfaceMemberOrigin,
+              isInterfaceCheck,
+              declaredNeedsLegacyErasure);
           if (seenCovariant) {
-            handleSeenCovariant(
-                types, declaredMember, interfaceMember, isSetter, callback);
+            handleSeenCovariant(types, interfaceMember, isSetter, callback);
           }
         } else {
           assert(
@@ -1026,15 +1037,24 @@
               !interfaceMember.isConst) ||
           interfaceMember is Procedure && interfaceMember.isSetter;
       if (declaredMemberHasGetter && interfaceMemberHasGetter) {
-        checkGetterOverride(types, declaredMember, interfaceMember,
-            interfaceMemberOrigin, isInterfaceCheck);
+        checkGetterOverride(
+            types,
+            declaredMember,
+            interfaceMember,
+            interfaceMemberOrigin,
+            isInterfaceCheck,
+            declaredNeedsLegacyErasure);
       }
       if (declaredMemberHasSetter && interfaceMemberHasSetter) {
-        bool seenCovariant = checkSetterOverride(types, declaredMember,
-            interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
+        bool seenCovariant = checkSetterOverride(
+            types,
+            declaredMember,
+            interfaceMember,
+            interfaceMemberOrigin,
+            isInterfaceCheck,
+            declaredNeedsLegacyErasure);
         if (seenCovariant) {
-          handleSeenCovariant(
-              types, declaredMember, interfaceMember, isSetter, callback);
+          handleSeenCovariant(types, interfaceMember, isSetter, callback);
         }
       }
     }
@@ -1204,7 +1224,8 @@
       Member interfaceMemberOrigin,
       FunctionNode declaredFunction,
       FunctionNode interfaceFunction,
-      bool isInterfaceCheck) {
+      bool isInterfaceCheck,
+      bool declaredNeedsLegacyErasure) {
     Substitution interfaceSubstitution = Substitution.empty;
     if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
       Class enclosingClass = interfaceMember.enclosingClass;
@@ -1257,6 +1278,9 @@
           if (!library.isNonNullableByDefault) {
             computedBound = legacyErasure(computedBound);
           }
+          if (declaredNeedsLegacyErasure) {
+            declaredBound = legacyErasure(declaredBound);
+          }
           if (!types
               .performNullabilityAwareMutualSubtypesCheck(
                   declaredBound, computedBound)
@@ -1315,6 +1339,7 @@
       bool isCovariant,
       VariableDeclaration declaredParameter,
       bool isInterfaceCheck,
+      bool declaredNeedsLegacyErasure,
       {bool asIfDeclaredParameter = false}) {
     if (interfaceSubstitution != null) {
       interfaceType = interfaceSubstitution.substituteType(interfaceType);
@@ -1322,6 +1347,9 @@
     if (declaredSubstitution != null) {
       declaredType = declaredSubstitution.substituteType(declaredType);
     }
+    if (declaredNeedsLegacyErasure) {
+      declaredType = legacyErasure(declaredType);
+    }
 
     if (!declaredMember.isNonNullableByDefault &&
         interfaceMember.isNonNullableByDefault) {
@@ -1411,7 +1439,8 @@
       Procedure declaredMember,
       Procedure interfaceMember,
       Member interfaceMemberOrigin,
-      bool isInterfaceCheck) {
+      bool isInterfaceCheck,
+      bool declaredNeedsLegacyErasure) {
     assert(declaredMember.kind == interfaceMember.kind);
     assert(declaredMember.kind == ProcedureKind.Method ||
         declaredMember.kind == ProcedureKind.Operator);
@@ -1426,7 +1455,8 @@
         interfaceMemberOrigin,
         declaredFunction,
         interfaceFunction,
-        isInterfaceCheck);
+        isInterfaceCheck,
+        declaredNeedsLegacyErasure);
 
     Substitution declaredSubstitution =
         _computeDeclaredSubstitution(types, declaredMember);
@@ -1442,7 +1472,8 @@
         interfaceFunction.returnType,
         false,
         null,
-        isInterfaceCheck);
+        isInterfaceCheck,
+        declaredNeedsLegacyErasure);
     if (declaredFunction.positionalParameters.length <
         interfaceFunction.positionalParameters.length) {
       reportInvalidOverride(
@@ -1451,15 +1482,15 @@
           templateOverrideFewerPositionalArguments.withArguments(
               "${declaredMember.enclosingClass.name}."
                   "${declaredMember.name.text}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.text}"),
+              "${interfaceMemberOrigin.enclosingClass.name}."
+                  "${interfaceMemberOrigin.name.text}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMember.name.text)
-                .withLocation(interfaceMember.fileUri,
-                    interfaceMember.fileOffset, noLength)
+                .withArguments(interfaceMemberOrigin.name.text)
+                .withLocation(interfaceMemberOrigin.fileUri,
+                    interfaceMemberOrigin.fileOffset, noLength)
           ]);
     }
     if (interfaceFunction.requiredParameterCount <
@@ -1470,15 +1501,15 @@
           templateOverrideMoreRequiredArguments.withArguments(
               "${declaredMember.enclosingClass.name}."
                   "${declaredMember.name.text}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.text}"),
+              "${interfaceMemberOrigin.enclosingClass.name}."
+                  "${interfaceMemberOrigin.name.text}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMember.name.text)
-                .withLocation(interfaceMember.fileUri,
-                    interfaceMember.fileOffset, noLength)
+                .withArguments(interfaceMemberOrigin.name.text)
+                .withLocation(interfaceMemberOrigin.fileUri,
+                    interfaceMemberOrigin.fileOffset, noLength)
           ]);
     }
     for (int i = 0;
@@ -1511,7 +1542,8 @@
           interfaceParameter.type,
           declaredParameter.isCovariant || interfaceParameter.isCovariant,
           declaredParameter,
-          isInterfaceCheck);
+          isInterfaceCheck,
+          declaredNeedsLegacyErasure);
       if (declaredParameter.isCovariant) seenCovariant = true;
     }
     if (declaredFunction.namedParameters.isEmpty &&
@@ -1589,8 +1621,10 @@
           interfaceNamedParameters.current.type,
           declaredParameter.isCovariant,
           declaredParameter,
-          isInterfaceCheck);
+          isInterfaceCheck,
+          declaredNeedsLegacyErasure);
       if (declaredMember.isNonNullableByDefault &&
+          !declaredNeedsLegacyErasure &&
           declaredParameter.isRequired &&
           interfaceMember.isNonNullableByDefault &&
           !interfaceNamedParameters.current.isRequired) {
@@ -1627,7 +1661,8 @@
       Member declaredMember,
       Member interfaceMember,
       Member interfaceMemberOrigin,
-      bool isInterfaceCheck) {
+      bool isInterfaceCheck,
+      bool declaredNeedsLegacyErasure) {
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
         types,
         declaredMember,
@@ -1635,7 +1670,8 @@
         interfaceMemberOrigin,
         /* declaredFunction = */ null,
         /* interfaceFunction = */ null,
-        isInterfaceCheck);
+        isInterfaceCheck,
+        declaredNeedsLegacyErasure);
     Substitution declaredSubstitution =
         _computeDeclaredSubstitution(types, declaredMember);
     DartType declaredType = declaredMember.getterType;
@@ -1651,7 +1687,8 @@
         interfaceType,
         /* isCovariant = */ false,
         /* declaredParameter = */ null,
-        isInterfaceCheck);
+        isInterfaceCheck,
+        declaredNeedsLegacyErasure);
   }
 
   /// Checks whether [declaredMember] correctly overrides [interfaceMember].
@@ -1667,7 +1704,8 @@
       Member declaredMember,
       Member interfaceMember,
       Member interfaceMemberOrigin,
-      bool isInterfaceCheck) {
+      bool isInterfaceCheck,
+      bool declaredNeedsLegacyErasure) {
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
         types,
         declaredMember,
@@ -1675,7 +1713,8 @@
         interfaceMemberOrigin,
         /* declaredFunction = */ null,
         /* interfaceFunction = */ null,
-        isInterfaceCheck);
+        isInterfaceCheck,
+        declaredNeedsLegacyErasure);
     Substitution declaredSubstitution =
         _computeDeclaredSubstitution(types, declaredMember);
     DartType declaredType = declaredMember.setterType;
@@ -1701,6 +1740,7 @@
         isCovariant,
         declaredParameter,
         isInterfaceCheck,
+        declaredNeedsLegacyErasure,
         asIfDeclaredParameter: true);
     return isCovariant;
   }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index b183c32..ec4dd29 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1132,6 +1132,39 @@
     return null;
   }
 
+  /// Returns [type] as passed from [superClass] to the current class.
+  ///
+  /// If a legacy class occurs between the current class and [superClass] then
+  /// [type] needs to be legacy erased. For instance
+  ///
+  ///    // Opt in:
+  ///    class Super {
+  ///      int extendedMethod(int i, {required int j}) => i;
+  ///    }
+  ///    class Mixin {
+  ///      int mixedInMethod(int i, {required int j}) => i;
+  ///    }
+  ///    // Opt out:
+  ///    class Legacy extends Super with Mixin {}
+  ///    // Opt in:
+  ///    class Class extends Legacy {
+  ///      test() {
+  ///        // Ok to call `Legacy.extendedMethod` since its type is
+  ///        // `int* Function(int*, {int* j})`.
+  ///        super.extendedMethod(null);
+  ///        // Ok to call `Legacy.mixedInMethod` since its type is
+  ///        // `int* Function(int*, {int* j})`.
+  ///        super.mixedInMethod(null);
+  ///      }
+  ///    }
+  ///
+  DartType computeTypeFromSuperClass(Class superClass, DartType type) {
+    if (needsLegacyErasure(thisType.classNode, superClass)) {
+      type = legacyErasure(type);
+    }
+    return type;
+  }
+
   /// Returns the type of [target] when accessed as a getter on [receiverType].
   ///
   /// For instance
@@ -3479,9 +3512,11 @@
   ExpressionInferenceResult inferSuperMethodInvocation(
       SuperMethodInvocation expression,
       DartType typeContext,
-      ObjectAccessTarget target) {
-    assert(
-        target.isInstanceMember || target.isObjectMember || target.isMissing);
+      Procedure procedure) {
+    ObjectAccessTarget target = procedure != null
+        ? new ObjectAccessTarget.interfaceMember(procedure,
+            isPotentiallyNullable: false)
+        : const ObjectAccessTarget.missing();
     int fileOffset = expression.fileOffset;
     Name methodName = expression.name;
     Arguments arguments = expression.arguments;
@@ -3490,6 +3525,12 @@
         isSpecialCasedBinaryOperatorForReceiverType(target, receiverType);
     DartType calleeType = getGetterType(target, receiverType);
     FunctionType functionType = getFunctionType(target, receiverType);
+    if (procedure != null) {
+      calleeType =
+          computeTypeFromSuperClass(procedure.enclosingClass, calleeType);
+      functionType =
+          computeTypeFromSuperClass(procedure.enclosingClass, functionType);
+    }
     if (isNonNullableByDefault &&
         expression.name == equalsName &&
         functionType.positionalParameters.length == 1) {
@@ -3503,7 +3544,7 @@
         typeContext, fileOffset, functionType, arguments,
         isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
         receiverType: receiverType,
-        isImplicitExtensionMember: target.isExtensionMember);
+        isImplicitExtensionMember: false);
     DartType inferredType = result.inferredType;
     if (methodName.text == '==') {
       inferredType = coreTypes.boolRawType(library.nonNullable);
@@ -3534,18 +3575,20 @@
   }
 
   /// Performs the core type inference algorithm for super property get.
-  ExpressionInferenceResult inferSuperPropertyGet(SuperPropertyGet expression,
-      DartType typeContext, ObjectAccessTarget readTarget) {
-    assert(readTarget.isInstanceMember ||
-        readTarget.isObjectMember ||
-        readTarget.isMissing);
+  ExpressionInferenceResult inferSuperPropertyGet(
+      SuperPropertyGet expression, DartType typeContext, Member member) {
+    ObjectAccessTarget readTarget = member != null
+        ? new ObjectAccessTarget.interfaceMember(member,
+            isPotentiallyNullable: false)
+        : const ObjectAccessTarget.missing();
     DartType receiverType = thisType;
     DartType inferredType = getGetterType(readTarget, receiverType);
-    if (readTarget.isInstanceMember || readTarget.isObjectMember) {
-      Member member = readTarget.member;
-      if (member is Procedure && member.kind == ProcedureKind.Method) {
-        return instantiateTearOff(inferredType, typeContext, expression);
-      }
+    if (member != null) {
+      inferredType =
+          computeTypeFromSuperClass(member.enclosingClass, inferredType);
+    }
+    if (member is Procedure && member.kind == ProcedureKind.Method) {
+      return instantiateTearOff(inferredType, typeContext, expression);
     }
     return new ExpressionInferenceResult(inferredType, expression);
   }
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 82e3414..69fb201 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -159,23 +159,21 @@
       Member member;
       int offset;
       if (id.className != null) {
-        Class cls = lookupClass(library, id.className);
-        member = lookupClassMember(cls, id.memberName, required: false);
-        if (member != null) {
-          offset = member.fileOffset;
-          if (offset == -1) {
+        Class cls = lookupClass(library, id.className, required: false);
+        if (cls != null) {
+          member = lookupClassMember(cls, id.memberName, required: false);
+          if (member != null) {
+            offset = member.fileOffset;
+            if (offset == -1) {
+              offset = cls.fileOffset;
+            }
+          } else {
             offset = cls.fileOffset;
           }
-        } else {
-          offset = cls.fileOffset;
         }
       } else {
         member = lookupLibraryMember(library, id.memberName, required: false);
-        if (member != null) {
-          offset = member.fileOffset;
-        } else {
-          offset = 0;
-        }
+        offset = member?.fileOffset ?? 0;
       }
       if (offset == -1) {
         offset = 0;
@@ -188,8 +186,8 @@
       if (extension != null) {
         return extension.fileOffset;
       }
-      Class cls = lookupClass(library, id.className);
-      return cls.fileOffset;
+      Class cls = lookupClass(library, id.className, required: false);
+      return cls?.fileOffset ?? 0;
     }
     return null;
   }
diff --git a/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
new file mode 100644
index 0000000..5fb09fd
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
@@ -0,0 +1,309 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'dart:io' show Directory, Platform;
+import 'package:_fe_analyzer_shared/src/testing/features.dart';
+import 'package:_fe_analyzer_shared/src/testing/id.dart';
+import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+import 'package:front_end/src/fasta/kernel/kernel_api.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart';
+import 'package:front_end/src/testing/id_testing_utils.dart';
+import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart';
+import 'package:front_end/src/testing/id_extractor.dart';
+import 'package:kernel/ast.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  await runTests<Features>(dataDir,
+      args: args,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const ClassHierarchyDataComputer(), [cfeNonNullableConfig]));
+}
+
+class ClassHierarchyDataComputer extends DataComputer<Features> {
+  const ClassHierarchyDataComputer();
+
+  /// Function that computes a data mapping for [library].
+  ///
+  /// Fills [actualMap] with the data.
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose}) {
+    new InheritanceDataExtractor(compilerResult, actualMap)
+        .computeForLibrary(library);
+  }
+
+  @override
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose}) {
+    new InheritanceDataExtractor(compilerResult, actualMap)
+        .computeForClass(cls);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  @override
+  Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
+    return null; //errorsToText(errors, useCodes: true);
+  }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const FeaturesDataInterpreter();
+}
+
+class Tag {
+  static const String superclasses = 'superclasses';
+  static const String interfaces = 'interfaces';
+  static const String hasNoSuchMethod = 'hasNoSuchMethod';
+  static const String abstractMembers = 'abstractMembers';
+  static const String classBuilder = 'classBuilder';
+  static const String isSourceDeclaration = 'isSourceDeclaration';
+  static const String isSynthesized = 'isSynthesized';
+  static const String member = 'member';
+  static const String maxInheritancePath = 'maxInheritancePath';
+  static const String declaredOverrides = 'declared-overrides';
+  static const String mixinApplicationOverrides = 'mixin-overrides';
+  static const String inheritedImplements = 'inherited-implements';
+  static const String abstractForwardingStub = 'abstractForwardingStub';
+  static const String concreteForwardingStub = 'concreteForwardingStub';
+  static const String memberSignature = 'memberSignature';
+  static const String abstractMixinStub = 'abstractMixinStub';
+  static const String concreteMixinStub = 'concreteMixinStub';
+  static const String declarations = 'declarations';
+  static const String stubTarget = 'stubTarget';
+  static const String type = 'type';
+  static const String covariance = 'covariance';
+}
+
+class InheritanceDataExtractor extends CfeDataExtractor<Features> {
+  final InternalCompilerResult _compilerResult;
+
+  InheritanceDataExtractor(
+      this._compilerResult, Map<Id, ActualData<Features>> actualMap)
+      : super(_compilerResult, actualMap);
+
+  CoreTypes get _coreTypes => _compilerResult.coreTypes;
+
+  ClassHierarchyBuilder get _classHierarchyBuilder =>
+      _compilerResult.kernelTargetForTesting.loader.builderHierarchy;
+
+  @override
+  void computeForClass(Class node) {
+    super.computeForClass(node);
+    ClassHierarchyNode classHierarchyNode =
+        _classHierarchyBuilder.getNodeFromClass(node);
+    ClassHierarchyNodeDataForTesting data = classHierarchyNode.dataForTesting;
+    void addMember(ClassMember classMember,
+        {bool isSetter, bool isClassMember}) {
+      Member member = classMember.getMember(_classHierarchyBuilder);
+      Member memberOrigin = member.memberSignatureOrigin ?? member;
+      if (memberOrigin.enclosingClass == _coreTypes.objectClass) {
+        return;
+      }
+      Features features = new Features();
+
+      String memberName = classMemberName(classMember);
+      memberName += isClassMember ? '#cls' : '#int';
+      MemberId id = new MemberId.internal(memberName, className: node.name);
+
+      TreeNode nodeWithOffset;
+      if (member.enclosingClass == node) {
+        nodeWithOffset = computeTreeNodeWithOffset(member);
+      } else {
+        nodeWithOffset = computeTreeNodeWithOffset(node);
+      }
+      if (classMember.isSourceDeclaration) {
+        features.add(Tag.isSourceDeclaration);
+      }
+      if (classMember.isSynthesized) {
+        features.add(Tag.isSynthesized);
+        if (member.enclosingClass != node) {
+          features[Tag.member] = memberQualifiedName(member);
+        }
+        if (classMember.hasDeclarations) {
+          for (ClassMember declaration in classMember.declarations) {
+            features.addElement(
+                Tag.declarations, classMemberQualifiedName(declaration));
+          }
+        }
+      }
+      features[Tag.classBuilder] = classMember.classBuilder.name;
+
+      Set<ClassMember> declaredOverrides =
+          data.declaredOverrides[data.aliasMap[classMember] ?? classMember];
+      if (declaredOverrides != null) {
+        for (ClassMember override in declaredOverrides) {
+          features.addElement(
+              Tag.declaredOverrides, classMemberQualifiedName(override));
+        }
+      }
+
+      Set<ClassMember> mixinApplicationOverrides = data
+          .mixinApplicationOverrides[data.aliasMap[classMember] ?? classMember];
+      if (mixinApplicationOverrides != null) {
+        for (ClassMember override in mixinApplicationOverrides) {
+          features.addElement(Tag.mixinApplicationOverrides,
+              classMemberQualifiedName(override));
+        }
+      }
+
+      Set<ClassMember> inheritedImplements =
+          data.inheritedImplements[data.aliasMap[classMember] ?? classMember];
+      if (inheritedImplements != null) {
+        for (ClassMember implement in inheritedImplements) {
+          features.addElement(
+              Tag.inheritedImplements, classMemberQualifiedName(implement));
+        }
+      }
+
+      if (member.enclosingClass == node && member is Procedure) {
+        switch (member.stubKind) {
+          case ProcedureStubKind.Regular:
+            // TODO: Handle this case.
+            break;
+          case ProcedureStubKind.AbstractForwardingStub:
+            features.add(Tag.abstractForwardingStub);
+            features[Tag.type] = procedureType(member);
+            features[Tag.covariance] =
+                classMember.getCovariance(_classHierarchyBuilder).toString();
+            break;
+          case ProcedureStubKind.ConcreteForwardingStub:
+            features.add(Tag.concreteForwardingStub);
+            features[Tag.type] = procedureType(member);
+            features[Tag.covariance] =
+                classMember.getCovariance(_classHierarchyBuilder).toString();
+            features[Tag.stubTarget] = memberQualifiedName(member.stubTarget);
+            break;
+          case ProcedureStubKind.NoSuchMethodForwarder:
+            // TODO: Handle this case.
+            break;
+          case ProcedureStubKind.MemberSignature:
+            features.add(Tag.memberSignature);
+            features[Tag.type] = procedureType(member);
+            features[Tag.covariance] =
+                classMember.getCovariance(_classHierarchyBuilder).toString();
+            break;
+          case ProcedureStubKind.AbstractMixinStub:
+            features.add(Tag.abstractMixinStub);
+            break;
+          case ProcedureStubKind.ConcreteMixinStub:
+            features.add(Tag.concreteMixinStub);
+            features[Tag.stubTarget] = memberQualifiedName(member.stubTarget);
+            break;
+        }
+      }
+
+      registerValue(nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset,
+          id, features, member);
+    }
+
+    classHierarchyNode.classMemberMap
+        ?.forEach((Name name, ClassMember classMember) {
+      addMember(classMember, isSetter: false, isClassMember: true);
+    });
+    classHierarchyNode.classSetterMap
+        ?.forEach((Name name, ClassMember classMember) {
+      addMember(classMember, isSetter: true, isClassMember: true);
+    });
+    classHierarchyNode.interfaceMemberMap
+        ?.forEach((Name name, ClassMember classMember) {
+      if (!identical(classMember, classHierarchyNode.classMemberMap[name])) {
+        addMember(classMember, isSetter: false, isClassMember: false);
+      }
+    });
+    classHierarchyNode.interfaceSetterMap
+        ?.forEach((Name name, ClassMember classMember) {
+      if (!identical(classMember, classHierarchyNode.classSetterMap[name])) {
+        addMember(classMember, isSetter: true, isClassMember: false);
+      }
+    });
+  }
+
+  @override
+  Features computeClassValue(Id id, Class node) {
+    Features features = new Features();
+    ClassHierarchyNode classHierarchyNode =
+        _classHierarchyBuilder.getNodeFromClass(node);
+    ClassHierarchyNodeDataForTesting data = classHierarchyNode.dataForTesting;
+    classHierarchyNode.superclasses.forEach((Supertype supertype) {
+      features.addElement(Tag.superclasses, supertypeToText(supertype));
+    });
+    classHierarchyNode.interfaces.forEach((Supertype supertype) {
+      features.addElement(Tag.interfaces, supertypeToText(supertype));
+    });
+    if (data.abstractMembers != null) {
+      for (ClassMember abstractMember in data.abstractMembers) {
+        features.addElement(
+            Tag.abstractMembers, classMemberQualifiedName(abstractMember));
+      }
+    }
+    features[Tag.maxInheritancePath] =
+        '${classHierarchyNode.maxInheritancePath}';
+    if (classHierarchyNode.hasNoSuchMethod) {
+      features.add(Tag.hasNoSuchMethod);
+    }
+    return features;
+  }
+}
+
+String classMemberName(ClassMember classMember) {
+  String name = classMember.name.text;
+  if (classMember.forSetter) {
+    name += '=';
+  }
+  return name;
+}
+
+String classMemberQualifiedName(ClassMember classMember) {
+  return '${classMember.classBuilder.name}.${classMemberName(classMember)}';
+}
+
+String memberName(Member member) {
+  String name = member.name.text;
+  if (member is Procedure && member.isSetter) {
+    name += '=';
+  }
+  return name;
+}
+
+String memberQualifiedName(Member member) {
+  return '${member.enclosingClass.name}.${memberName(member)}';
+}
+
+String procedureType(Procedure procedure) {
+  if (procedure.kind == ProcedureKind.Getter) {
+    return typeToText(procedure.function.returnType,
+        TypeRepresentation.analyzerNonNullableByDefault);
+  } else if (procedure.kind == ProcedureKind.Setter) {
+    return typeToText(procedure.function.positionalParameters.single.type,
+        TypeRepresentation.analyzerNonNullableByDefault);
+  } else {
+    Nullability functionTypeNullability;
+    if (procedure.enclosingLibrary.isNonNullableByDefault) {
+      functionTypeNullability = procedure.enclosingLibrary.nonNullable;
+    } else {
+      // We don't create a member signature when the member is just
+      // a substitution. We should still take the nullability to be
+      // legacy, though.
+      functionTypeNullability = procedure.enclosingLibrary.nonNullable;
+    }
+    return typeToText(
+        procedure.function.computeThisFunctionType(functionTypeNullability),
+        TypeRepresentation.analyzerNonNullableByDefault);
+  }
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_field.dart
new file mode 100644
index 0000000..fbd6127
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_field.dart
@@ -0,0 +1,197 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+  /*member: AbstractSuper.extendedConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractSuper.extendedConcreteField=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int extendedConcreteField = 0;
+
+  /*member: AbstractSuper.extendedAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractSuper.extendedAbstractField=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractField;
+
+  /*member: AbstractSuper.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractSuper.declaredConcreteExtendsConcreteField=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: AbstractSuper.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractSuper.declaredAbstractExtendsConcreteField=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int declaredAbstractExtendsConcreteField = 0;
+
+  /*member: AbstractSuper.declaredConcreteExtendsAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractSuper.declaredConcreteExtendsAbstractField=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  abstract int declaredConcreteExtendsAbstractField;
+
+  /*member: AbstractSuper.declaredAbstractExtendsAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractSuper.declaredAbstractExtendsAbstractField=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractExtendsAbstractField;
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+  AbstractSuper,
+  Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+  /*member: AbstractClass.extendedConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.extendedConcreteField=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.extendedAbstractField=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteField#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredConcreteField=#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  int declaredConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractField#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredAbstractField=#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractField;
+
+  /*member: AbstractClass.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    AbstractSuper.declaredConcreteExtendsConcreteField,
+    AbstractSuper.declaredConcreteExtendsConcreteField=],
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredConcreteExtendsConcreteField=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    AbstractSuper.declaredConcreteExtendsConcreteField,
+    AbstractSuper.declaredConcreteExtendsConcreteField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=AbstractSuper.declaredAbstractExtendsConcreteField
+  */
+  /*member: AbstractClass.declaredAbstractExtendsConcreteField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsConcreteField,
+    AbstractSuper.declaredAbstractExtendsConcreteField],
+   declared-overrides=[
+    AbstractSuper.declaredAbstractExtendsConcreteField,
+    AbstractSuper.declaredAbstractExtendsConcreteField=],
+   isSynthesized
+  */
+  /*member: AbstractClass.declaredAbstractExtendsConcreteField=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=AbstractSuper.declaredAbstractExtendsConcreteField
+  */
+  /*member: AbstractClass.declaredAbstractExtendsConcreteField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsConcreteField=,
+    AbstractSuper.declaredAbstractExtendsConcreteField=],
+   declared-overrides=[
+    AbstractSuper.declaredAbstractExtendsConcreteField,
+    AbstractSuper.declaredAbstractExtendsConcreteField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractExtendsConcreteField;
+
+  /*member: AbstractClass.declaredConcreteExtendsAbstractField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    AbstractSuper.declaredConcreteExtendsAbstractField,
+    AbstractSuper.declaredConcreteExtendsAbstractField=],
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredConcreteExtendsAbstractField=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    AbstractSuper.declaredConcreteExtendsAbstractField,
+    AbstractSuper.declaredConcreteExtendsAbstractField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteExtendsAbstractField = 0;
+
+  /*member: AbstractClass.declaredAbstractExtendsAbstractField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    AbstractSuper.declaredAbstractExtendsAbstractField,
+    AbstractSuper.declaredAbstractExtendsAbstractField=],
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredAbstractExtendsAbstractField=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    AbstractSuper.declaredAbstractExtendsAbstractField,
+    AbstractSuper.declaredAbstractExtendsAbstractField=],
+   isSourceDeclaration
+  */
+  int declaredAbstractExtendsAbstractField = 0;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_final_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_final_field.dart
new file mode 100644
index 0000000..b5ed4db
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_final_field.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+  /*member: AbstractSuper.extendedConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  final int extendedConcreteField = 0;
+
+  /*member: AbstractSuper.extendedAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractField;
+
+  /*member: AbstractSuper.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  final int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: AbstractSuper.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  final int declaredAbstractExtendsConcreteField = 0;
+
+  /*member: AbstractSuper.declaredConcreteExtendsAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  abstract final int declaredConcreteExtendsAbstractField;
+
+  /*member: AbstractSuper.declaredAbstractExtendsAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractExtendsAbstractField;
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+  AbstractSuper,
+  Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+  /*member: AbstractClass.extendedConcreteField#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractField#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteField#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  final int declaredConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractField#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractField;
+
+  /*member: AbstractClass.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=AbstractSuper.declaredAbstractExtendsConcreteField
+  */
+  /*member: AbstractClass.declaredAbstractExtendsConcreteField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsConcreteField,
+    AbstractSuper.declaredAbstractExtendsConcreteField],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractExtendsConcreteField;
+
+  /*member: AbstractClass.declaredConcreteExtendsAbstractField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteExtendsAbstractField = 0;
+
+  /*member: AbstractClass.declaredAbstractExtendsAbstractField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsAbstractField,
+    AbstractSuper.declaredAbstractExtendsAbstractField],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractExtendsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_getter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_getter.dart
new file mode 100644
index 0000000..6900a41
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_getter.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+  /*member: AbstractSuper.extendedConcreteGetter#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int get extendedConcreteGetter => 0;
+
+  /*member: AbstractSuper.extendedAbstractGetter#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int get extendedAbstractGetter;
+
+  /*member: AbstractSuper.declaredConcreteExtendsConcreteGetter#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsConcreteGetter => 0;
+
+  /*member: AbstractSuper.declaredAbstractExtendsConcreteGetter#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int get declaredAbstractExtendsConcreteGetter => 0;
+
+  /*member: AbstractSuper.declaredConcreteExtendsAbstractGetter#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsAbstractGetter;
+
+  /*member: AbstractSuper.declaredAbstractExtendsAbstractGetter#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  int get declaredAbstractExtendsAbstractGetter;
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+  AbstractSuper,
+  Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+  /*member: AbstractClass.extendedConcreteGetter#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractGetter#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteGetter#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  int get declaredConcreteGetter => 0;
+
+  /*member: AbstractClass.declaredAbstractGetter#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  int get declaredAbstractGetter;
+
+  /*member: AbstractClass.declaredConcreteExtendsConcreteGetter#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsConcreteGetter => 0;
+
+  /*member: AbstractClass.declaredAbstractExtendsConcreteGetter#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=AbstractSuper.declaredAbstractExtendsConcreteGetter
+  */
+  /*member: AbstractClass.declaredAbstractExtendsConcreteGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsConcreteGetter,
+    AbstractSuper.declaredAbstractExtendsConcreteGetter],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteGetter],
+   isSynthesized
+  */
+  int get declaredAbstractExtendsConcreteGetter;
+
+  /*member: AbstractClass.declaredConcreteExtendsAbstractGetter#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsAbstractGetter => 0;
+
+  /*member: AbstractClass.declaredAbstractExtendsAbstractGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsAbstractGetter,
+    AbstractSuper.declaredAbstractExtendsAbstractGetter],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractGetter],
+   isSynthesized
+  */
+  int get declaredAbstractExtendsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_method.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_method.dart
new file mode 100644
index 0000000..7bbce15
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_method.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+  /*member: AbstractSuper.extendedConcreteMethod#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void extendedConcreteMethod() {}
+
+  /*member: AbstractSuper.extendedAbstractMethod#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void extendedAbstractMethod();
+
+  /*member: AbstractSuper.declaredConcreteExtendsConcreteMethod#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsConcreteMethod() {}
+
+  /*member: AbstractSuper.declaredAbstractExtendsConcreteMethod#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void declaredAbstractExtendsConcreteMethod() {}
+
+  /*member: AbstractSuper.declaredConcreteExtendsAbstractMethod#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsAbstractMethod();
+
+  /*member: AbstractSuper.declaredAbstractExtendsAbstractMethod#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void declaredAbstractExtendsAbstractMethod();
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+  AbstractSuper,
+  Object]
+*/
+/*member: AbstractClass.declaredAbstractExtendsConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteMethod
+*/
+abstract class AbstractClass extends AbstractSuper {
+  /*member: AbstractClass.extendedConcreteMethod#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractMethod#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteMethod#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void declaredConcreteMethod() {}
+
+  /*member: AbstractClass.declaredAbstractMethod#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void declaredAbstractMethod();
+
+  /*member: AbstractClass.declaredConcreteExtendsConcreteMethod#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsConcreteMethod() {}
+
+  /*member: AbstractClass.declaredAbstractExtendsConcreteMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsConcreteMethod,
+    AbstractSuper.declaredAbstractExtendsConcreteMethod],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteMethod],
+   isSynthesized
+  */
+  void declaredAbstractExtendsConcreteMethod();
+
+  /*member: AbstractClass.declaredConcreteExtendsAbstractMethod#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsAbstractMethod() {}
+
+  /*member: AbstractClass.declaredAbstractExtendsAbstractMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsAbstractMethod,
+    AbstractSuper.declaredAbstractExtendsAbstractMethod],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractMethod],
+   isSynthesized
+  */
+  void declaredAbstractExtendsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_setter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_setter.dart
new file mode 100644
index 0000000..dbbd9a1
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_setter.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+  /*member: AbstractSuper.extendedConcreteSetter=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void set extendedConcreteSetter(int value) {}
+
+  /*member: AbstractSuper.extendedAbstractSetter=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void set extendedAbstractSetter(int value);
+
+  /*member: AbstractSuper.declaredConcreteExtendsConcreteSetter=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+  /*member: AbstractSuper.declaredAbstractExtendsConcreteSetter=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void set declaredAbstractExtendsConcreteSetter(int value) {}
+
+  /*member: AbstractSuper.declaredConcreteExtendsAbstractSetter=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsAbstractSetter(int value);
+
+  /*member: AbstractSuper.declaredAbstractExtendsAbstractSetter=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+  void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+  AbstractSuper,
+  Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+  /*member: AbstractClass.extendedConcreteSetter=#cls:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractSetter=#int:
+   classBuilder=AbstractSuper,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteSetter=#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void set declaredConcreteSetter(int value) {}
+
+  /*member: AbstractClass.declaredAbstractSetter=#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void set declaredAbstractSetter(int value);
+
+  /*member: AbstractClass.declaredConcreteExtendsConcreteSetter=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+  /*member: AbstractClass.declaredAbstractExtendsConcreteSetter=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=AbstractSuper.declaredAbstractExtendsConcreteSetter=
+  */
+  /*member: AbstractClass.declaredAbstractExtendsConcreteSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsConcreteSetter=,
+    AbstractSuper.declaredAbstractExtendsConcreteSetter=],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractExtendsConcreteSetter(int value);
+
+  /*member: AbstractClass.declaredConcreteExtendsAbstractSetter=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsAbstractSetter(int value) {}
+
+  /*member: AbstractClass.declaredAbstractExtendsAbstractSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractExtendsAbstractSetter=,
+    AbstractSuper.declaredAbstractExtendsAbstractSetter=],
+   declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_field.dart
new file mode 100644
index 0000000..273a40d
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_field.dart
@@ -0,0 +1,192 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+  /*member: Interface.implementedConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.implementedConcreteField=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int implementedConcreteField = 0;
+
+  /*member: Interface.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.implementedAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract int implementedAbstractField;
+
+  /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredConcreteImplementsConcreteField=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredAbstractImplementsConcreteField=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int declaredAbstractImplementsConcreteField = 0;
+
+  /*member: Interface.declaredConcreteImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredConcreteImplementsAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract int declaredConcreteImplementsAbstractField;
+
+  /*member: Interface.declaredAbstractImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredAbstractImplementsAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractImplementsAbstractField;
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+  /*member: AbstractClass.implementedConcreteField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.implementedConcreteField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.implementedAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteField#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredConcreteField=#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  int declaredConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractField#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredAbstractField=#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractField;
+
+  /*member: AbstractClass.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsConcreteField,
+    Interface.declaredConcreteImplementsConcreteField=],
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredConcreteImplementsConcreteField=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsConcreteField,
+    Interface.declaredConcreteImplementsConcreteField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractImplementsConcreteField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField=],
+   isSynthesized
+  */
+  /*member: AbstractClass.declaredAbstractImplementsConcreteField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsConcreteField=,
+    Interface.declaredAbstractImplementsConcreteField=],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractImplementsConcreteField;
+
+  /*member: AbstractClass.declaredConcreteImplementsAbstractField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsAbstractField,
+    Interface.declaredConcreteImplementsAbstractField=],
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declaredConcreteImplementsAbstractField=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsAbstractField,
+    Interface.declaredConcreteImplementsAbstractField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteImplementsAbstractField = 0;
+
+  /*member: AbstractClass.declaredAbstractImplementsAbstractField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField=],
+   isSynthesized
+  */
+  /*member: AbstractClass.declaredAbstractImplementsAbstractField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsAbstractField=,
+    Interface.declaredAbstractImplementsAbstractField=],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_final_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_final_field.dart
new file mode 100644
index 0000000..cb20cef
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_final_field.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+  /*member: Interface.implementedConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int implementedConcreteField = 0;
+
+  /*member: Interface.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract final int implementedAbstractField;
+
+  /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int declaredAbstractImplementsConcreteField = 0;
+
+  /*member: Interface.declaredConcreteImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract final int declaredConcreteImplementsAbstractField;
+
+  /*member: Interface.declaredAbstractImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractImplementsAbstractField;
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+  /*member: AbstractClass.implementedConcreteField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteField#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  final int declaredConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractField#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractField;
+
+  /*member: AbstractClass.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: AbstractClass.declaredAbstractImplementsConcreteField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractImplementsConcreteField;
+
+  /*member: AbstractClass.declaredConcreteImplementsAbstractField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteImplementsAbstractField = 0;
+
+  /*member: AbstractClass.declaredAbstractImplementsAbstractField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_getter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_getter.dart
new file mode 100644
index 0000000..2c44f41
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_getter.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+  /*member: Interface.implementedConcreteGetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get implementedConcreteGetter => 0;
+
+  /*member: Interface.implementedAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get implementedAbstractGetter;
+
+  /*member: Interface.declaredConcreteImplementsConcreteGetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsConcreteGetter => 0;
+
+  /*member: Interface.declaredAbstractImplementsConcreteGetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredAbstractImplementsConcreteGetter => 0;
+
+  /*member: Interface.declaredConcreteImplementsAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsAbstractGetter;
+
+  /*member: Interface.declaredAbstractImplementsAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredAbstractImplementsAbstractGetter;
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+  /*member: AbstractClass.implementedConcreteGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.implementedAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteGetter#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  int get declaredConcreteGetter => 0;
+
+  /*member: AbstractClass.declaredAbstractGetter#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  int get declaredAbstractGetter;
+
+  /*member: AbstractClass.declaredConcreteImplementsConcreteGetter#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsConcreteGetter => 0;
+
+  /*member: AbstractClass.declaredAbstractImplementsConcreteGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsConcreteGetter,
+    Interface.declaredAbstractImplementsConcreteGetter],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteGetter],
+   isSynthesized
+  */
+  int get declaredAbstractImplementsConcreteGetter;
+
+  /*member: AbstractClass.declaredConcreteImplementsAbstractGetter#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsAbstractGetter => 0;
+
+  /*member: AbstractClass.declaredAbstractImplementsAbstractGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsAbstractGetter,
+    Interface.declaredAbstractImplementsAbstractGetter],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractGetter],
+   isSynthesized
+  */
+  int get declaredAbstractImplementsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_method.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_method.dart
new file mode 100644
index 0000000..3b9071e
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_method.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+  /*member: Interface.implementedConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void implementedConcreteMethod() {}
+
+  /*member: Interface.implementedAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void implementedAbstractMethod();
+
+  /*member: Interface.declaredConcreteImplementsConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsConcreteMethod() {}
+
+  /*member: Interface.declaredAbstractImplementsConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredAbstractImplementsConcreteMethod() {}
+
+  /*member: Interface.declaredConcreteImplementsAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsAbstractMethod();
+
+  /*member: Interface.declaredAbstractImplementsAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredAbstractImplementsAbstractMethod();
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+  /*member: AbstractClass.implementedConcreteMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.implementedAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteMethod#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void declaredConcreteMethod() {}
+
+  /*member: AbstractClass.declaredAbstractMethod#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void declaredAbstractMethod();
+
+  /*member: AbstractClass.declaredConcreteImplementsConcreteMethod#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsConcreteMethod() {}
+
+  /*member: AbstractClass.declaredAbstractImplementsConcreteMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsConcreteMethod,
+    Interface.declaredAbstractImplementsConcreteMethod],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteMethod],
+   isSynthesized
+  */
+  void declaredAbstractImplementsConcreteMethod();
+
+  /*member: AbstractClass.declaredConcreteImplementsAbstractMethod#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsAbstractMethod() {}
+
+  /*member: AbstractClass.declaredAbstractImplementsAbstractMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsAbstractMethod,
+    Interface.declaredAbstractImplementsAbstractMethod],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractMethod],
+   isSynthesized
+  */
+  void declaredAbstractImplementsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_setter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_setter.dart
new file mode 100644
index 0000000..601fb9d
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_setter.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+  /*member: Interface.implementedConcreteSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set implementedConcreteSetter(int value) {}
+
+  /*member: Interface.implementedAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set implementedAbstractSetter(int value);
+
+  /*member: Interface.declaredConcreteImplementsConcreteSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+  /*member: Interface.declaredAbstractImplementsConcreteSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredAbstractImplementsConcreteSetter(int value) {}
+
+  /*member: Interface.declaredConcreteImplementsAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsAbstractSetter(int value);
+
+  /*member: Interface.declaredAbstractImplementsAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+  /*member: AbstractClass.implementedConcreteSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.implementedAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.declaredConcreteSetter=#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void set declaredConcreteSetter(int value) {}
+
+  /*member: AbstractClass.declaredAbstractSetter=#int:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  void set declaredAbstractSetter(int value);
+
+  /*member: AbstractClass.declaredConcreteImplementsConcreteSetter=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+  /*member: AbstractClass.declaredAbstractImplementsConcreteSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsConcreteSetter=,
+    Interface.declaredAbstractImplementsConcreteSetter=],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractImplementsConcreteSetter(int value);
+
+  /*member: AbstractClass.declaredConcreteImplementsAbstractSetter=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsAbstractSetter(int value) {}
+
+  /*member: AbstractClass.declaredAbstractImplementsAbstractSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declaredAbstractImplementsAbstractSetter=,
+    Interface.declaredAbstractImplementsAbstractSetter=],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_field.dart
new file mode 100644
index 0000000..549ab8d
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_field.dart
@@ -0,0 +1,219 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+  ConcreteSuper.declaredAbstractExtendsAbstractField,
+  ConcreteSuper.declaredAbstractExtendsAbstractField=,
+  ConcreteSuper.declaredConcreteExtendsAbstractField,
+  ConcreteSuper.declaredConcreteExtendsAbstractField=,
+  ConcreteSuper.extendedAbstractField,
+  ConcreteSuper.extendedAbstractField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+  /*member: ConcreteSuper.extendedConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSuper.extendedConcreteField=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int extendedConcreteField = 0;
+
+  /*member: ConcreteSuper.extendedAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSuper.extendedAbstractField=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractField;
+
+  /*member: ConcreteSuper.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSuper.declaredConcreteExtendsConcreteField=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: ConcreteSuper.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSuper.declaredAbstractExtendsConcreteField=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int declaredAbstractExtendsConcreteField = 0;
+
+  /*member: ConcreteSuper.declaredConcreteExtendsAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSuper.declaredConcreteExtendsAbstractField=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  abstract int declaredConcreteExtendsAbstractField;
+
+  /*member: ConcreteSuper.declaredAbstractExtendsAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSuper.declaredAbstractExtendsAbstractField=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractExtendsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractExtendsAbstractField,
+  ConcreteClass.declaredAbstractExtendsAbstractField=,
+  ConcreteClass.declaredAbstractField,
+  ConcreteClass.declaredAbstractField=,
+  ConcreteSuper.extendedAbstractField,
+  ConcreteSuper.extendedAbstractField=],
+ maxInheritancePath=2,
+ superclasses=[
+  ConcreteSuper,
+  Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+  /*member: ConcreteClass.extendedConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.extendedConcreteField=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.extendedAbstractField=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteField#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredConcreteField=#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  int declaredConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractField#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredAbstractField=#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractField;
+
+  /*member: ConcreteClass.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    ConcreteSuper.declaredConcreteExtendsConcreteField,
+    ConcreteSuper.declaredConcreteExtendsConcreteField=],
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredConcreteExtendsConcreteField=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    ConcreteSuper.declaredConcreteExtendsConcreteField,
+    ConcreteSuper.declaredConcreteExtendsConcreteField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteField],
+   isSynthesized,
+   member=ConcreteSuper.declaredAbstractExtendsConcreteField
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsConcreteField,
+    ConcreteSuper.declaredAbstractExtendsConcreteField],
+   declared-overrides=[
+    ConcreteSuper.declaredAbstractExtendsConcreteField,
+    ConcreteSuper.declaredAbstractExtendsConcreteField=],
+   isSynthesized
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteField=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteField=],
+   isSynthesized,
+   member=ConcreteSuper.declaredAbstractExtendsConcreteField
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsConcreteField=,
+    ConcreteSuper.declaredAbstractExtendsConcreteField=],
+   declared-overrides=[
+    ConcreteSuper.declaredAbstractExtendsConcreteField,
+    ConcreteSuper.declaredAbstractExtendsConcreteField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractExtendsConcreteField;
+
+  /*member: ConcreteClass.declaredConcreteExtendsAbstractField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    ConcreteSuper.declaredConcreteExtendsAbstractField,
+    ConcreteSuper.declaredConcreteExtendsAbstractField=],
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredConcreteExtendsAbstractField=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    ConcreteSuper.declaredConcreteExtendsAbstractField,
+    ConcreteSuper.declaredConcreteExtendsAbstractField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteExtendsAbstractField = 0;
+
+  /*member: ConcreteClass.declaredAbstractExtendsAbstractField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsAbstractField,
+    ConcreteSuper.declaredAbstractExtendsAbstractField],
+   declared-overrides=[
+    ConcreteSuper.declaredAbstractExtendsAbstractField,
+    ConcreteSuper.declaredAbstractExtendsAbstractField=],
+   isSynthesized
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsAbstractField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsAbstractField=,
+    ConcreteSuper.declaredAbstractExtendsAbstractField=],
+   declared-overrides=[
+    ConcreteSuper.declaredAbstractExtendsAbstractField,
+    ConcreteSuper.declaredAbstractExtendsAbstractField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractExtendsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_final_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_final_field.dart
new file mode 100644
index 0000000..10334b2
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_final_field.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+  ConcreteSuper.declaredAbstractExtendsAbstractField,
+  ConcreteSuper.declaredConcreteExtendsAbstractField,
+  ConcreteSuper.extendedAbstractField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+  /*member: ConcreteSuper.extendedConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  final int extendedConcreteField = 0;
+
+  /*member: ConcreteSuper.extendedAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractField;
+
+  /*member: ConcreteSuper.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  final int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: ConcreteSuper.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  final int declaredAbstractExtendsConcreteField = 0;
+
+  /*member: ConcreteSuper.declaredConcreteExtendsAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  abstract final int declaredConcreteExtendsAbstractField;
+
+  /*member: ConcreteSuper.declaredAbstractExtendsAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractExtendsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractExtendsAbstractField,
+  ConcreteClass.declaredAbstractField,
+  ConcreteSuper.extendedAbstractField],
+ maxInheritancePath=2,
+ superclasses=[
+  ConcreteSuper,
+  Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+  /*member: ConcreteClass.extendedConcreteField#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractField#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteField#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  final int declaredConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractField#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractField;
+
+  /*member: ConcreteClass.declaredConcreteExtendsConcreteField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteExtendsConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteField#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteField],
+   isSynthesized,
+   member=ConcreteSuper.declaredAbstractExtendsConcreteField
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsConcreteField,
+    ConcreteSuper.declaredAbstractExtendsConcreteField],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractExtendsConcreteField;
+
+  /*member: ConcreteClass.declaredConcreteExtendsAbstractField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteExtendsAbstractField = 0;
+
+  /*member: ConcreteClass.declaredAbstractExtendsAbstractField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsAbstractField,
+    ConcreteSuper.declaredAbstractExtendsAbstractField],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractExtendsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_getter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_getter.dart
new file mode 100644
index 0000000..8bf90fe
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_getter.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+  ConcreteSuper.declaredAbstractExtendsAbstractGetter,
+  ConcreteSuper.declaredConcreteExtendsAbstractGetter,
+  ConcreteSuper.extendedAbstractGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+  /*member: ConcreteSuper.extendedConcreteGetter#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int get extendedConcreteGetter => 0;
+
+  /*member: ConcreteSuper.extendedAbstractGetter#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int get extendedAbstractGetter;
+
+  /*member: ConcreteSuper.declaredConcreteExtendsConcreteGetter#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsConcreteGetter => 0;
+
+  /*member: ConcreteSuper.declaredAbstractExtendsConcreteGetter#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int get declaredAbstractExtendsConcreteGetter => 0;
+
+  /*member: ConcreteSuper.declaredConcreteExtendsAbstractGetter#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsAbstractGetter;
+
+  /*member: ConcreteSuper.declaredAbstractExtendsAbstractGetter#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  int get declaredAbstractExtendsAbstractGetter;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractExtendsAbstractGetter,
+  ConcreteClass.declaredAbstractGetter,
+  ConcreteSuper.extendedAbstractGetter],
+ maxInheritancePath=2,
+ superclasses=[
+  ConcreteSuper,
+  Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+  /*member: ConcreteClass.extendedConcreteGetter#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractGetter#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteGetter#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  int get declaredConcreteGetter => 0;
+
+  /*member: ConcreteClass.declaredAbstractGetter#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  int get declaredAbstractGetter;
+
+  /*member: ConcreteClass.declaredConcreteExtendsConcreteGetter#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsConcreteGetter => 0;
+
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteGetter#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteGetter],
+   isSynthesized,
+   member=ConcreteSuper.declaredAbstractExtendsConcreteGetter
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsConcreteGetter,
+    ConcreteSuper.declaredAbstractExtendsConcreteGetter],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteGetter],
+   isSynthesized
+  */
+  int get declaredAbstractExtendsConcreteGetter;
+
+  /*member: ConcreteClass.declaredConcreteExtendsAbstractGetter#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteExtendsAbstractGetter => 0;
+
+  /*member: ConcreteClass.declaredAbstractExtendsAbstractGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsAbstractGetter,
+    ConcreteSuper.declaredAbstractExtendsAbstractGetter],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractGetter],
+   isSynthesized
+  */
+  int get declaredAbstractExtendsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_method.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_method.dart
new file mode 100644
index 0000000..d35a461
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_method.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+  ConcreteSuper.declaredAbstractExtendsAbstractMethod,
+  ConcreteSuper.declaredConcreteExtendsAbstractMethod,
+  ConcreteSuper.extendedAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+  /*member: ConcreteSuper.extendedConcreteMethod#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void extendedConcreteMethod() {}
+
+  /*member: ConcreteSuper.extendedAbstractMethod#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void extendedAbstractMethod();
+
+  /*member: ConcreteSuper.declaredConcreteExtendsConcreteMethod#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsConcreteMethod() {}
+
+  /*member: ConcreteSuper.declaredAbstractExtendsConcreteMethod#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void declaredAbstractExtendsConcreteMethod() {}
+
+  /*member: ConcreteSuper.declaredConcreteExtendsAbstractMethod#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsAbstractMethod();
+
+  /*member: ConcreteSuper.declaredAbstractExtendsAbstractMethod#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void declaredAbstractExtendsAbstractMethod();
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractExtendsAbstractMethod,
+  ConcreteClass.declaredAbstractMethod,
+  ConcreteSuper.extendedAbstractMethod],
+ maxInheritancePath=2,
+ superclasses=[
+  ConcreteSuper,
+  Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+  /*member: ConcreteClass.extendedConcreteMethod#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractMethod#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteMethod#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void declaredConcreteMethod() {}
+
+  /*member: ConcreteClass.declaredAbstractMethod#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void declaredAbstractMethod();
+
+  /*member: ConcreteClass.declaredConcreteExtendsConcreteMethod#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsConcreteMethod() {}
+
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteMethod#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteMethod],
+   isSynthesized,
+   member=ConcreteSuper.declaredAbstractExtendsConcreteMethod
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsConcreteMethod,
+    ConcreteSuper.declaredAbstractExtendsConcreteMethod],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteMethod],
+   isSynthesized
+  */
+  void declaredAbstractExtendsConcreteMethod();
+
+  /*member: ConcreteClass.declaredConcreteExtendsAbstractMethod#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteExtendsAbstractMethod() {}
+
+  /*member: ConcreteClass.declaredAbstractExtendsAbstractMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsAbstractMethod,
+    ConcreteSuper.declaredAbstractExtendsAbstractMethod],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractMethod],
+   isSynthesized
+  */
+  void declaredAbstractExtendsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_setter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_setter.dart
new file mode 100644
index 0000000..35a7340
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_setter.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+  ConcreteSuper.declaredAbstractExtendsAbstractSetter=,
+  ConcreteSuper.declaredConcreteExtendsAbstractSetter=,
+  ConcreteSuper.extendedAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+  /*member: ConcreteSuper.extendedConcreteSetter=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void set extendedConcreteSetter(int value) {}
+
+  /*member: ConcreteSuper.extendedAbstractSetter=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void set extendedAbstractSetter(int value);
+
+  /*member: ConcreteSuper.declaredConcreteExtendsConcreteSetter=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+  /*member: ConcreteSuper.declaredAbstractExtendsConcreteSetter=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void set declaredAbstractExtendsConcreteSetter(int value) {}
+
+  /*member: ConcreteSuper.declaredConcreteExtendsAbstractSetter=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsAbstractSetter(int value);
+
+  /*member: ConcreteSuper.declaredAbstractExtendsAbstractSetter=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+  void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractExtendsAbstractSetter=,
+  ConcreteClass.declaredAbstractSetter=,
+  ConcreteSuper.extendedAbstractSetter=],
+ maxInheritancePath=2,
+ superclasses=[
+  ConcreteSuper,
+  Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+  /*member: ConcreteClass.extendedConcreteSetter=#cls:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractSetter=#int:
+   classBuilder=ConcreteSuper,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteSetter=#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void set declaredConcreteSetter(int value) {}
+
+  /*member: ConcreteClass.declaredAbstractSetter=#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void set declaredAbstractSetter(int value);
+
+  /*member: ConcreteClass.declaredConcreteExtendsConcreteSetter=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteSetter=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteSetter=],
+   isSynthesized,
+   member=ConcreteSuper.declaredAbstractExtendsConcreteSetter=
+  */
+  /*member: ConcreteClass.declaredAbstractExtendsConcreteSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsConcreteSetter=,
+    ConcreteSuper.declaredAbstractExtendsConcreteSetter=],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractExtendsConcreteSetter(int value);
+
+  /*member: ConcreteClass.declaredConcreteExtendsAbstractSetter=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteExtendsAbstractSetter(int value) {}
+
+  /*member: ConcreteClass.declaredAbstractExtendsAbstractSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractExtendsAbstractSetter=,
+    ConcreteSuper.declaredAbstractExtendsAbstractSetter=],
+   declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_field.dart
new file mode 100644
index 0000000..dabaa18
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_field.dart
@@ -0,0 +1,210 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ abstractMembers=[
+  Interface.declaredAbstractImplementsAbstractField,
+  Interface.declaredAbstractImplementsAbstractField=,
+  Interface.declaredConcreteImplementsAbstractField,
+  Interface.declaredConcreteImplementsAbstractField=,
+  Interface.implementedAbstractField,
+  Interface.implementedAbstractField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.implementedConcreteField=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int implementedConcreteField = 0;
+
+  /*member: Interface.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.implementedAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract int implementedAbstractField;
+
+  /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredConcreteImplementsConcreteField=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredAbstractImplementsConcreteField=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int declaredAbstractImplementsConcreteField = 0;
+
+  /*member: Interface.declaredConcreteImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredConcreteImplementsAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract int declaredConcreteImplementsAbstractField;
+
+  /*member: Interface.declaredAbstractImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.declaredAbstractImplementsAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractImplementsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractField,
+  ConcreteClass.declaredAbstractField=,
+  ConcreteClass.declaredAbstractImplementsAbstractField,
+  ConcreteClass.declaredAbstractImplementsAbstractField=,
+  ConcreteClass.declaredAbstractImplementsConcreteField,
+  ConcreteClass.declaredAbstractImplementsConcreteField=,
+  Interface.implementedAbstractField,
+  Interface.implementedAbstractField=,
+  Interface.implementedConcreteField,
+  Interface.implementedConcreteField=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+  /*member: ConcreteClass.implementedConcreteField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.implementedConcreteField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.implementedAbstractField=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteField#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredConcreteField=#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  int declaredConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractField#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredAbstractField=#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  abstract int declaredAbstractField;
+
+  /*member: ConcreteClass.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsConcreteField,
+    Interface.declaredConcreteImplementsConcreteField=],
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredConcreteImplementsConcreteField=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsConcreteField,
+    Interface.declaredConcreteImplementsConcreteField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractImplementsConcreteField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField=],
+   isSynthesized
+  */
+  /*member: ConcreteClass.declaredAbstractImplementsConcreteField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsConcreteField=,
+    Interface.declaredAbstractImplementsConcreteField=],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractImplementsConcreteField;
+
+  /*member: ConcreteClass.declaredConcreteImplementsAbstractField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsAbstractField,
+    Interface.declaredConcreteImplementsAbstractField=],
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declaredConcreteImplementsAbstractField=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface.declaredConcreteImplementsAbstractField,
+    Interface.declaredConcreteImplementsAbstractField=],
+   isSourceDeclaration
+  */
+  int declaredConcreteImplementsAbstractField = 0;
+
+  /*member: ConcreteClass.declaredAbstractImplementsAbstractField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField=],
+   isSynthesized
+  */
+  /*member: ConcreteClass.declaredAbstractImplementsAbstractField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsAbstractField=,
+    Interface.declaredAbstractImplementsAbstractField=],
+   declared-overrides=[
+    Interface.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField=],
+   isSynthesized
+  */
+  abstract int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_final_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_final_field.dart
new file mode 100644
index 0000000..20a42b0
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_final_field.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ abstractMembers=[
+  Interface.declaredAbstractImplementsAbstractField,
+  Interface.declaredConcreteImplementsAbstractField,
+  Interface.implementedAbstractField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int implementedConcreteField = 0;
+
+  /*member: Interface.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract final int implementedAbstractField;
+
+  /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int declaredAbstractImplementsConcreteField = 0;
+
+  /*member: Interface.declaredConcreteImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract final int declaredConcreteImplementsAbstractField;
+
+  /*member: Interface.declaredAbstractImplementsAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractImplementsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractField,
+  ConcreteClass.declaredAbstractImplementsAbstractField,
+  ConcreteClass.declaredAbstractImplementsConcreteField,
+  Interface.implementedAbstractField,
+  Interface.implementedConcreteField],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+  /*member: ConcreteClass.implementedConcreteField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.implementedAbstractField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteField#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  final int declaredConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractField#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  abstract final int declaredAbstractField;
+
+  /*member: ConcreteClass.declaredConcreteImplementsConcreteField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteImplementsConcreteField = 0;
+
+  /*member: ConcreteClass.declaredAbstractImplementsConcreteField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsConcreteField,
+    Interface.declaredAbstractImplementsConcreteField],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractImplementsConcreteField;
+
+  /*member: ConcreteClass.declaredConcreteImplementsAbstractField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractField],
+   isSourceDeclaration
+  */
+  final int declaredConcreteImplementsAbstractField = 0;
+
+  /*member: ConcreteClass.declaredAbstractImplementsAbstractField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsAbstractField,
+    Interface.declaredAbstractImplementsAbstractField],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractField],
+   isSynthesized
+  */
+  abstract final int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_getter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_getter.dart
new file mode 100644
index 0000000..80dbb0a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_getter.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ abstractMembers=[
+  Interface.declaredAbstractImplementsAbstractGetter,
+  Interface.declaredConcreteImplementsAbstractGetter,
+  Interface.implementedAbstractGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedConcreteGetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get implementedConcreteGetter => 0;
+
+  /*member: Interface.implementedAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get implementedAbstractGetter;
+
+  /*member: Interface.declaredConcreteImplementsConcreteGetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsConcreteGetter => 0;
+
+  /*member: Interface.declaredAbstractImplementsConcreteGetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredAbstractImplementsConcreteGetter => 0;
+
+  /*member: Interface.declaredConcreteImplementsAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsAbstractGetter;
+
+  /*member: Interface.declaredAbstractImplementsAbstractGetter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get declaredAbstractImplementsAbstractGetter;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractGetter,
+  ConcreteClass.declaredAbstractImplementsAbstractGetter,
+  ConcreteClass.declaredAbstractImplementsConcreteGetter,
+  Interface.implementedAbstractGetter,
+  Interface.implementedConcreteGetter],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+/*member: ConcreteClass.implementedConcreteGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+*/
+/*member: ConcreteClass.implementedAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+*/
+class ConcreteClass implements Interface {
+  /*member: ConcreteClass.declaredConcreteGetter#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  int get declaredConcreteGetter => 0;
+
+  /*member: ConcreteClass.declaredAbstractGetter#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  int get declaredAbstractGetter;
+
+  /*member: ConcreteClass.declaredConcreteImplementsConcreteGetter#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsConcreteGetter => 0;
+
+  /*member: ConcreteClass.declaredAbstractImplementsConcreteGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsConcreteGetter,
+    Interface.declaredAbstractImplementsConcreteGetter],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteGetter],
+   isSynthesized
+  */
+  int get declaredAbstractImplementsConcreteGetter;
+
+  /*member: ConcreteClass.declaredConcreteImplementsAbstractGetter#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractGetter],
+   isSourceDeclaration
+  */
+  int get declaredConcreteImplementsAbstractGetter => 0;
+
+  /*member: ConcreteClass.declaredAbstractImplementsAbstractGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsAbstractGetter,
+    Interface.declaredAbstractImplementsAbstractGetter],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractGetter],
+   isSynthesized
+  */
+  int get declaredAbstractImplementsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_method.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_method.dart
new file mode 100644
index 0000000..a040731
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_method.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ abstractMembers=[
+  Interface.declaredAbstractImplementsAbstractMethod,
+  Interface.declaredConcreteImplementsAbstractMethod,
+  Interface.implementedAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void implementedConcreteMethod() {}
+
+  /*member: Interface.implementedAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void implementedAbstractMethod();
+
+  /*member: Interface.declaredConcreteImplementsConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsConcreteMethod() {}
+
+  /*member: Interface.declaredAbstractImplementsConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredAbstractImplementsConcreteMethod() {}
+
+  /*member: Interface.declaredConcreteImplementsAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsAbstractMethod();
+
+  /*member: Interface.declaredAbstractImplementsAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void declaredAbstractImplementsAbstractMethod();
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractImplementsAbstractMethod,
+  ConcreteClass.declaredAbstractImplementsConcreteMethod,
+  ConcreteClass.declaredAbstractMethod,
+  Interface.implementedAbstractMethod,
+  Interface.implementedConcreteMethod],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+  /*member: ConcreteClass.implementedConcreteMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.implementedAbstractMethod#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteMethod#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void declaredConcreteMethod() {}
+
+  /*member: ConcreteClass.declaredAbstractMethod#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void declaredAbstractMethod();
+
+  /*member: ConcreteClass.declaredConcreteImplementsConcreteMethod#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsConcreteMethod() {}
+
+  /*member: ConcreteClass.declaredAbstractImplementsConcreteMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsConcreteMethod,
+    Interface.declaredAbstractImplementsConcreteMethod],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteMethod],
+   isSynthesized
+  */
+  void declaredAbstractImplementsConcreteMethod();
+
+  /*member: ConcreteClass.declaredConcreteImplementsAbstractMethod#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractMethod],
+   isSourceDeclaration
+  */
+  void declaredConcreteImplementsAbstractMethod() {}
+
+  /*member: ConcreteClass.declaredAbstractImplementsAbstractMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsAbstractMethod,
+    Interface.declaredAbstractImplementsAbstractMethod],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractMethod],
+   isSynthesized
+  */
+  void declaredAbstractImplementsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_setter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_setter.dart
new file mode 100644
index 0000000..92279c3
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_setter.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ abstractMembers=[
+  Interface.declaredAbstractImplementsAbstractSetter=,
+  Interface.declaredConcreteImplementsAbstractSetter=,
+  Interface.implementedAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedConcreteSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set implementedConcreteSetter(int value) {}
+
+  /*member: Interface.implementedAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set implementedAbstractSetter(int value);
+
+  /*member: Interface.declaredConcreteImplementsConcreteSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+  /*member: Interface.declaredAbstractImplementsConcreteSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredAbstractImplementsConcreteSetter(int value) {}
+
+  /*member: Interface.declaredConcreteImplementsAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsAbstractSetter(int value);
+
+  /*member: Interface.declaredAbstractImplementsAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declaredAbstractImplementsAbstractSetter=,
+  ConcreteClass.declaredAbstractImplementsConcreteSetter=,
+  ConcreteClass.declaredAbstractSetter=,
+  Interface.implementedAbstractSetter=,
+  Interface.implementedConcreteSetter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+  /*member: ConcreteClass.implementedConcreteSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.implementedAbstractSetter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.declaredConcreteSetter=#cls:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void set declaredConcreteSetter(int value) {}
+
+  /*member: ConcreteClass.declaredAbstractSetter=#int:
+   classBuilder=ConcreteClass,
+   isSourceDeclaration
+  */
+  void set declaredAbstractSetter(int value);
+
+  /*member: ConcreteClass.declaredConcreteImplementsConcreteSetter=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsConcreteSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+  /*member: ConcreteClass.declaredAbstractImplementsConcreteSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsConcreteSetter=,
+    Interface.declaredAbstractImplementsConcreteSetter=],
+   declared-overrides=[Interface.declaredAbstractImplementsConcreteSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractImplementsConcreteSetter(int value);
+
+  /*member: ConcreteClass.declaredConcreteImplementsAbstractSetter=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[Interface.declaredConcreteImplementsAbstractSetter=],
+   isSourceDeclaration
+  */
+  void set declaredConcreteImplementsAbstractSetter(int value) {}
+
+  /*member: ConcreteClass.declaredAbstractImplementsAbstractSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declaredAbstractImplementsAbstractSetter=,
+    Interface.declaredAbstractImplementsAbstractSetter=],
+   declared-overrides=[Interface.declaredAbstractImplementsAbstractSetter=],
+   isSynthesized
+  */
+  void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/conflict.dart b/pkg/front_end/test/class_hierarchy/data/conflict.dart
new file mode 100644
index 0000000..10003cd
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/conflict.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedFieldDeclaredMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedFieldDeclaredMethod=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedFieldDeclaredMethod = 0;
+}
+
+/*class: Class:
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+/*member: Class.extendedFieldDeclaredMethod=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class Class extends Super {
+  /*member: Class.extendedFieldDeclaredMethod#cls:
+   classBuilder=Class,
+   isSourceDeclaration
+  */
+  void extendedFieldDeclaredMethod() {}
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/covariance.dart b/pkg/front_end/test/class_hierarchy/data/covariance.dart
new file mode 100644
index 0000000..e65d4ea
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/covariance.dart
@@ -0,0 +1,438 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// From language/covariant_override/tear_off_type_test
+
+// If a parameter is directly or indirectly a covariant override, its type in
+// the method tear-off should become Object?.
+
+/*class: M1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class M1 {
+  /*member: M1.method#cls:
+   classBuilder=M1,
+   isSourceDeclaration
+  */
+  method(covariant int a, int b) {}
+}
+
+/*class: M2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class M2 {
+  /*member: M2.method#cls:
+   classBuilder=M2,
+   isSourceDeclaration
+  */
+  method(int a, covariant int b) {}
+}
+
+/*class: _C&Object&M1:
+ interfaces=[M1],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+/*member: _C&Object&M1.method#cls:
+ classBuilder=_C&Object&M1,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=M1.method
+*/
+/*member: _C&Object&M1.method#int:
+ classBuilder=_C&Object&M1,
+ concreteMixinStub,
+ declarations=[M1.method],
+ isSynthesized,
+ stubTarget=M1.method
+*/
+
+/*class: _C&Object&M1&M2:
+ interfaces=[
+  M1,
+  M2],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  _C&Object&M1]
+*/
+
+/*member: _C&Object&M1&M2.method#cls:
+ classBuilder=_C&Object&M1&M2,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant,1:Covariant),
+ isSynthesized,
+ stubTarget=M2.method,
+ type=dynamic Function(int, int)
+*/
+/*member: _C&Object&M1&M2.method#int:
+ classBuilder=_C&Object&M1&M2,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant,1:Covariant),
+ declarations=[
+  M2.method,
+  _C&Object&M1.method],
+ isSynthesized,
+ stubTarget=M2.method,
+ type=dynamic Function(int, int)
+*/
+
+/*class: C:
+ interfaces=[
+  M1,
+  M2],
+ maxInheritancePath=4,
+ superclasses=[
+  Object,
+  _C&Object&M1,
+  _C&Object&M1&M2]
+*/
+class C extends Object with M1, M2 {
+  /*member: C.method#cls:
+   classBuilder=C,
+   inherited-implements=[_C&Object&M1&M2.method],
+   isSynthesized,
+   member=_C&Object&M1&M2.method
+  */
+  /*member: C.method#int:
+   classBuilder=_C&Object&M1&M2,
+   declarations=[
+    M2.method,
+    _C&Object&M1.method],
+   isSynthesized,
+   member=_C&Object&M1&M2.method
+  */
+}
+
+/*class: Direct:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Direct {
+  /*member: Direct.positional#cls:
+   classBuilder=Direct,
+   isSourceDeclaration
+  */
+  void positional(covariant int a, int b, covariant int c, int d, int e) {}
+
+  /*member: Direct.optional#cls:
+   classBuilder=Direct,
+   isSourceDeclaration
+  */
+  void optional(
+      [covariant int a = 0, int b = 0, covariant int c = 0, int d = 0]) {}
+
+  /*member: Direct.named#cls:
+   classBuilder=Direct,
+   isSourceDeclaration
+  */
+  void named(
+      {covariant int a = 0, int b = 0, covariant int c = 0, int d = 0}) {}
+}
+
+/*class: Inherited:
+ maxInheritancePath=2,
+ superclasses=[
+  Direct,
+  Object]
+*/
+class Inherited extends Direct {
+  /*member: Inherited.positional#cls:
+   classBuilder=Direct,
+   isSourceDeclaration
+  */
+
+  /*member: Inherited.optional#cls:
+   classBuilder=Direct,
+   isSourceDeclaration
+  */
+
+  /*member: Inherited.named#cls:
+   classBuilder=Direct,
+   isSourceDeclaration
+  */
+}
+
+// ---
+
+/*class: Override1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Override1 {
+  /*member: Override1.method#cls:
+   classBuilder=Override1,
+   isSourceDeclaration
+  */
+  void method(covariant int a, int b, int c, int d, int e) {}
+}
+
+/*class: Override2:
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Override1]
+*/
+class Override2 extends Override1 {
+  /*member: Override2.method#cls:
+   classBuilder=Override2,
+   declared-overrides=[Override1.method],
+   isSourceDeclaration
+  */
+  void method(int a, int b, covariant int c, int d, int e) {}
+}
+
+/*class: Override3:
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Override1,
+  Override2]
+*/
+class Override3 extends Override2 {
+  /*member: Override3.method#cls:
+   classBuilder=Override3,
+   declared-overrides=[Override2.method],
+   isSourceDeclaration
+  */
+  void method(int a, int b, int c, int d, int e) {}
+}
+
+// ---
+
+/*class: Implement1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Implement1 {
+  /*member: Implement1.method#cls:
+   classBuilder=Implement1,
+   isSourceDeclaration
+  */
+  void method(covariant int a, int b, int c, int d, int e) {}
+}
+
+/*class: Implement2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Implement2 {
+  /*member: Implement2.method#cls:
+   classBuilder=Implement2,
+   isSourceDeclaration
+  */
+  void method(int a, covariant int b, int c, int d, int e) {}
+}
+
+/*class: Implement3:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Implement3 {
+  /*member: Implement3.method#cls:
+   classBuilder=Implement3,
+   isSourceDeclaration
+  */
+  void method(int a, int b, covariant int c, int d, int e) {}
+}
+
+/*class: Implement4:
+ interfaces=[Implement3],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class Implement4 implements Implement3 {
+  /*member: Implement4.method#cls:
+   classBuilder=Implement4,
+   declared-overrides=[Implement3.method],
+   isSourceDeclaration
+  */
+  void method(int a, int b, int c, covariant int d, int e) {}
+}
+
+/*class: Implement5:
+ interfaces=[
+  Implement1,
+  Implement2,
+  Implement3,
+  Implement4],
+ maxInheritancePath=3,
+ superclasses=[Object]
+*/
+class Implement5 implements Implement1, Implement2, Implement4 {
+  /*member: Implement5.method#cls:
+   classBuilder=Implement5,
+   declared-overrides=[
+    Implement1.method,
+    Implement2.method,
+    Implement4.method],
+   isSourceDeclaration
+  */
+  void method(int a, int b, int c, int d, covariant int e) {}
+}
+
+// ---
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.method#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void method(covariant int a, int b, int c, int d, int e) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.method#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void method(int a, covariant int b, int c, int d, int e) {}
+}
+
+/*class: Mixin1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin1 {
+  /*member: Mixin1.method#cls:
+   classBuilder=Mixin1,
+   isSourceDeclaration
+  */
+  void method(int a, int b, covariant int c, int d, int e) {}
+}
+
+/*class: Mixin2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin2 {
+  /*member: Mixin2.method#cls:
+   classBuilder=Mixin2,
+   isSourceDeclaration
+  */
+  void method(int a, int b, int c, covariant int d, int e) {}
+}
+
+/*class: Superclass:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Superclass {
+  /*member: Superclass.method#cls:
+   classBuilder=Superclass,
+   isSourceDeclaration
+  */
+  void method(int a, int b, int c, int d, covariant int e) {}
+}
+
+/*class: _Mixed&Superclass&Mixin1:
+ interfaces=[Mixin1],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Superclass]
+*/
+
+/*member: _Mixed&Superclass&Mixin1.method#cls:
+ classBuilder=_Mixed&Superclass&Mixin1,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,4:Covariant),
+ isSynthesized,
+ stubTarget=Mixin1.method,
+ type=void Function(int, int, int, int, int)
+*/
+/*member: _Mixed&Superclass&Mixin1.method#int:
+ classBuilder=_Mixed&Superclass&Mixin1,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,4:Covariant),
+ declarations=[
+  Mixin1.method,
+  Superclass.method],
+ isSynthesized,
+ stubTarget=Mixin1.method,
+ type=void Function(int, int, int, int, int)
+*/
+
+/*class: _Mixed&Superclass&Mixin1&Mixin2:
+ interfaces=[
+  Mixin1,
+  Mixin2],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Superclass,
+  _Mixed&Superclass&Mixin1]
+*/
+
+/*member: _Mixed&Superclass&Mixin1&Mixin2.method#cls:
+ classBuilder=_Mixed&Superclass&Mixin1&Mixin2,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,3:Covariant,4:Covariant),
+ isSynthesized,
+ stubTarget=Mixin2.method,
+ type=void Function(int, int, int, int, int)
+*/
+/*member: _Mixed&Superclass&Mixin1&Mixin2.method#int:
+ classBuilder=_Mixed&Superclass&Mixin1&Mixin2,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,3:Covariant,4:Covariant),
+ declarations=[
+  Mixin2.method,
+  _Mixed&Superclass&Mixin1.method],
+ isSynthesized,
+ stubTarget=Mixin2.method,
+ type=void Function(int, int, int, int, int)
+*/
+
+/*class: Mixed:
+ interfaces=[
+  Interface1,
+  Interface2,
+  Mixin1,
+  Mixin2],
+ maxInheritancePath=4,
+ superclasses=[
+  Object,
+  Superclass,
+  _Mixed&Superclass&Mixin1,
+  _Mixed&Superclass&Mixin1&Mixin2]
+*/
+class Mixed extends Superclass
+    with Mixin1, Mixin2
+    implements Interface1, Interface2 {
+  /*member: Mixed.method#cls:
+   classBuilder=Mixed,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant,1:Covariant,2:Covariant,3:Covariant,4:Covariant),
+   inherited-implements=[Mixed.method],
+   isSynthesized,
+   stubTarget=Mixin2.method,
+   type=void Function(int, int, int, int, int)
+  */
+  /*member: Mixed.method#int:
+   classBuilder=Mixed,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant,1:Covariant,2:Covariant,3:Covariant,4:Covariant),
+   declarations=[
+    Interface1.method,
+    Interface2.method,
+    _Mixed&Superclass&Mixin1&Mixin2.method],
+   isSynthesized,
+   stubTarget=Mixin2.method,
+   type=void Function(int, int, int, int, int)
+  */
+}
+
+void main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/covariant_equals.dart b/pkg/front_end/test/class_hierarchy/data/covariant_equals.dart
new file mode 100644
index 0000000..5c20e81
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/covariant_equals.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+/*class: A:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class A {
+  /*member: A.==#cls:
+   classBuilder=A,
+   declared-overrides=[Object.==],
+   isSourceDeclaration
+  */
+  bool operator ==(covariant A other) => true;
+}
+
+/*class: B:
+ maxInheritancePath=2,
+ superclasses=[
+  A,
+  Object]
+*/
+class B extends A {
+  /*member: B.==#cls:
+   classBuilder=B,
+   declared-overrides=[A.==],
+   isSourceDeclaration
+  */
+  bool operator ==(other) => true;
+}
+
+/*class: C:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class C<T> {
+  /*member: C.==#cls:
+   classBuilder=C,
+   declared-overrides=[Object.==],
+   isSourceDeclaration
+  */
+  bool operator ==(covariant C<T> other) => true;
+}
+
+/*class: D:
+ maxInheritancePath=2,
+ superclasses=[
+  C<int>,
+  Object]
+*/
+class D extends C<int> {
+  /*member: D.==#cls:
+   classBuilder=C,
+   isSourceDeclaration
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/declares.dart b/pkg/front_end/test/class_hierarchy/data/declares.dart
new file mode 100644
index 0000000..ea7fd5b
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/declares.dart
@@ -0,0 +1,223 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractDeclaredAbstractMethod,
+  Super.extendedAbstractDeclaredConcreteMethod,
+  Super.extendedAbstractImplementedDeclaredAbstractMethod,
+  Super.extendedAbstractImplementedDeclaredConcreteMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteDeclaredConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteDeclaredConcreteMethod() {}
+
+  /*member: Super.extendedAbstractDeclaredConcreteMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractDeclaredConcreteMethod();
+
+  /*member: Super.extendedConcreteDeclaredAbstractMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteDeclaredAbstractMethod() {}
+  /*member: Super.extendedAbstractDeclaredAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractDeclaredAbstractMethod();
+
+  /*member: Super.extendedConcreteImplementedDeclaredConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedDeclaredConcreteMethod() {}
+
+  /*member: Super.extendedAbstractImplementedDeclaredConcreteMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedDeclaredConcreteMethod();
+
+  /*member: Super.extendedConcreteImplementedDeclaredAbstractMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedDeclaredAbstractMethod() {}
+
+  /*member: Super.extendedAbstractImplementedDeclaredAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedDeclaredAbstractMethod();
+}
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedDeclaredConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void implementedDeclaredConcreteMethod() {}
+
+  /*member: Interface.implementedDeclaredAbstractMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void implementedDeclaredAbstractMethod() {}
+
+  /*member: Interface.extendedConcreteImplementedDeclaredConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedDeclaredConcreteMethod() {}
+
+  /*member: Interface.extendedAbstractImplementedDeclaredConcreteMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedDeclaredConcreteMethod() {}
+
+  /*member: Interface.extendedConcreteImplementedDeclaredAbstractMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedDeclaredAbstractMethod() {}
+
+  /*member: Interface.extendedAbstractImplementedDeclaredAbstractMethod#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedDeclaredAbstractMethod() {}
+}
+
+/*class: Class:
+ abstractMembers=[
+  Class.extendedAbstractDeclaredAbstractMethod,
+  Class.extendedAbstractImplementedDeclaredAbstractMethod,
+  Class.implementedDeclaredAbstractMethod],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class Class extends Super implements Interface {
+  /*member: Class.extendedConcreteDeclaredConcreteMethod#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedConcreteDeclaredConcreteMethod],
+   isSourceDeclaration
+  */
+  void extendedConcreteDeclaredConcreteMethod() {}
+
+  /*member: Class.extendedAbstractDeclaredConcreteMethod#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedAbstractDeclaredConcreteMethod],
+   isSourceDeclaration
+  */
+  void extendedAbstractDeclaredConcreteMethod() {}
+
+  /*member: Class.extendedConcreteDeclaredAbstractMethod#cls:
+   classBuilder=Class,
+   inherited-implements=[Class.extendedConcreteDeclaredAbstractMethod],
+   isSynthesized,
+   member=Super.extendedConcreteDeclaredAbstractMethod
+  */
+  /*member: Class.extendedConcreteDeclaredAbstractMethod#int:
+   classBuilder=Class,
+   declarations=[
+    Class.extendedConcreteDeclaredAbstractMethod,
+    Super.extendedConcreteDeclaredAbstractMethod],
+   declared-overrides=[Super.extendedConcreteDeclaredAbstractMethod],
+   isSynthesized
+  */
+  void extendedConcreteDeclaredAbstractMethod();
+
+  /*member: Class.extendedAbstractDeclaredAbstractMethod#int:
+   classBuilder=Class,
+   declarations=[
+    Class.extendedAbstractDeclaredAbstractMethod,
+    Super.extendedAbstractDeclaredAbstractMethod],
+   declared-overrides=[Super.extendedAbstractDeclaredAbstractMethod],
+   isSynthesized
+  */
+  void extendedAbstractDeclaredAbstractMethod();
+
+  /*member: Class.implementedDeclaredConcreteMethod#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface.implementedDeclaredConcreteMethod],
+   isSourceDeclaration
+  */
+  void implementedDeclaredConcreteMethod() {}
+
+  /*member: Class.implementedDeclaredAbstractMethod#int:
+   classBuilder=Class,
+   declarations=[
+    Class.implementedDeclaredAbstractMethod,
+    Interface.implementedDeclaredAbstractMethod],
+   declared-overrides=[Interface.implementedDeclaredAbstractMethod],
+   isSynthesized
+  */
+  void implementedDeclaredAbstractMethod();
+
+  /*member: Class.extendedConcreteImplementedDeclaredConcreteMethod#cls:
+   classBuilder=Class,
+   declared-overrides=[
+    Interface.extendedConcreteImplementedDeclaredConcreteMethod,
+    Super.extendedConcreteImplementedDeclaredConcreteMethod],
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedDeclaredConcreteMethod() {}
+
+  /*member: Class.extendedAbstractImplementedDeclaredConcreteMethod#cls:
+   classBuilder=Class,
+   declared-overrides=[
+    Interface.extendedAbstractImplementedDeclaredConcreteMethod,
+    Super.extendedAbstractImplementedDeclaredConcreteMethod],
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedDeclaredConcreteMethod() {}
+
+  /*member: Class.extendedConcreteImplementedDeclaredAbstractMethod#cls:
+   classBuilder=Class,
+   inherited-implements=[Class.extendedConcreteImplementedDeclaredAbstractMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedDeclaredAbstractMethod
+  */
+  /*member: Class.extendedConcreteImplementedDeclaredAbstractMethod#int:
+   classBuilder=Class,
+   declarations=[
+    Class.extendedConcreteImplementedDeclaredAbstractMethod,
+    Interface.extendedConcreteImplementedDeclaredAbstractMethod,
+    Super.extendedConcreteImplementedDeclaredAbstractMethod],
+   declared-overrides=[
+    Interface.extendedConcreteImplementedDeclaredAbstractMethod,
+    Super.extendedConcreteImplementedDeclaredAbstractMethod],
+   isSynthesized
+  */
+  void extendedConcreteImplementedDeclaredAbstractMethod();
+
+  /*member: Class.extendedAbstractImplementedDeclaredAbstractMethod#int:
+   classBuilder=Class,
+   declarations=[
+    Class.extendedAbstractImplementedDeclaredAbstractMethod,
+    Interface.extendedAbstractImplementedDeclaredAbstractMethod,
+    Super.extendedAbstractImplementedDeclaredAbstractMethod],
+   declared-overrides=[
+    Interface.extendedAbstractImplementedDeclaredAbstractMethod,
+    Super.extendedAbstractImplementedDeclaredAbstractMethod],
+   isSynthesized
+  */
+  void extendedAbstractImplementedDeclaredAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_field.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_field.dart
new file mode 100644
index 0000000..ab7a907
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_field.dart
@@ -0,0 +1,535 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteField = 0;
+
+  /*member: Super.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractField;
+
+  /*member: Super.extendedConcreteImplementedField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteImplementedField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteImplementedField = 0;
+
+  /*member: Super.extendedAbstractImplementedField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractImplementedField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractImplementedField;
+
+  /*member: Super.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteImplementedMultipleField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteImplementedMultipleField = 0;
+
+  /*member: Super.extendedAbstractImplementedMultipleField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractImplementedMultipleField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractImplementedMultipleField;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedConcreteImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedConcreteImplementedField = 0;
+
+  /*member: Interface1.extendedAbstractImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedAbstractImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedAbstractImplementedField = 0;
+
+  /*member: Interface1.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedConcreteImplementedMultipleField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedConcreteImplementedMultipleField = 0;
+
+  /*member: Interface1.extendedAbstractImplementedMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedAbstractImplementedMultipleField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.extendedConcreteImplementedMultipleField=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int extendedConcreteImplementedMultipleField = 0;
+
+  /*member: Interface2.extendedAbstractImplementedMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.extendedAbstractImplementedMultipleField=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.extendedConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField,
+    Super.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedField=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField=,
+    Super.extendedConcreteImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField,
+    Interface2.extendedConcreteImplementedMultipleField,
+    Super.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleField=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField=,
+    Interface2.extendedConcreteImplementedMultipleField=,
+    Super.extendedConcreteImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+
+  /*member: AbstractClass.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.extendedAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField,
+    Super.extendedAbstractImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField
+  */
+  /*member: AbstractClass.extendedAbstractImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField=,
+    Super.extendedAbstractImplementedField=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField=
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField,
+    Interface2.extendedAbstractImplementedMultipleField,
+    Super.extendedAbstractImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField
+  */
+  /*member: AbstractClass.extendedAbstractImplementedMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField=,
+    Interface2.extendedAbstractImplementedMultipleField=,
+    Super.extendedAbstractImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField=
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractImplementedField,
+  AbstractClass.extendedAbstractImplementedField=,
+  AbstractClass.extendedAbstractImplementedMultipleField,
+  AbstractClass.extendedAbstractImplementedMultipleField=,
+  Super.extendedAbstractField,
+  Super.extendedAbstractField=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSub.extendedConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedField#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField,
+    Super.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedField=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField=,
+    Super.extendedConcreteImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField,
+    Interface2.extendedConcreteImplementedMultipleField,
+    Super.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleField=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField=,
+    Interface2.extendedConcreteImplementedMultipleField=,
+    Super.extendedConcreteImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+
+  /*member: ConcreteSub.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSub.extendedAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField,
+    Super.extendedAbstractImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField
+  */
+  /*member: ConcreteSub.extendedAbstractImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField=,
+    Super.extendedAbstractImplementedField=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField=
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField,
+    Interface2.extendedAbstractImplementedMultipleField,
+    Super.extendedAbstractImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField
+  */
+  /*member: ConcreteSub.extendedAbstractImplementedMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField=,
+    Interface2.extendedAbstractImplementedMultipleField=,
+    Super.extendedAbstractImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField=
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractImplementedField,
+  Interface1.extendedAbstractImplementedField=,
+  Interface1.extendedAbstractImplementedMultipleField,
+  Interface1.extendedAbstractImplementedMultipleField=,
+  Interface2.extendedAbstractImplementedMultipleField,
+  Interface2.extendedAbstractImplementedMultipleField=,
+  Super.extendedAbstractField,
+  Super.extendedAbstractField=,
+  Super.extendedAbstractImplementedField,
+  Super.extendedAbstractImplementedField=,
+  Super.extendedAbstractImplementedMultipleField,
+  Super.extendedAbstractImplementedMultipleField=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.extendedConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedField#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField,
+    Super.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedField=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField=,
+    Super.extendedConcreteImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField,
+    Interface2.extendedConcreteImplementedMultipleField,
+    Super.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleField=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField=,
+    Interface2.extendedConcreteImplementedMultipleField=,
+    Super.extendedConcreteImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+
+  /*member: ConcreteClass.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.extendedAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField,
+    Super.extendedAbstractImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField
+  */
+  /*member: ConcreteClass.extendedAbstractImplementedField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField=,
+    Super.extendedAbstractImplementedField=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField=
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedMultipleField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField,
+    Interface2.extendedAbstractImplementedMultipleField,
+    Super.extendedAbstractImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField
+  */
+  /*member: ConcreteClass.extendedAbstractImplementedMultipleField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField=,
+    Interface2.extendedAbstractImplementedMultipleField=,
+    Super.extendedAbstractImplementedMultipleField=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField=
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_final_field.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_final_field.dart
new file mode 100644
index 0000000..72bcf32
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_final_field.dart
@@ -0,0 +1,311 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final int extendedConcreteField = 0;
+
+  /*member: Super.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractField;
+
+  /*member: Super.extendedConcreteImplementedField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final int extendedConcreteImplementedField = 0;
+
+  /*member: Super.extendedAbstractImplementedField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractImplementedField;
+
+  /*member: Super.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final int extendedConcreteImplementedMultipleField = 0;
+
+  /*member: Super.extendedAbstractImplementedMultipleField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractImplementedMultipleField;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int extendedConcreteImplementedField = 0;
+
+  /*member: Interface1.extendedAbstractImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int extendedAbstractImplementedField = 0;
+
+  /*member: Interface1.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int extendedConcreteImplementedMultipleField = 0;
+
+  /*member: Interface1.extendedAbstractImplementedMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  final int extendedConcreteImplementedMultipleField = 0;
+
+  /*member: Interface2.extendedAbstractImplementedMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  final int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField,
+    Super.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField,
+    Interface2.extendedConcreteImplementedMultipleField,
+    Super.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField,
+    Interface2.extendedAbstractImplementedMultipleField,
+    Super.extendedAbstractImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField
+  */
+
+  /*member: AbstractClass.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField,
+    Super.extendedAbstractImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractImplementedField,
+  AbstractClass.extendedAbstractImplementedMultipleField,
+  Super.extendedAbstractField],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedField#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedField,
+    Super.extendedConcreteImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedField
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleField#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleField,
+    Interface2.extendedConcreteImplementedMultipleField,
+    Super.extendedConcreteImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleField
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleField,
+    Interface2.extendedAbstractImplementedMultipleField,
+    Super.extendedAbstractImplementedMultipleField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleField
+  */
+
+  /*member: ConcreteSub.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSub.extendedAbstractImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedField,
+    Super.extendedAbstractImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedField
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractImplementedField,
+  Interface1.extendedAbstractImplementedMultipleField,
+  Interface2.extendedAbstractImplementedMultipleField,
+  Super.extendedAbstractField,
+  Super.extendedAbstractImplementedField,
+  Super.extendedAbstractImplementedMultipleField],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+/*member: ConcreteClass.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: ConcreteClass.extendedConcreteImplementedField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+*/
+/*member: ConcreteClass.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+*/
+/*member: ConcreteClass.extendedConcreteImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+  Interface1.extendedConcreteImplementedField,
+  Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+*/
+/*member: ConcreteClass.extendedConcreteImplementedMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+  Interface1.extendedConcreteImplementedMultipleField,
+  Interface2.extendedConcreteImplementedMultipleField,
+  Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+*/
+/*member: ConcreteClass.extendedAbstractImplementedMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+  Interface1.extendedAbstractImplementedMultipleField,
+  Interface2.extendedAbstractImplementedMultipleField,
+  Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+*/
+/*member: ConcreteClass.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: ConcreteClass.extendedAbstractImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+  Interface1.extendedAbstractImplementedField,
+  Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_getter.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_getter.dart
new file mode 100644
index 0000000..ba561c9
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_getter.dart
@@ -0,0 +1,318 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedConcreteGetter => 0;
+
+  /*member: Super.extendedAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedAbstractGetter;
+
+  /*member: Super.extendedConcreteImplementedGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedConcreteImplementedGetter => 0;
+
+  /*member: Super.extendedAbstractImplementedGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedAbstractImplementedGetter;
+
+  /*member: Super.extendedConcreteImplementedMultipleGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedConcreteImplementedMultipleGetter => 0;
+
+  /*member: Super.extendedAbstractImplementedMultipleGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedAbstractImplementedMultipleGetter;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteImplementedGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get extendedConcreteImplementedGetter => 0;
+
+  /*member: Interface1.extendedAbstractImplementedGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get extendedAbstractImplementedGetter => 0;
+
+  /*member: Interface1.extendedConcreteImplementedMultipleGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get extendedConcreteImplementedMultipleGetter => 0;
+
+  /*member: Interface1.extendedAbstractImplementedMultipleGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get extendedAbstractImplementedMultipleGetter => 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.extendedConcreteImplementedMultipleGetter#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int get extendedConcreteImplementedMultipleGetter => 0;
+
+  /*member: Interface2.extendedAbstractImplementedMultipleGetter#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int get extendedAbstractImplementedMultipleGetter => 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedGetter#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedGetter
+  */
+  /*member: AbstractClass.extendedConcreteImplementedGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedGetter,
+    Super.extendedConcreteImplementedGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedGetter
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMultipleGetter#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleGetter
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleGetter,
+    Interface2.extendedConcreteImplementedMultipleGetter,
+    Super.extendedConcreteImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleGetter
+  */
+
+  /*member: AbstractClass.extendedAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedGetter,
+    Super.extendedAbstractImplementedGetter],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedGetter
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleGetter,
+    Interface2.extendedAbstractImplementedMultipleGetter,
+    Super.extendedAbstractImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleGetter
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractImplementedGetter,
+  AbstractClass.extendedAbstractImplementedMultipleGetter,
+  Super.extendedAbstractGetter],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedGetter#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedGetter
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedGetter,
+    Super.extendedConcreteImplementedGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedGetter
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleGetter#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleGetter
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleGetter,
+    Interface2.extendedConcreteImplementedMultipleGetter,
+    Super.extendedConcreteImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleGetter
+  */
+
+  /*member: ConcreteSub.extendedAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedGetter,
+    Super.extendedAbstractImplementedGetter],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedGetter
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleGetter,
+    Interface2.extendedAbstractImplementedMultipleGetter,
+    Super.extendedAbstractImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleGetter
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractImplementedGetter,
+  Interface1.extendedAbstractImplementedMultipleGetter,
+  Interface2.extendedAbstractImplementedMultipleGetter,
+  Super.extendedAbstractGetter,
+  Super.extendedAbstractImplementedGetter,
+  Super.extendedAbstractImplementedMultipleGetter],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedGetter#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedGetter
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedGetter,
+    Super.extendedConcreteImplementedGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedGetter
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleGetter#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleGetter
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleGetter,
+    Interface2.extendedConcreteImplementedMultipleGetter,
+    Super.extendedConcreteImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleGetter
+  */
+
+  /*member: ConcreteClass.extendedAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedGetter,
+    Super.extendedAbstractImplementedGetter],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedGetter
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedMultipleGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleGetter,
+    Interface2.extendedAbstractImplementedMultipleGetter,
+    Super.extendedAbstractImplementedMultipleGetter],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleGetter
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_method.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_method.dart
new file mode 100644
index 0000000..c0b274a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_method.dart
@@ -0,0 +1,314 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMethod() {}
+
+  /*member: Super.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMethod();
+
+  /*member: Super.extendedConcreteImplementedMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMethod() {}
+
+  /*member: Super.extendedAbstractImplementedMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMethod();
+
+  /*member: Super.extendedConcreteImplementedMultipleMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMultipleMethod() {}
+
+  /*member: Super.extendedAbstractImplementedMultipleMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMultipleMethod();
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteImplementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMethod() {}
+
+  /*member: Interface1.extendedAbstractImplementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMethod() {}
+
+  /*member: Interface1.extendedConcreteImplementedMultipleMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMultipleMethod() {}
+
+  /*member: Interface1.extendedAbstractImplementedMultipleMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMultipleMethod() {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.extendedConcreteImplementedMultipleMethod#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMultipleMethod() {}
+  /*member: Interface2.extendedAbstractImplementedMultipleMethod#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMultipleMethod() {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Super,
+  Object]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMethod#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMethod,
+    Super.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMultipleMethod#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleMethod
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleMethod,
+    Interface2.extendedConcreteImplementedMultipleMethod,
+    Super.extendedConcreteImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleMethod
+  */
+
+  /*member: AbstractClass.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMethod,
+    Super.extendedAbstractImplementedMethod],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMethod
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleMethod,
+    Interface2.extendedAbstractImplementedMultipleMethod,
+    Super.extendedAbstractImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleMethod
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractImplementedMethod,
+  AbstractClass.extendedAbstractImplementedMultipleMethod,
+  Super.extendedAbstractMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMethod#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMethod,
+    Super.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleMethod#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleMethod
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleMethod,
+    Interface2.extendedConcreteImplementedMultipleMethod,
+    Super.extendedConcreteImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleMethod
+  */
+
+  /*member: ConcreteSub.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMethod,
+    Super.extendedAbstractImplementedMethod],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMethod
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleMethod,
+    Interface2.extendedAbstractImplementedMultipleMethod,
+    Super.extendedAbstractImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleMethod
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractImplementedMethod,
+  Interface1.extendedAbstractImplementedMultipleMethod,
+  Interface2.extendedAbstractImplementedMultipleMethod,
+  Super.extendedAbstractImplementedMethod,
+  Super.extendedAbstractImplementedMultipleMethod,
+  Super.extendedAbstractMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedMethod#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMethod,
+    Super.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleMethod#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleMethod
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleMethod,
+    Interface2.extendedConcreteImplementedMultipleMethod,
+    Super.extendedConcreteImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleMethod
+  */
+
+  /*member: ConcreteClass.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMethod,
+    Super.extendedAbstractImplementedMethod],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMethod
+  */
+  /*member: ConcreteClass.extendedAbstractImplementedMultipleMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleMethod,
+    Interface2.extendedAbstractImplementedMultipleMethod,
+    Super.extendedAbstractImplementedMultipleMethod],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleMethod
+  */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_setter.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_setter.dart
new file mode 100644
index 0000000..fbfc164
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_setter.dart
@@ -0,0 +1,318 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteSetter(int value) {}
+
+  /*member: Super.extendedAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractSetter(int value);
+
+  /*member: Super.extendedConcreteImplementedSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedSetter(int value) {}
+
+  /*member: Super.extendedAbstractImplementedSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedSetter(int value);
+
+  /*member: Super.extendedConcreteImplementedMultipleSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedMultipleSetter(int value) {}
+
+  /*member: Super.extendedAbstractImplementedMultipleSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedMultipleSetter(int value);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedSetter(int value) {}
+
+  /*member: Interface1.extendedAbstractImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedSetter(int value) {}
+
+  /*member: Interface1.extendedConcreteImplementedMultipleSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedMultipleSetter(int value) {}
+
+  /*member: Interface1.extendedAbstractImplementedMultipleSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedMultipleSetter(int value) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.extendedConcreteImplementedMultipleSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedMultipleSetter(int value) {}
+
+  /*member: Interface2.extendedAbstractImplementedMultipleSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedMultipleSetter(int value) {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedSetter=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedSetter=
+  */
+  /*member: AbstractClass.extendedConcreteImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedSetter=,
+    Super.extendedConcreteImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedSetter=
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMultipleSetter=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleSetter=
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleSetter=,
+    Interface2.extendedConcreteImplementedMultipleSetter=,
+    Super.extendedConcreteImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleSetter=
+  */
+
+  /*member: AbstractClass.extendedAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedSetter=,
+    Super.extendedAbstractImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedSetter=
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleSetter=,
+    Interface2.extendedAbstractImplementedMultipleSetter=,
+    Super.extendedAbstractImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleSetter=
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractImplementedMultipleSetter=,
+  AbstractClass.extendedAbstractImplementedSetter=,
+  Super.extendedAbstractSetter=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedSetter=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedSetter=
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedSetter=,
+    Super.extendedConcreteImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedSetter=
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleSetter=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleSetter=
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleSetter=,
+    Interface2.extendedConcreteImplementedMultipleSetter=,
+    Super.extendedConcreteImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleSetter=
+  */
+
+  /*member: ConcreteSub.extendedAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedSetter=,
+    Super.extendedAbstractImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedSetter=
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleSetter=,
+    Interface2.extendedAbstractImplementedMultipleSetter=,
+    Super.extendedAbstractImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleSetter=
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractImplementedMultipleSetter=,
+  Interface1.extendedAbstractImplementedSetter=,
+  Interface2.extendedAbstractImplementedMultipleSetter=,
+  Super.extendedAbstractImplementedMultipleSetter=,
+  Super.extendedAbstractImplementedSetter=,
+  Super.extendedAbstractSetter=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedSetter=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedSetter=
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedSetter=,
+    Super.extendedConcreteImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedSetter=
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleSetter=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleSetter=
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMultipleSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMultipleSetter=,
+    Interface2.extendedConcreteImplementedMultipleSetter=,
+    Super.extendedConcreteImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMultipleSetter=
+  */
+
+  /*member: ConcreteClass.extendedAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedSetter=,
+    Super.extendedAbstractImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedSetter=
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedMultipleSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMultipleSetter=,
+    Interface2.extendedAbstractImplementedMultipleSetter=,
+    Super.extendedAbstractImplementedMultipleSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedMultipleSetter=
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_field.dart b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_field.dart
new file mode 100644
index 0000000..d9a3756
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_field.dart
@@ -0,0 +1,675 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteCovariantField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteCovariantField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  covariant int extendedConcreteCovariantField = 0;
+
+  /*member: Super.extendedAbstractCovariantField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractCovariantField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract covariant int extendedAbstractCovariantField;
+
+  /*member: Super.extendedConcreteCovariantImplementedField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteCovariantImplementedField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  covariant int extendedConcreteCovariantImplementedField = 0;
+
+  /*member: Super.extendedAbstractCovariantImplementedField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractCovariantImplementedField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract covariant int extendedAbstractCovariantImplementedField;
+
+  /*member: Super.extendedConcreteImplementedCovariantField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteImplementedCovariantField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteImplementedCovariantField = 0;
+
+  /*member: Super.extendedAbstractImplementedCovariantField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractImplementedCovariantField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractImplementedCovariantField;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteCovariantImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedConcreteCovariantImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedConcreteCovariantImplementedField = 0;
+
+  /*member: Interface1.extendedAbstractCovariantImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedAbstractCovariantImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedAbstractCovariantImplementedField = 0;
+
+  /*member: Interface1.extendedConcreteImplementedCovariantField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedConcreteImplementedCovariantField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  covariant int extendedConcreteImplementedCovariantField = 0;
+
+  /*member: Interface1.extendedAbstractImplementedCovariantField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedAbstractImplementedCovariantField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  covariant int extendedAbstractImplementedCovariantField = 0;
+
+  /*member: Interface1.implementsMultipleCovariantField1#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.implementsMultipleCovariantField1=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  covariant int implementsMultipleCovariantField1 = 0;
+
+  /*member: Interface1.implementsMultipleCovariantField2#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.implementsMultipleCovariantField2=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int implementsMultipleCovariantField2 = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementsMultipleCovariantField1#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.implementsMultipleCovariantField1=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int implementsMultipleCovariantField1 = 0;
+
+  /*member: Interface2.implementsMultipleCovariantField2#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.implementsMultipleCovariantField2=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  covariant int implementsMultipleCovariantField2 = 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteCovariantField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.extendedConcreteCovariantField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteCovariantImplementedField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteCovariantImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedField,
+    Super.extendedConcreteCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteCovariantImplementedField=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: AbstractClass.extendedConcreteCovariantImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedField=,
+    Super.extendedConcreteCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedCovariantField#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedCovariantField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedCovariantField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantField,
+    Super.extendedConcreteImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedCovariantField
+  */
+  /*member: AbstractClass.extendedConcreteImplementedCovariantField=#cls:
+   classBuilder=AbstractClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantField,
+   type=int
+  */
+  /*member: AbstractClass.extendedConcreteImplementedCovariantField=#int:
+   classBuilder=AbstractClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantField=,
+    Super.extendedConcreteImplementedCovariantField=],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantField,
+   type=int
+  */
+
+  /*member: AbstractClass.extendedAbstractCovariantField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.extendedAbstractCovariantField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractCovariantImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedField,
+    Super.extendedAbstractCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedField
+  */
+  /*member: AbstractClass.extendedAbstractCovariantImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedField=,
+    Super.extendedAbstractCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedField=
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedCovariantField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantField,
+    Super.extendedAbstractImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedCovariantField
+  */
+  /*member: AbstractClass.extendedAbstractImplementedCovariantField=#int:
+   abstractForwardingStub,
+   classBuilder=AbstractClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantField=,
+    Super.extendedAbstractImplementedCovariantField=],
+   isSynthesized,
+   type=int
+  */
+
+  /*member: AbstractClass.implementsMultipleCovariantField1#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField1,
+    Interface2.implementsMultipleCovariantField1],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField1
+  */
+  /*member: AbstractClass.implementsMultipleCovariantField1=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField1=,
+    Interface2.implementsMultipleCovariantField1=],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField1
+  */
+
+  /*member: AbstractClass.implementsMultipleCovariantField2#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField2,
+    Interface2.implementsMultipleCovariantField2],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField2
+  */
+  /*member: AbstractClass.implementsMultipleCovariantField2=#int:
+   abstractForwardingStub,
+   classBuilder=AbstractClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.implementsMultipleCovariantField2=,
+    Interface2.implementsMultipleCovariantField2=],
+   isSynthesized,
+   type=int
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractCovariantImplementedField,
+  AbstractClass.extendedAbstractCovariantImplementedField=,
+  AbstractClass.extendedAbstractImplementedCovariantField,
+  AbstractClass.extendedAbstractImplementedCovariantField=,
+  AbstractClass.implementsMultipleCovariantField1,
+  AbstractClass.implementsMultipleCovariantField1=,
+  AbstractClass.implementsMultipleCovariantField2,
+  AbstractClass.implementsMultipleCovariantField2=,
+  Super.extendedAbstractCovariantField,
+  Super.extendedAbstractCovariantField=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteCovariantField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSub.extendedConcreteCovariantField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedField#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedField,
+    Super.extendedConcreteCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedField=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedField=,
+    Super.extendedConcreteCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantField#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedCovariantField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantField,
+    Super.extendedConcreteImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedCovariantField
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantField=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantField=],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedCovariantField=
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantField=,
+    Super.extendedConcreteImplementedCovariantField=],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedCovariantField=
+  */
+
+  /*member: ConcreteSub.extendedAbstractCovariantField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSub.extendedAbstractCovariantField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractCovariantImplementedField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedField,
+    Super.extendedAbstractCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedField
+  */
+  /*member: ConcreteSub.extendedAbstractCovariantImplementedField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedField=,
+    Super.extendedAbstractCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedField=
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedCovariantField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantField,
+    Super.extendedAbstractImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedCovariantField
+  */
+  /*member: ConcreteSub.extendedAbstractImplementedCovariantField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantField=,
+    Super.extendedAbstractImplementedCovariantField=],
+   isSynthesized,
+   member=AbstractClass.extendedAbstractImplementedCovariantField=
+  */
+
+  /*member: ConcreteSub.implementsMultipleCovariantField1#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField1,
+    Interface2.implementsMultipleCovariantField1],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField1
+  */
+  /*member: ConcreteSub.implementsMultipleCovariantField1=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField1=,
+    Interface2.implementsMultipleCovariantField1=],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField1
+  */
+
+  /*member: ConcreteSub.implementsMultipleCovariantField2#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField2,
+    Interface2.implementsMultipleCovariantField2],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField2
+  */
+  /*member: ConcreteSub.implementsMultipleCovariantField2=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField2=,
+    Interface2.implementsMultipleCovariantField2=],
+   isSynthesized,
+   member=AbstractClass.implementsMultipleCovariantField2=
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractCovariantImplementedField,
+  Interface1.extendedAbstractCovariantImplementedField=,
+  Interface1.extendedAbstractImplementedCovariantField,
+  Interface1.extendedAbstractImplementedCovariantField=,
+  Interface1.implementsMultipleCovariantField1,
+  Interface1.implementsMultipleCovariantField1=,
+  Interface1.implementsMultipleCovariantField2,
+  Interface1.implementsMultipleCovariantField2=,
+  Interface2.implementsMultipleCovariantField1,
+  Interface2.implementsMultipleCovariantField1=,
+  Interface2.implementsMultipleCovariantField2,
+  Interface2.implementsMultipleCovariantField2=,
+  Super.extendedAbstractCovariantField,
+  Super.extendedAbstractCovariantField=,
+  Super.extendedAbstractCovariantImplementedField,
+  Super.extendedAbstractCovariantImplementedField=,
+  Super.extendedAbstractImplementedCovariantField,
+  Super.extendedAbstractImplementedCovariantField=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteCovariantField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.extendedConcreteCovariantField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedField#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedField,
+    Super.extendedConcreteCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedField=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedField=,
+    Super.extendedConcreteCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedField
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantField#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedCovariantField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantField,
+    Super.extendedConcreteImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedCovariantField
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantField=#cls:
+   classBuilder=ConcreteClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantField=],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantField,
+   type=int
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantField=#int:
+   classBuilder=ConcreteClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantField=,
+    Super.extendedConcreteImplementedCovariantField=],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantField,
+   type=int
+  */
+
+  /*member: ConcreteClass.extendedAbstractCovariantField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.extendedAbstractCovariantField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractCovariantImplementedField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedField,
+    Super.extendedAbstractCovariantImplementedField],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedField
+  */
+  /*member: ConcreteClass.extendedAbstractCovariantImplementedField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedField=,
+    Super.extendedAbstractCovariantImplementedField=],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedField=
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedCovariantField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantField,
+    Super.extendedAbstractImplementedCovariantField],
+   isSynthesized,
+   member=Super.extendedAbstractImplementedCovariantField
+  */
+  /*member: ConcreteClass.extendedAbstractImplementedCovariantField=#int:
+   abstractForwardingStub,
+   classBuilder=ConcreteClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantField=,
+    Super.extendedAbstractImplementedCovariantField=],
+   isSynthesized,
+   type=int
+  */
+
+  /*member: ConcreteClass.implementsMultipleCovariantField1#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField1,
+    Interface2.implementsMultipleCovariantField1],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField1
+  */
+  /*member: ConcreteClass.implementsMultipleCovariantField1=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField1=,
+    Interface2.implementsMultipleCovariantField1=],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField1
+  */
+
+  /*member: ConcreteClass.implementsMultipleCovariantField2#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantField2,
+    Interface2.implementsMultipleCovariantField2],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantField2
+  */
+  /*member: ConcreteClass.implementsMultipleCovariantField2=#int:
+   abstractForwardingStub,
+   classBuilder=ConcreteClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.implementsMultipleCovariantField2=,
+    Interface2.implementsMultipleCovariantField2=],
+   isSynthesized,
+   type=int
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_method.dart b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_method.dart
new file mode 100644
index 0000000..b2174b7
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_method.dart
@@ -0,0 +1,400 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteCovariantMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteCovariantMethod(covariant int i) {}
+
+  /*member: Super.extendedAbstractCovariantMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractCovariantMethod(covariant int i);
+
+  /*member: Super.extendedConcreteCovariantImplementedMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteCovariantImplementedMethod(covariant int i) {}
+
+  /*member: Super.extendedAbstractCovariantImplementedMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractCovariantImplementedMethod(covariant int i);
+
+  /*member: Super.extendedConcreteImplementedCovariantMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedCovariantMethod(int i) {}
+
+  /*member: Super.extendedAbstractImplementedCovariantMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedCovariantMethod(int i);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteCovariantImplementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedConcreteCovariantImplementedMethod(int i) {}
+
+  /*member: Interface1.extendedAbstractCovariantImplementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedAbstractCovariantImplementedMethod(int i) {}
+
+  /*member: Interface1.extendedConcreteImplementedCovariantMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedCovariantMethod(covariant int i) {}
+
+  /*member: Interface1.extendedAbstractImplementedCovariantMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+
+  /*member: Interface1.implementsMultipleCovariantMethod1#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  void implementsMultipleCovariantMethod1(covariant int i) {}
+  /*member: Interface1.implementsMultipleCovariantMethod2#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void implementsMultipleCovariantMethod2(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementsMultipleCovariantMethod1#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+
+  void implementsMultipleCovariantMethod1(int i) {}
+  /*member: Interface2.implementsMultipleCovariantMethod2#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void implementsMultipleCovariantMethod2(covariant int i) {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Super,
+  Object]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteCovariantMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractCovariantMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteCovariantImplementedMethod#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedMethod
+  */
+  /*member: AbstractClass.extendedConcreteCovariantImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedMethod,
+    Super.extendedConcreteCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedMethod
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedCovariantMethod#int:
+   abstractForwardingStub,
+   classBuilder=AbstractClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantMethod,
+    Super.extendedAbstractImplementedCovariantMethod],
+   isSynthesized,
+   type=void Function(int)
+  */
+  /*member: AbstractClass.extendedAbstractCovariantImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedMethod,
+    Super.extendedAbstractCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedMethod
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedCovariantMethod#cls:
+   classBuilder=AbstractClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+   type=void Function(int)
+  */
+  /*member: AbstractClass.extendedConcreteImplementedCovariantMethod#int:
+   classBuilder=AbstractClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantMethod,
+    Super.extendedConcreteImplementedCovariantMethod],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+   type=void Function(int)
+  */
+
+  /*member: AbstractClass.implementsMultipleCovariantMethod1#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantMethod1,
+    Interface2.implementsMultipleCovariantMethod1],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantMethod1
+  */
+
+  /*member: AbstractClass.implementsMultipleCovariantMethod2#int:
+   abstractForwardingStub,
+   classBuilder=AbstractClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.implementsMultipleCovariantMethod2,
+    Interface2.implementsMultipleCovariantMethod2],
+   isSynthesized,
+   type=void Function(int)
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractCovariantImplementedMethod,
+  AbstractClass.extendedAbstractImplementedCovariantMethod,
+  AbstractClass.implementsMultipleCovariantMethod1,
+  AbstractClass.implementsMultipleCovariantMethod2,
+  Super.extendedAbstractCovariantMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteCovariantMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractCovariantMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedMethod#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedMethod
+  */
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedMethod,
+    Super.extendedConcreteCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedMethod
+  */
+
+  /*member: ConcreteSub.extendedAbstractCovariantImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedMethod,
+    Super.extendedAbstractCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedMethod
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantMethod#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantMethod],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedCovariantMethod
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantMethod,
+    Super.extendedConcreteImplementedCovariantMethod],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedCovariantMethod
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedCovariantMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantMethod,
+    Super.extendedAbstractImplementedCovariantMethod],
+   isSynthesized,
+   member=AbstractClass.extendedAbstractImplementedCovariantMethod
+  */
+
+  /*member: ConcreteSub.implementsMultipleCovariantMethod1#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantMethod1,
+    Interface2.implementsMultipleCovariantMethod1],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantMethod1
+  */
+
+  /*member: ConcreteSub.implementsMultipleCovariantMethod2#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantMethod2,
+    Interface2.implementsMultipleCovariantMethod2],
+   isSynthesized,
+   member=AbstractClass.implementsMultipleCovariantMethod2
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractCovariantImplementedMethod,
+  Interface1.extendedAbstractImplementedCovariantMethod,
+  Interface1.implementsMultipleCovariantMethod1,
+  Interface1.implementsMultipleCovariantMethod2,
+  Interface2.implementsMultipleCovariantMethod1,
+  Interface2.implementsMultipleCovariantMethod2,
+  Super.extendedAbstractCovariantImplementedMethod,
+  Super.extendedAbstractCovariantMethod,
+  Super.extendedAbstractImplementedCovariantMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteCovariantMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractCovariantMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedMethod#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedMethod
+  */
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedMethod,
+    Super.extendedConcreteCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedMethod
+  */
+
+  /*member: ConcreteClass.extendedAbstractCovariantImplementedMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedMethod,
+    Super.extendedAbstractCovariantImplementedMethod],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedMethod
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantMethod#cls:
+   classBuilder=ConcreteClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantMethod],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+   type=void Function(int)
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantMethod#int:
+   classBuilder=ConcreteClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantMethod,
+    Super.extendedConcreteImplementedCovariantMethod],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+   type=void Function(int)
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedCovariantMethod#int:
+   abstractForwardingStub,
+   classBuilder=ConcreteClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantMethod,
+    Super.extendedAbstractImplementedCovariantMethod],
+   isSynthesized,
+   type=void Function(int)
+  */
+
+  /*member: ConcreteClass.implementsMultipleCovariantMethod1#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantMethod1,
+    Interface2.implementsMultipleCovariantMethod1],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantMethod1
+  */
+
+  /*member: ConcreteClass.implementsMultipleCovariantMethod2#int:
+   abstractForwardingStub,
+   classBuilder=ConcreteClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.implementsMultipleCovariantMethod2,
+    Interface2.implementsMultipleCovariantMethod2],
+   isSynthesized,
+   type=void Function(int)
+  */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_setter.dart b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_setter.dart
new file mode 100644
index 0000000..82c0ead
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_setter.dart
@@ -0,0 +1,403 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteCovariantSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteCovariantSetter(covariant int i) {}
+
+  /*member: Super.extendedAbstractCovariantSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractCovariantSetter(covariant int i);
+
+  /*member: Super.extendedConcreteCovariantImplementedSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteCovariantImplementedSetter(covariant int i) {}
+
+  /*member: Super.extendedAbstractCovariantImplementedSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractCovariantImplementedSetter(covariant int i);
+
+  /*member: Super.extendedConcreteImplementedCovariantSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedCovariantSetter(int i) {}
+
+  /*member: Super.extendedAbstractImplementedCovariantSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedCovariantSetter(int i);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.extendedConcreteCovariantImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedConcreteCovariantImplementedSetter(int i) {}
+
+  /*member: Interface1.extendedAbstractCovariantImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedAbstractCovariantImplementedSetter(int i) {}
+
+  /*member: Interface1.extendedConcreteImplementedCovariantSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedConcreteImplementedCovariantSetter(covariant int i) {}
+
+  /*member: Interface1.extendedAbstractImplementedCovariantSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+
+  /*member: Interface1.implementsMultipleCovariantSetter1=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementsMultipleCovariantSetter1(covariant int i) {}
+
+  /*member: Interface1.implementsMultipleCovariantSetter2=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementsMultipleCovariantSetter2(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementsMultipleCovariantSetter1=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set implementsMultipleCovariantSetter1(int i) {}
+
+  /*member: Interface2.implementsMultipleCovariantSetter2=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set implementsMultipleCovariantSetter2(covariant int i) {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteCovariantSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedConcreteCovariantImplementedSetter=#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedSetter=
+  */
+  /*member: AbstractClass.extendedConcreteCovariantImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedSetter=,
+    Super.extendedConcreteCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedSetter=
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedCovariantSetter=#cls:
+   classBuilder=AbstractClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+   type=int
+  */
+  /*member: AbstractClass.extendedConcreteImplementedCovariantSetter=#int:
+   classBuilder=AbstractClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantSetter=,
+    Super.extendedConcreteImplementedCovariantSetter=],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+   type=int
+  */
+
+  /*member: AbstractClass.extendedAbstractCovariantSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: AbstractClass.extendedAbstractCovariantImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedSetter=,
+    Super.extendedAbstractCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedSetter=
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedCovariantSetter=#int:
+   abstractForwardingStub,
+   classBuilder=AbstractClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantSetter=,
+    Super.extendedAbstractImplementedCovariantSetter=],
+   isSynthesized,
+   type=int
+  */
+
+  /*member: AbstractClass.implementsMultipleCovariantSetter1=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantSetter1=,
+    Interface2.implementsMultipleCovariantSetter1=],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantSetter1=
+  */
+
+  /*member: AbstractClass.implementsMultipleCovariantSetter2=#int:
+   abstractForwardingStub,
+   classBuilder=AbstractClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.implementsMultipleCovariantSetter2=,
+    Interface2.implementsMultipleCovariantSetter2=],
+   isSynthesized,
+   type=int
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractCovariantImplementedSetter=,
+  AbstractClass.extendedAbstractImplementedCovariantSetter=,
+  AbstractClass.implementsMultipleCovariantSetter1=,
+  AbstractClass.implementsMultipleCovariantSetter2=,
+  Super.extendedAbstractCovariantSetter=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object,
+  Super]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteCovariantSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedSetter=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedSetter=
+  */
+  /*member: ConcreteSub.extendedConcreteCovariantImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedSetter=,
+    Super.extendedConcreteCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedSetter=
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantSetter=#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantSetter=],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedCovariantSetter=
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedCovariantSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantSetter=,
+    Super.extendedConcreteImplementedCovariantSetter=],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedCovariantSetter=
+  */
+
+  /*member: ConcreteSub.extendedAbstractCovariantSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.extendedAbstractCovariantImplementedSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedSetter=,
+    Super.extendedAbstractCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedSetter=
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedCovariantSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantSetter=,
+    Super.extendedAbstractImplementedCovariantSetter=],
+   isSynthesized,
+   member=AbstractClass.extendedAbstractImplementedCovariantSetter=
+  */
+
+  /*member: ConcreteSub.implementsMultipleCovariantSetter1=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantSetter1=,
+    Interface2.implementsMultipleCovariantSetter1=],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantSetter1=
+  */
+
+  /*member: ConcreteSub.implementsMultipleCovariantSetter2=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantSetter2=,
+    Interface2.implementsMultipleCovariantSetter2=],
+   isSynthesized,
+   member=AbstractClass.implementsMultipleCovariantSetter2=
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Interface1.extendedAbstractCovariantImplementedSetter=,
+  Interface1.extendedAbstractImplementedCovariantSetter=,
+  Interface1.implementsMultipleCovariantSetter1=,
+  Interface1.implementsMultipleCovariantSetter2=,
+  Interface2.implementsMultipleCovariantSetter1=,
+  Interface2.implementsMultipleCovariantSetter2=,
+  Super.extendedAbstractCovariantImplementedSetter=,
+  Super.extendedAbstractCovariantSetter=,
+  Super.extendedAbstractImplementedCovariantSetter=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteCovariantSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedSetter=#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedSetter=
+  */
+  /*member: ConcreteClass.extendedConcreteCovariantImplementedSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedConcreteCovariantImplementedSetter=,
+    Super.extendedConcreteCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteCovariantImplementedSetter=
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantSetter=#cls:
+   classBuilder=ConcreteClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantSetter=],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+   type=int
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedCovariantSetter=#int:
+   classBuilder=ConcreteClass,
+   concreteForwardingStub,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedConcreteImplementedCovariantSetter=,
+    Super.extendedConcreteImplementedCovariantSetter=],
+   isSynthesized,
+   stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+   type=int
+  */
+
+  /*member: ConcreteClass.extendedAbstractCovariantSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteClass.extendedAbstractCovariantImplementedSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.extendedAbstractCovariantImplementedSetter=,
+    Super.extendedAbstractCovariantImplementedSetter=],
+   isSynthesized,
+   member=Super.extendedAbstractCovariantImplementedSetter=
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedCovariantSetter=#int:
+   abstractForwardingStub,
+   classBuilder=ConcreteClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.extendedAbstractImplementedCovariantSetter=,
+    Super.extendedAbstractImplementedCovariantSetter=],
+   isSynthesized,
+   type=int
+  */
+
+  /*member: ConcreteClass.implementsMultipleCovariantSetter1=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementsMultipleCovariantSetter1=,
+    Interface2.implementsMultipleCovariantSetter1=],
+   isSynthesized,
+   member=Interface1.implementsMultipleCovariantSetter1=
+  */
+
+  /*member: ConcreteClass.implementsMultipleCovariantSetter2=#int:
+   abstractForwardingStub,
+   classBuilder=ConcreteClass,
+   covariance=Covariance(0:Covariant),
+   declarations=[
+    Interface1.implementsMultipleCovariantSetter2=,
+    Interface2.implementsMultipleCovariantSetter2=],
+   isSynthesized,
+   type=int
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/getter_setter.dart b/pkg/front_end/test/class_hierarchy/data/getter_setter.dart
new file mode 100644
index 0000000..7823072
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/getter_setter.dart
@@ -0,0 +1,1184 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedGetterDeclaredField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedGetterDeclaredField => '';
+
+  /*member: Super.extendedGetterMixedInField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedGetterMixedInField => '';
+
+  /*member: Super.extendedGetterImplementedField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedGetterImplementedField => '';
+
+  /*member: Super.extendedGetterDeclaredSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedGetterDeclaredSetter => '';
+
+  /*member: Super.extendedGetterMixedInSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedGetterMixedInSetter => '';
+
+  /*member: Super.extendedGetterImplementedSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedGetterImplementedSetter => '';
+
+  /*member: Super.extendedFieldDeclaredSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final String extendedFieldDeclaredSetter = '';
+
+  /*member: Super.extendedFieldMixedInSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final String extendedFieldMixedInSetter = '';
+
+  /*member: Super.extendedFieldImplementedSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final String extendedFieldImplementedSetter = '';
+
+  /*member: Super.extendedSetterDeclaredField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedSetterDeclaredField(int value) {}
+
+  /*member: Super.extendedSetterMixedInField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedSetterMixedInField(int value) {}
+
+  /*member: Super.extendedSetterImplementedField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedSetterImplementedField(int value) {}
+
+  /*member: Super.extendedSetterDeclaredGetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedSetterDeclaredGetter(int value) {}
+
+  /*member: Super.extendedSetterMixedInGetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedSetterMixedInGetter(int value) {}
+
+  /*member: Super.extendedSetterImplementedGetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedSetterImplementedGetter(int value) {}
+}
+
+/*class: Mixin:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Mixin {
+  /*member: Mixin.extendedGetterMixedInField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.extendedGetterMixedInField=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int extendedGetterMixedInField = 0;
+
+  /*member: Mixin.extendedGetterMixedInSetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set extendedGetterMixedInSetter(int value) {}
+
+  /*member: Mixin.extendedFieldMixedInSetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set extendedFieldMixedInSetter(int value) {}
+
+  /*member: Mixin.extendedSetterMixedInField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  final String extendedSetterMixedInField = '';
+
+  /*member: Mixin.extendedSetterMixedInGetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  String get extendedSetterMixedInGetter => '';
+
+  /*member: Mixin.mixedInGetterDeclaredField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  String get mixedInGetterDeclaredField => '';
+
+  /*member: Mixin.mixedInGetterImplementedField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  String get mixedInGetterImplementedField => '';
+
+  /*member: Mixin.mixedInGetterDeclaredSetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  String get mixedInGetterDeclaredSetter => '';
+
+  /*member: Mixin.mixedInGetterImplementedSetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  String get mixedInGetterImplementedSetter => '';
+
+  /*member: Mixin.mixedInFieldDeclaredSetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  final String mixedInFieldDeclaredSetter = '';
+
+  /*member: Mixin.mixedInFieldImplementedSetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  final String mixedInFieldImplementedSetter = '';
+
+  /*member: Mixin.mixedInSetterDeclaredField=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set mixedInSetterDeclaredField(int value) {}
+
+  /*member: Mixin.mixedInSetterImplementedField=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set mixedInSetterImplementedField(int value) {}
+
+  /*member: Mixin.mixedInSetterDeclaredGetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set mixedInSetterDeclaredGetter(int value) {}
+
+  /*member: Mixin.mixedInSetterImplementedGetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set mixedInSetterImplementedGetter(int value) {}
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface1 {
+  /*member: Interface1.extendedGetterImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.extendedGetterImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int extendedGetterImplementedField = 0;
+
+  /*member: Interface1.extendedGetterImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedGetterImplementedSetter(int value) {}
+
+  /*member: Interface1.extendedFieldImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set extendedFieldImplementedSetter(int value) {}
+
+  /*member: Interface1.extendedSetterImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final String extendedSetterImplementedField = '';
+
+  /*member: Interface1.extendedSetterImplementedGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get extendedSetterImplementedGetter => '';
+
+  /*member: Interface1.mixedInGetterImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.mixedInGetterImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int mixedInGetterImplementedField = 0;
+
+  /*member: Interface1.mixedInGetterImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set mixedInGetterImplementedSetter(int value) {}
+
+  /*member: Interface1.mixedInFieldImplementedSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set mixedInFieldImplementedSetter(int value) {}
+
+  /*member: Interface1.mixedInSetterImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final String mixedInSetterImplementedField = '';
+
+  /*member: Interface1.mixedInSetterImplementedGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get mixedInSetterImplementedGetter => '';
+
+  /*member: Interface1.implementedGetterDeclaredField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get implementedGetterDeclaredField => '';
+
+  /*member: Interface1.implementedGetterImplementedField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get implementedGetterImplementedField => '';
+
+  /*member: Interface1.implementedGetterDeclaredSetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get implementedGetterDeclaredSetter => '';
+
+  /*member: Interface1.implementedGetterImplementedSetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get implementedGetterImplementedSetter => '';
+
+  /*member: Interface1.implementedFieldDeclaredSetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final String implementedFieldDeclaredSetter = '';
+
+  /*member: Interface1.implementedFieldImplementedSetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final String implementedFieldImplementedSetter = '';
+
+  /*member: Interface1.implementedSetterDeclaredField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementedSetterDeclaredField(int value) {}
+
+  /*member: Interface1.implementedSetterImplementedField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementedSetterImplementedField(int value) {}
+
+  /*member: Interface1.implementedSetterDeclaredGetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementedSetterDeclaredGetter(int value) {}
+
+  /*member: Interface1.implementedSetterImplementedGetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementedSetterImplementedGetter(int value) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface2 {
+  /*member: Interface2.implementedGetterImplementedField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.implementedGetterImplementedField=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int implementedGetterImplementedField = 0;
+
+  /*member: Interface2.implementedGetterImplementedSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set implementedGetterImplementedSetter(int value) {}
+
+  /*member: Interface2.implementedFieldImplementedSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set implementedFieldImplementedSetter(int value) {}
+
+  /*member: Interface2.implementedSetterImplementedField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  final String implementedSetterImplementedField = '';
+
+  /*member: Interface2.implementedSetterImplementedGetter#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  String get implementedSetterImplementedGetter => '';
+}
+
+/*class: _Class&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterMixedInField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedGetterMixedInField,
+  Super.extendedGetterMixedInField],
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInField=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInField=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedGetterMixedInField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterMixedInField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedSetterMixedInField],
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterMixedInGetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInGetter
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInGetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedSetterMixedInGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInGetter
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredField
+*/
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterDeclaredField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredField
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterImplementedField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedField
+*/
+/*member: _Class&Super&Mixin.mixedInGetterImplementedField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterImplementedField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedField
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredSetter
+*/
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterDeclaredSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredSetter
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterImplementedSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedSetter
+*/
+/*member: _Class&Super&Mixin.mixedInGetterImplementedSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterImplementedSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedSetter
+*/
+
+/*member: _Class&Super&Mixin.mixedInFieldDeclaredSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldDeclaredSetter
+*/
+/*member: _Class&Super&Mixin.mixedInFieldDeclaredSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInFieldDeclaredSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldDeclaredSetter
+*/
+
+/*member: _Class&Super&Mixin.mixedInFieldImplementedSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldImplementedSetter
+*/
+/*member: _Class&Super&Mixin.mixedInFieldImplementedSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInFieldImplementedSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldImplementedSetter
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInSetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInSetter=
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInSetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedGetterMixedInSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInSetter=
+*/
+
+/*member: _Class&Super&Mixin.extendedFieldMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _Class&Super&Mixin.extendedFieldMixedInSetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedFieldMixedInSetter=
+*/
+/*member: _Class&Super&Mixin.extendedFieldMixedInSetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedFieldMixedInSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedFieldMixedInSetter=
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterDeclaredField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterImplementedField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedFieldDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedFieldImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredField=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredField=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredField=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterDeclaredField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredField=
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterImplementedField=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedField=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterImplementedField=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterImplementedField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedField=
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredGetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredGetter=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredGetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterDeclaredGetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredGetter=
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterImplementedGetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedGetter=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterImplementedGetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterImplementedGetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedGetter=
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterDeclaredField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterImplementedField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterDeclaredGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterImplementedGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: Class:
+ interfaces=[
+  Interface1,
+  Interface2,
+  Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _Class&Super&Mixin]
+*/
+abstract class Class extends Super
+    with Mixin
+    implements Interface1, Interface2 {
+  /*member: Class.extendedGetterMixedInField#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedGetterMixedInField
+  */
+  /*member: Class.extendedGetterMixedInField#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[
+    Mixin.extendedGetterMixedInField,
+    Super.extendedGetterMixedInField],
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedGetterMixedInField
+  */
+  /*member: Class.extendedGetterMixedInField=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedGetterMixedInField=
+  */
+  /*member: Class.extendedGetterMixedInField=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.extendedGetterMixedInField=],
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedGetterMixedInField=
+  */
+
+  /*member: Class.extendedSetterMixedInField#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedSetterMixedInField
+  */
+  /*member: Class.extendedSetterMixedInField#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.extendedSetterMixedInField],
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedSetterMixedInField
+  */
+  /*member: Class.extendedSetterMixedInField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: Class.extendedSetterMixedInGetter#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedSetterMixedInGetter
+  */
+  /*member: Class.extendedSetterMixedInGetter#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.extendedSetterMixedInGetter],
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedSetterMixedInGetter
+  */
+  /*member: Class.extendedSetterMixedInGetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: Class.mixedInGetterImplementedField#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInGetterImplementedField
+  */
+  /*member: Class.mixedInGetterImplementedField#int:
+   classBuilder=Class,
+   declarations=[
+    Interface1.mixedInGetterImplementedField,
+    _Class&Super&Mixin.mixedInGetterImplementedField],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInGetterImplementedField
+  */
+  /*member: Class.mixedInGetterImplementedField=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.mixedInGetterImplementedSetter#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInGetterImplementedSetter
+  */
+  /*member: Class.mixedInGetterImplementedSetter#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInGetterImplementedSetter],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInGetterImplementedSetter
+  */
+  /*member: Class.mixedInGetterImplementedSetter=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.mixedInFieldImplementedSetter#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInFieldImplementedSetter
+  */
+  /*member: Class.mixedInFieldImplementedSetter#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInFieldImplementedSetter],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInFieldImplementedSetter
+  */
+  /*member: Class.mixedInFieldImplementedSetter=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.extendedGetterMixedInSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedGetterMixedInSetter=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedGetterMixedInSetter=
+  */
+  /*member: Class.extendedGetterMixedInSetter=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.extendedGetterMixedInSetter=],
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedGetterMixedInSetter=
+  */
+
+  /*member: Class.extendedFieldMixedInSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedFieldMixedInSetter=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedFieldMixedInSetter=
+  */
+  /*member: Class.extendedFieldMixedInSetter=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.extendedFieldMixedInSetter=],
+   isSynthesized,
+   member=_Class&Super&Mixin.extendedFieldMixedInSetter=
+  */
+
+  /*member: Class.extendedGetterImplementedField#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=Super.extendedGetterImplementedField
+  */
+  /*member: Class.extendedGetterImplementedField#int:
+   classBuilder=Class,
+   declarations=[
+    Interface1.extendedGetterImplementedField,
+    Super.extendedGetterImplementedField],
+   isSynthesized,
+   member=Super.extendedGetterImplementedField
+  */
+  /*member: Class.extendedGetterImplementedField=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.extendedGetterImplementedSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedGetterImplementedSetter=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.extendedFieldImplementedSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedFieldImplementedSetter=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.mixedInSetterImplementedField#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.mixedInSetterImplementedField=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterImplementedField=
+  */
+  /*member: Class.mixedInSetterImplementedField=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInSetterImplementedField=],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterImplementedField=
+  */
+
+  /*member: Class.mixedInSetterImplementedGetter#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.mixedInSetterImplementedGetter=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterImplementedGetter=
+  */
+  /*member: Class.mixedInSetterImplementedGetter=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInSetterImplementedGetter=],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterImplementedGetter=
+  */
+
+  /*member: Class.extendedSetterImplementedField#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedSetterImplementedField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: Class.extendedSetterImplementedGetter#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedSetterImplementedGetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: Class.implementedGetterImplementedField#int:
+   classBuilder=Class,
+   declarations=[
+    Interface1.implementedGetterImplementedField,
+    Interface2.implementedGetterImplementedField],
+   isSynthesized,
+   member=Interface1.implementedGetterImplementedField
+  */
+  /*member: Class.implementedGetterImplementedField=#int:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+
+  /*member: Class.implementedGetterImplementedSetter#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.implementedGetterImplementedSetter=#int:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+
+  /*member: Class.implementedFieldImplementedSetter#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.implementedFieldImplementedSetter=#int:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+
+  /*member: Class.implementedSetterImplementedField#int:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Class.implementedSetterImplementedField=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.implementedSetterImplementedGetter#int:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Class.implementedSetterImplementedGetter=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+
+  /*member: Class.extendedGetterDeclaredField#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedGetterDeclaredField],
+   isSourceDeclaration
+  */
+  /*member: Class.extendedGetterDeclaredField=#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedGetterDeclaredField],
+   isSourceDeclaration
+  */
+  int extendedGetterDeclaredField = 0;
+
+  /*member: Class.extendedGetterDeclaredSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedGetterDeclaredSetter=#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedGetterDeclaredSetter],
+   isSourceDeclaration
+  */
+  void set extendedGetterDeclaredSetter(int value) {}
+
+  /*member: Class.extendedFieldDeclaredSetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Class.extendedFieldDeclaredSetter=#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedFieldDeclaredSetter],
+   isSourceDeclaration
+  */
+  void set extendedFieldDeclaredSetter(int value) {}
+
+  /*member: Class.extendedSetterDeclaredField#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedSetterDeclaredField=],
+   isSourceDeclaration
+  */
+  /*member: Class.extendedSetterDeclaredField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final String extendedSetterDeclaredField = '';
+
+  /*member: Class.extendedSetterDeclaredGetter#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.extendedSetterDeclaredGetter=],
+   isSourceDeclaration
+  */
+  /*member: Class.extendedSetterDeclaredGetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  String get extendedSetterDeclaredGetter => '';
+
+  /*member: Class.mixedInGetterDeclaredField#cls:
+   classBuilder=Class,
+   declared-overrides=[_Class&Super&Mixin.mixedInGetterDeclaredField],
+   isSourceDeclaration
+  */
+  /*member: Class.mixedInGetterDeclaredField=#cls:
+   classBuilder=Class,
+   declared-overrides=[_Class&Super&Mixin.mixedInGetterDeclaredField],
+   isSourceDeclaration
+  */
+  int mixedInGetterDeclaredField = 0;
+
+  /*member: Class.mixedInGetterDeclaredSetter#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInGetterDeclaredSetter
+  */
+  /*member: Class.mixedInGetterDeclaredSetter#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInGetterDeclaredSetter],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInGetterDeclaredSetter
+  */
+  /*member: Class.mixedInGetterDeclaredSetter=#cls:
+   classBuilder=Class,
+   declared-overrides=[_Class&Super&Mixin.mixedInGetterDeclaredSetter],
+   isSourceDeclaration
+  */
+  void set mixedInGetterDeclaredSetter(int value) {}
+
+  /*member: Class.mixedInFieldDeclaredSetter#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInFieldDeclaredSetter
+  */
+  /*member: Class.mixedInFieldDeclaredSetter#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInFieldDeclaredSetter],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInFieldDeclaredSetter
+  */
+  /*member: Class.mixedInFieldDeclaredSetter=#cls:
+   classBuilder=Class,
+   declared-overrides=[_Class&Super&Mixin.mixedInFieldDeclaredSetter],
+   isSourceDeclaration
+  */
+  void set mixedInFieldDeclaredSetter(int value) {}
+
+  /*member: Class.mixedInSetterDeclaredField#cls:
+   classBuilder=Class,
+   declared-overrides=[_Class&Super&Mixin.mixedInSetterDeclaredField=],
+   isSourceDeclaration
+  */
+  /*member: Class.mixedInSetterDeclaredField=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterDeclaredField=
+  */
+  /*member: Class.mixedInSetterDeclaredField=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInSetterDeclaredField=],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterDeclaredField=
+  */
+  final String mixedInSetterDeclaredField = '';
+
+  /*member: Class.mixedInSetterDeclaredGetter#cls:
+   classBuilder=Class,
+   declared-overrides=[_Class&Super&Mixin.mixedInSetterDeclaredGetter=],
+   isSourceDeclaration
+  */
+  /*member: Class.mixedInSetterDeclaredGetter=#cls:
+   classBuilder=Class,
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterDeclaredGetter=
+  */
+  /*member: Class.mixedInSetterDeclaredGetter=#int:
+   classBuilder=_Class&Super&Mixin,
+   declarations=[Mixin.mixedInSetterDeclaredGetter=],
+   isSynthesized,
+   member=_Class&Super&Mixin.mixedInSetterDeclaredGetter=
+  */
+  String get mixedInSetterDeclaredGetter => '';
+
+  /*member: Class.implementedGetterDeclaredField#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface1.implementedGetterDeclaredField],
+   isSourceDeclaration
+  */
+  /*member: Class.implementedGetterDeclaredField=#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface1.implementedGetterDeclaredField],
+   isSourceDeclaration
+  */
+  int implementedGetterDeclaredField = 0;
+
+  /*member: Class.implementedGetterDeclaredSetter#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.implementedGetterDeclaredSetter=#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface1.implementedGetterDeclaredSetter],
+   isSourceDeclaration
+  */
+  void set implementedGetterDeclaredSetter(int value) {}
+
+  /*member: Class.implementedFieldDeclaredSetter#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Class.implementedFieldDeclaredSetter=#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface1.implementedFieldDeclaredSetter],
+   isSourceDeclaration
+  */
+  void set implementedFieldDeclaredSetter(int value) {}
+
+  /*member: Class.implementedSetterDeclaredField#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface1.implementedSetterDeclaredField=],
+   isSourceDeclaration
+  */
+  /*member: Class.implementedSetterDeclaredField=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final String implementedSetterDeclaredField = '';
+
+  /*member: Class.implementedSetterDeclaredGetter#cls:
+   classBuilder=Class,
+   declared-overrides=[Interface1.implementedSetterDeclaredGetter=],
+   isSourceDeclaration
+  */
+
+  /*member: Class.implementedSetterDeclaredGetter=#int:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  String get implementedSetterDeclaredGetter => '';
+
+  /*member: Class.declaredGetterDeclaredSetter#cls:
+   classBuilder=Class,
+   isSourceDeclaration
+  */
+  String get declaredGetterDeclaredSetter => '';
+
+  /*member: Class.declaredGetterDeclaredSetter=#cls:
+   classBuilder=Class,
+   isSourceDeclaration
+  */
+  void set declaredGetterDeclaredSetter(int value) {}
+
+  /*member: Class.declaredFieldDeclaredSetter#cls:
+   classBuilder=Class,
+   isSourceDeclaration
+  */
+  final String declaredFieldDeclaredSetter = '';
+
+  /*member: Class.declaredFieldDeclaredSetter=#cls:
+   classBuilder=Class,
+   isSourceDeclaration
+  */
+  void set declaredFieldDeclaredSetter(int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_field.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_field.dart
new file mode 100644
index 0000000..b68d55b
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_field.dart
@@ -0,0 +1,293 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.implementMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.implementMultipleField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int implementMultipleField = 0;
+
+  /*member: Interface1.declareConcreteImplementMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.declareConcreteImplementMultipleField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int declareConcreteImplementMultipleField = 0;
+
+  /*member: Interface1.declareAbstractImplementMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  /*member: Interface1.declareAbstractImplementMultipleField=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.implementMultipleField=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int implementMultipleField = 0;
+
+  /*member: Interface2.declareConcreteImplementMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.declareConcreteImplementMultipleField=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int declareConcreteImplementMultipleField = 0;
+
+  /*member: Interface2.declareAbstractImplementMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  /*member: Interface2.declareAbstractImplementMultipleField=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declareAbstractImplementMultipleField,
+  ConcreteClass.declareAbstractImplementMultipleField=,
+  Interface1.implementMultipleField,
+  Interface1.implementMultipleField=,
+  Interface2.implementMultipleField,
+  Interface2.implementMultipleField=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+  /*member: ConcreteClass.implementMultipleField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementMultipleField,
+    Interface2.implementMultipleField],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+  /*member: ConcreteClass.implementMultipleField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementMultipleField=,
+    Interface2.implementMultipleField=],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+
+  /*member: ConcreteClass.declareConcreteImplementMultipleField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleField,
+    Interface1.declareConcreteImplementMultipleField=,
+    Interface2.declareConcreteImplementMultipleField,
+    Interface2.declareConcreteImplementMultipleField=],
+   isSourceDeclaration
+  */
+  /*member: ConcreteClass.declareConcreteImplementMultipleField=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleField,
+    Interface1.declareConcreteImplementMultipleField=,
+    Interface2.declareConcreteImplementMultipleField,
+    Interface2.declareConcreteImplementMultipleField=],
+   isSourceDeclaration
+  */
+  int declareConcreteImplementMultipleField = 0;
+
+  /*member: ConcreteClass.declareAbstractImplementMultipleField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField=],
+   isSynthesized
+  */
+  /*member: ConcreteClass.declareAbstractImplementMultipleField=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declareAbstractImplementMultipleField=,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField=],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField=],
+   isSynthesized
+  */
+  abstract int declareAbstractImplementMultipleField;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+  /*member: AbstractClass.implementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleField,
+    Interface2.implementMultipleField],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+  /*member: AbstractClass.implementMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleField=,
+    Interface2.implementMultipleField=],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+
+  /*member: AbstractClass.declareConcreteImplementMultipleField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleField,
+    Interface1.declareConcreteImplementMultipleField=,
+    Interface2.declareConcreteImplementMultipleField,
+    Interface2.declareConcreteImplementMultipleField=],
+   isSourceDeclaration
+  */
+  /*member: AbstractClass.declareConcreteImplementMultipleField=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleField,
+    Interface1.declareConcreteImplementMultipleField=,
+    Interface2.declareConcreteImplementMultipleField,
+    Interface2.declareConcreteImplementMultipleField=],
+   isSourceDeclaration
+  */
+  int declareConcreteImplementMultipleField = 0;
+
+  /*member: AbstractClass.declareAbstractImplementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField=],
+   isSynthesized
+  */
+  /*member: AbstractClass.declareAbstractImplementMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleField=,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField=],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField=],
+   isSynthesized
+  */
+  abstract int declareAbstractImplementMultipleField;
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.declareAbstractImplementMultipleField,
+  AbstractClass.declareAbstractImplementMultipleField=,
+  AbstractClass.implementMultipleField,
+  AbstractClass.implementMultipleField=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.declareConcreteImplementMultipleField#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+  /*member: ConcreteSub.declareConcreteImplementMultipleField=#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.declareAbstractImplementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   isSynthesized,
+   member=AbstractClass.declareAbstractImplementMultipleField
+  */
+  /*member: ConcreteSub.declareAbstractImplementMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleField=,
+    Interface1.declareAbstractImplementMultipleField=,
+    Interface2.declareAbstractImplementMultipleField=],
+   isSynthesized,
+   member=AbstractClass.declareAbstractImplementMultipleField=
+  */
+
+  /*member: ConcreteSub.implementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleField,
+    Interface2.implementMultipleField],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+  /*member: ConcreteSub.implementMultipleField=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleField=,
+    Interface2.implementMultipleField=],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_final_field.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_final_field.dart
new file mode 100644
index 0000000..c3a5321
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_final_field.dart
@@ -0,0 +1,175 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.implementMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int implementMultipleField = 0;
+
+  /*member: Interface1.declareConcreteImplementMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int declareConcreteImplementMultipleField = 0;
+
+  /*member: Interface1.declareAbstractImplementMultipleField#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  final int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  final int implementMultipleField = 0;
+
+  /*member: Interface2.declareConcreteImplementMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  final int declareConcreteImplementMultipleField = 0;
+
+  /*member: Interface2.declareAbstractImplementMultipleField#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  final int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declareAbstractImplementMultipleField,
+  Interface1.implementMultipleField,
+  Interface2.implementMultipleField],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+  /*member: ConcreteClass.implementMultipleField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementMultipleField,
+    Interface2.implementMultipleField],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+
+  /*member: ConcreteClass.declareConcreteImplementMultipleField#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleField,
+    Interface2.declareConcreteImplementMultipleField],
+   isSourceDeclaration
+  */
+  final int declareConcreteImplementMultipleField = 0;
+
+  /*member: ConcreteClass.declareAbstractImplementMultipleField#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   isSynthesized
+  */
+  abstract final int declareAbstractImplementMultipleField;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+  /*member: AbstractClass.implementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleField,
+    Interface2.implementMultipleField],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+
+  /*member: AbstractClass.declareConcreteImplementMultipleField#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleField,
+    Interface2.declareConcreteImplementMultipleField],
+   isSourceDeclaration
+  */
+  final int declareConcreteImplementMultipleField = 0;
+
+  /*member: AbstractClass.declareAbstractImplementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   isSynthesized
+  */
+  abstract final int declareAbstractImplementMultipleField;
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.declareAbstractImplementMultipleField,
+  AbstractClass.implementMultipleField],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.declareConcreteImplementMultipleField#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.declareAbstractImplementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleField,
+    Interface1.declareAbstractImplementMultipleField,
+    Interface2.declareAbstractImplementMultipleField],
+   isSynthesized,
+   member=AbstractClass.declareAbstractImplementMultipleField
+  */
+
+  /*member: ConcreteSub.implementMultipleField#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleField,
+    Interface2.implementMultipleField],
+   isSynthesized,
+   member=Interface1.implementMultipleField
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_getter.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_getter.dart
new file mode 100644
index 0000000..2460469
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_getter.dart
@@ -0,0 +1,175 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.implementMultipleGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get implementMultipleGetter => 0;
+
+  /*member: Interface1.declareConcreteImplementMultipleGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get declareConcreteImplementMultipleGetter => 0;
+
+  /*member: Interface1.declareAbstractImplementMultipleGetter#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  int get declareAbstractImplementMultipleGetter => 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementMultipleGetter#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int get implementMultipleGetter => 0;
+
+  /*member: Interface2.declareConcreteImplementMultipleGetter#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int get declareConcreteImplementMultipleGetter => 0;
+
+  /*member: Interface2.declareAbstractImplementMultipleGetter#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  int get declareAbstractImplementMultipleGetter => 0;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declareAbstractImplementMultipleGetter,
+  Interface1.implementMultipleGetter,
+  Interface2.implementMultipleGetter],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+  /*member: ConcreteClass.implementMultipleGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementMultipleGetter,
+    Interface2.implementMultipleGetter],
+   isSynthesized,
+   member=Interface1.implementMultipleGetter
+  */
+
+  /*member: ConcreteClass.declareConcreteImplementMultipleGetter#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleGetter,
+    Interface2.declareConcreteImplementMultipleGetter],
+   isSourceDeclaration
+  */
+  int get declareConcreteImplementMultipleGetter => 0;
+
+  /*member: ConcreteClass.declareAbstractImplementMultipleGetter#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declareAbstractImplementMultipleGetter,
+    Interface1.declareAbstractImplementMultipleGetter,
+    Interface2.declareAbstractImplementMultipleGetter],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleGetter,
+    Interface2.declareAbstractImplementMultipleGetter],
+   isSynthesized
+  */
+  int get declareAbstractImplementMultipleGetter;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+  /*member: AbstractClass.implementMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleGetter,
+    Interface2.implementMultipleGetter],
+   isSynthesized,
+   member=Interface1.implementMultipleGetter
+  */
+
+  /*member: AbstractClass.declareConcreteImplementMultipleGetter#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleGetter,
+    Interface2.declareConcreteImplementMultipleGetter],
+   isSourceDeclaration
+  */
+  int get declareConcreteImplementMultipleGetter => 0;
+
+  /*member: AbstractClass.declareAbstractImplementMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleGetter,
+    Interface1.declareAbstractImplementMultipleGetter,
+    Interface2.declareAbstractImplementMultipleGetter],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleGetter,
+    Interface2.declareAbstractImplementMultipleGetter],
+   isSynthesized
+  */
+  int get declareAbstractImplementMultipleGetter;
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.declareAbstractImplementMultipleGetter,
+  AbstractClass.implementMultipleGetter],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.declareConcreteImplementMultipleGetter#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.declareAbstractImplementMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleGetter,
+    Interface1.declareAbstractImplementMultipleGetter,
+    Interface2.declareAbstractImplementMultipleGetter],
+   isSynthesized,
+   member=AbstractClass.declareAbstractImplementMultipleGetter
+  */
+
+  /*member: ConcreteSub.implementMultipleGetter#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleGetter,
+    Interface2.implementMultipleGetter],
+   isSynthesized,
+   member=Interface1.implementMultipleGetter
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_method.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_method.dart
new file mode 100644
index 0000000..99d540c
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_method.dart
@@ -0,0 +1,171 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.implementMultipleMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void implementMultipleMethod() {}
+
+  /*member: Interface1.declareConcreteImplementMultipleMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void declareConcreteImplementMultipleMethod() {}
+
+  /*member: Interface1.declareAbstractImplementMultipleMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void declareAbstractImplementMultipleMethod() {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementMultipleMethod#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void implementMultipleMethod() {}
+  /*member: Interface2.declareConcreteImplementMultipleMethod#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void declareConcreteImplementMultipleMethod() {}
+  /*member: Interface2.declareAbstractImplementMultipleMethod#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void declareAbstractImplementMultipleMethod() {}
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declareAbstractImplementMultipleMethod,
+  Interface1.implementMultipleMethod,
+  Interface2.implementMultipleMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+  /*member: ConcreteClass.implementMultipleMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementMultipleMethod,
+    Interface2.implementMultipleMethod],
+   isSynthesized,
+   member=Interface1.implementMultipleMethod
+  */
+
+  /*member: ConcreteClass.declareConcreteImplementMultipleMethod#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleMethod,
+    Interface2.declareConcreteImplementMultipleMethod],
+   isSourceDeclaration
+  */
+  void declareConcreteImplementMultipleMethod() {}
+
+  /*member: ConcreteClass.declareAbstractImplementMultipleMethod#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declareAbstractImplementMultipleMethod,
+    Interface1.declareAbstractImplementMultipleMethod,
+    Interface2.declareAbstractImplementMultipleMethod],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleMethod,
+    Interface2.declareAbstractImplementMultipleMethod],
+   isSynthesized
+  */
+  void declareAbstractImplementMultipleMethod();
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+  /*member: AbstractClass.implementMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleMethod,
+    Interface2.implementMultipleMethod],
+   isSynthesized,
+   member=Interface1.implementMultipleMethod
+  */
+
+  /*member: AbstractClass.declareConcreteImplementMultipleMethod#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleMethod,
+    Interface2.declareConcreteImplementMultipleMethod],
+   isSourceDeclaration
+  */
+  void declareConcreteImplementMultipleMethod() {}
+
+  /*member: AbstractClass.declareAbstractImplementMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleMethod,
+    Interface1.declareAbstractImplementMultipleMethod,
+    Interface2.declareAbstractImplementMultipleMethod],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleMethod,
+    Interface2.declareAbstractImplementMultipleMethod],
+   isSynthesized
+  */
+  void declareAbstractImplementMultipleMethod();
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.declareAbstractImplementMultipleMethod,
+  AbstractClass.implementMultipleMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.declareConcreteImplementMultipleMethod#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.declareAbstractImplementMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleMethod,
+    Interface1.declareAbstractImplementMultipleMethod,
+    Interface2.declareAbstractImplementMultipleMethod],
+   isSynthesized,
+   member=AbstractClass.declareAbstractImplementMultipleMethod
+  */
+
+  /*member: ConcreteSub.implementMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleMethod,
+    Interface2.implementMultipleMethod],
+   isSynthesized,
+   member=Interface1.implementMultipleMethod
+  */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_setter.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_setter.dart
new file mode 100644
index 0000000..1ddc683
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_setter.dart
@@ -0,0 +1,176 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+  /*member: Interface1.implementMultipleSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set implementMultipleSetter(int i) {}
+
+  /*member: Interface1.declareConcreteImplementMultipleSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set declareConcreteImplementMultipleSetter(int i) {}
+
+  /*member: Interface1.declareAbstractImplementMultipleSetter=#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void set declareAbstractImplementMultipleSetter(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+  /*member: Interface2.implementMultipleSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set implementMultipleSetter(int i) {}
+
+  /*member: Interface2.declareConcreteImplementMultipleSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set declareConcreteImplementMultipleSetter(int i) {}
+
+  /*member: Interface2.declareAbstractImplementMultipleSetter=#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void set declareAbstractImplementMultipleSetter(int i) {}
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  ConcreteClass.declareAbstractImplementMultipleSetter=,
+  Interface1.implementMultipleSetter=,
+  Interface2.implementMultipleSetter=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+  /*member: ConcreteClass.implementMultipleSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    Interface1.implementMultipleSetter=,
+    Interface2.implementMultipleSetter=],
+   isSynthesized,
+   member=Interface1.implementMultipleSetter=
+  */
+
+  /*member: ConcreteClass.declareConcreteImplementMultipleSetter=#cls:
+   classBuilder=ConcreteClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleSetter=,
+    Interface2.declareConcreteImplementMultipleSetter=],
+   isSourceDeclaration
+  */
+  void set declareConcreteImplementMultipleSetter(int i) {}
+
+  /*member: ConcreteClass.declareAbstractImplementMultipleSetter=#int:
+   classBuilder=ConcreteClass,
+   declarations=[
+    ConcreteClass.declareAbstractImplementMultipleSetter=,
+    Interface1.declareAbstractImplementMultipleSetter=,
+    Interface2.declareAbstractImplementMultipleSetter=],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleSetter=,
+    Interface2.declareAbstractImplementMultipleSetter=],
+   isSynthesized
+  */
+  void set declareAbstractImplementMultipleSetter(int i);
+}
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+abstract class AbstractClass implements Interface1, Interface2 {
+  /*member: AbstractClass.implementMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleSetter=,
+    Interface2.implementMultipleSetter=],
+   isSynthesized,
+   member=Interface1.implementMultipleSetter=
+  */
+
+  /*member: AbstractClass.declareConcreteImplementMultipleSetter=#cls:
+   classBuilder=AbstractClass,
+   declared-overrides=[
+    Interface1.declareConcreteImplementMultipleSetter=,
+    Interface2.declareConcreteImplementMultipleSetter=],
+   isSourceDeclaration
+  */
+  void set declareConcreteImplementMultipleSetter(int i) {}
+
+  /*member: AbstractClass.declareAbstractImplementMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleSetter=,
+    Interface1.declareAbstractImplementMultipleSetter=,
+    Interface2.declareAbstractImplementMultipleSetter=],
+   declared-overrides=[
+    Interface1.declareAbstractImplementMultipleSetter=,
+    Interface2.declareAbstractImplementMultipleSetter=],
+   isSynthesized
+  */
+  void set declareAbstractImplementMultipleSetter(int i);
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.declareAbstractImplementMultipleSetter=,
+  AbstractClass.implementMultipleSetter=],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  AbstractClass,
+  Object]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.declareConcreteImplementMultipleSetter=#cls:
+   classBuilder=AbstractClass,
+   isSourceDeclaration
+  */
+
+  /*member: ConcreteSub.declareAbstractImplementMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    AbstractClass.declareAbstractImplementMultipleSetter=,
+    Interface1.declareAbstractImplementMultipleSetter=,
+    Interface2.declareAbstractImplementMultipleSetter=],
+   isSynthesized,
+   member=AbstractClass.declareAbstractImplementMultipleSetter=
+  */
+
+  /*member: ConcreteSub.implementMultipleSetter=#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementMultipleSetter=,
+    Interface2.implementMultipleSetter=],
+   isSynthesized,
+   member=Interface1.implementMultipleSetter=
+  */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/in_out_in/in.dart b/pkg/front_end/test/class_hierarchy/data/in_out_in/in.dart
new file mode 100644
index 0000000..2c7d774
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/in_out_in/in.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.method#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int method(int i) => i;
+}
+
+/*class: SuperQ:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class SuperQ {
+  /*member: SuperQ.method#cls:
+   classBuilder=SuperQ,
+   isSourceDeclaration
+  */
+  int? method(int? i) => i;
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/in_out_in/main.dart b/pkg/front_end/test/class_hierarchy/data/in_out_in/main.dart
new file mode 100644
index 0000000..1eb489c
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/in_out_in/main.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'in.dart';
+import 'out.dart';
+
+/*class: Class:
+ interfaces=[SuperQ],
+ maxInheritancePath=3,
+ superclasses=[
+  LegacyClass,
+  Object,
+  Super]
+*/
+class Class extends LegacyClass implements SuperQ {
+  /*member: Class.method#cls:
+   classBuilder=Class,
+   inherited-implements=[Class.method],
+   isSynthesized,
+   member=Super.method
+  */
+  /*member: Class.method#int:
+   classBuilder=Class,
+   covariance=Covariance.empty(),
+   declarations=[
+    LegacyClass.method,
+    SuperQ.method],
+   isSynthesized,
+   memberSignature,
+   type=int? Function(int?)
+  */
+}
+
+/*class: ClassQ:
+ interfaces=[Super],
+ maxInheritancePath=3,
+ superclasses=[
+  LegacyClassQ,
+  Object,
+  SuperQ]
+*/
+/*member: ClassQ.method#cls:
+ classBuilder=ClassQ,
+ inherited-implements=[ClassQ.method],
+ isSynthesized,
+ member=SuperQ.method
+*/
+/*member: ClassQ.method#int:
+ classBuilder=ClassQ,
+ covariance=Covariance.empty(),
+ declarations=[
+  LegacyClassQ.method,
+  Super.method],
+ isSynthesized,
+ memberSignature,
+ type=int Function(int)
+*/
+class ClassQ extends LegacyClassQ implements Super {}
diff --git a/pkg/front_end/test/class_hierarchy/data/in_out_in/out.dart b/pkg/front_end/test/class_hierarchy/data/in_out_in/out.dart
new file mode 100644
index 0000000..ddfc71b
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/in_out_in/out.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'in.dart';
+
+/*class: LegacyClass:
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+class LegacyClass extends Super {
+  /*member: LegacyClass.method#cls:
+   classBuilder=LegacyClass,
+   isSynthesized,
+   member=Super.method
+  */
+  /*member: LegacyClass.method#int:
+   classBuilder=LegacyClass,
+   covariance=Covariance.empty(),
+   declarations=[Super.method],
+   isSynthesized,
+   memberSignature,
+   type=int* Function(int*)*
+  */
+}
+
+/*class: LegacyClassQ:
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  SuperQ]
+*/
+class LegacyClassQ extends SuperQ {
+  /*member: LegacyClassQ.method#cls:
+   classBuilder=LegacyClassQ,
+   isSynthesized,
+   member=SuperQ.method
+  */
+  /*member: LegacyClassQ.method#int:
+   classBuilder=LegacyClassQ,
+   covariance=Covariance.empty(),
+   declarations=[SuperQ.method],
+   isSynthesized,
+   memberSignature,
+   type=int* Function(int*)*
+  */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/infer_parameter_opt_out.dart b/pkg/front_end/test/class_hierarchy/data/infer_parameter_opt_out.dart
new file mode 100644
index 0000000..4c1858f
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/infer_parameter_opt_out.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+/*class: A:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class A {
+  /*member: A.method#cls:
+   classBuilder=A,
+   isSourceDeclaration
+  */
+  dynamic method(dynamic o, {dynamic named}) {}
+}
+
+/*class: B:
+ maxInheritancePath=2,
+ superclasses=[
+  A,
+  Object]
+*/
+abstract class B extends A {
+  /*member: B.method#cls:
+   classBuilder=B,
+   isSynthesized,
+   member=A.method
+  */
+  /*member: B.method#int:
+   classBuilder=B,
+   declarations=[
+    A.method,
+    B.method],
+   declared-overrides=[A.method],
+   isSynthesized
+  */
+  Object method(Object o, {Object named});
+}
+
+/*class: C1:
+ interfaces=[B],
+ maxInheritancePath=3,
+ superclasses=[
+  A,
+  Object]
+*/
+class C1 extends A implements B {
+  /*member: C1.method#cls:
+   classBuilder=C1,
+   declared-overrides=[
+    A.method,
+    B.method],
+   isSourceDeclaration
+  */
+  method(o, {named}) {}
+}
+
+/*class: C2:
+ maxInheritancePath=3,
+ superclasses=[
+  A,
+  B,
+  Object]
+*/
+class C2 extends B implements A {
+  /*member: C2.method#cls:
+   classBuilder=C2,
+   declared-overrides=[
+    A.method,
+    B.method],
+   isSourceDeclaration
+  */
+  method(o, {named}) {}
+}
+
+/*class: C3:
+ interfaces=[
+  A,
+  B],
+ maxInheritancePath=3,
+ superclasses=[Object]
+*/
+class C3 implements A, B {
+  /*member: C3.method#cls:
+   classBuilder=C3,
+   declared-overrides=[
+    A.method,
+    B.method],
+   isSourceDeclaration
+  */
+  method(o, {named}) {}
+}
+
+/*class: C4:
+ interfaces=[
+  A,
+  B],
+ maxInheritancePath=3,
+ superclasses=[Object]
+*/
+class C4 implements B, A {
+  /*member: C4.method#cls:
+   classBuilder=C4,
+   declared-overrides=[
+    A.method,
+    B.method],
+   isSourceDeclaration
+  */
+  method(o, {named}) {}
+}
+
+/*class: D:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class D {
+  /*member: D.==#int:
+   classBuilder=D,
+   declarations=[
+    D.==,
+    Object.==],
+   declared-overrides=[Object.==],
+   isSynthesized
+  */
+  bool operator ==(Object other);
+}
+
+/*class: F:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class F {}
+
+/*class: E:
+ interfaces=[
+  D,
+  F],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class E implements D, F {
+  /*member: E.==#cls:
+   classBuilder=E,
+   declared-overrides=[
+    D.==,
+    F.==,
+    Object.==],
+   isSourceDeclaration
+  */
+  bool operator ==(other) => true;
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/late.dart b/pkg/front_end/test/class_hierarchy/data/late.dart
new file mode 100644
index 0000000..5b0ff6a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/late.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+  /*member: Interface.implementedLateFieldDeclaredGetterSetter#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.implementedLateFieldDeclaredGetterSetter=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  late int implementedLateFieldDeclaredGetterSetter;
+}
+
+/*class: Class:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class Class implements Interface {
+/*member: Class.implementedLateFieldDeclaredGetterSetter#cls:
+ classBuilder=Class,
+ declared-overrides=[
+  Interface.implementedLateFieldDeclaredGetterSetter,
+  Interface.implementedLateFieldDeclaredGetterSetter=],
+ isSourceDeclaration
+*/
+  int get implementedLateFieldDeclaredGetterSetter => 0;
+
+/*member: Class.implementedLateFieldDeclaredGetterSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[
+  Interface.implementedLateFieldDeclaredGetterSetter,
+  Interface.implementedLateFieldDeclaredGetterSetter=],
+ isSourceDeclaration
+*/
+  void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/marker.options b/pkg/front_end/test/class_hierarchy/data/marker.options
new file mode 100644
index 0000000..8b2da11
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/marker.options
@@ -0,0 +1 @@
+cfe:nnbd=pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
diff --git a/pkg/front_end/test/class_hierarchy/data/member_signatures/lib.dart b/pkg/front_end/test/class_hierarchy/data/member_signatures/lib.dart
new file mode 100644
index 0000000..af6c533
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/member_signatures/lib.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+  /*member: Super.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMethod(int i) {}
+
+  /*member: Super.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMethod(int i);
+
+  /*member: Super.extendedConcreteImplementedMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMethod(int i) {}
+
+  /*member: Super.extendedAbstractImplementedMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMethod(int i);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface1 {
+  /*member: Interface1.extendedConcreteImplementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedConcreteImplementedMethod(int i) {}
+
+  /*member: Interface1.extendedAbstractImplementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void extendedAbstractImplementedMethod(int i) {}
+
+  /*member: Interface1.implementedMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void implementedMethod(int i) {}
+
+  /*member: Interface1.implementedMultipleMethod#cls:
+   classBuilder=Interface1,
+   isSourceDeclaration
+  */
+  void implementedMultipleMethod(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface2 {
+  /*member: Interface2.implementedMultipleMethod#cls:
+   classBuilder=Interface2,
+   isSourceDeclaration
+  */
+  void implementedMultipleMethod(int i) {}
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/member_signatures/main.dart b/pkg/front_end/test/class_hierarchy/data/member_signatures/main.dart
new file mode 100644
index 0000000..a7260ed
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/member_signatures/main.dart
@@ -0,0 +1,364 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'lib.dart';
+
+/*class: AbstractClass:
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Super,
+  Object]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+  /*member: AbstractClass.extendedConcreteMethod#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteMethod
+  */
+  /*member: AbstractClass.extendedConcreteMethod#int:
+   classBuilder=AbstractClass,
+   covariance=Covariance.empty(),
+   declarations=[Super.extendedConcreteMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: AbstractClass.extendedAbstractMethod#int:
+   classBuilder=AbstractClass,
+   covariance=Covariance.empty(),
+   declarations=[Super.extendedAbstractMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: AbstractClass.extendedConcreteImplementedMethod#cls:
+   classBuilder=AbstractClass,
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+  /*member: AbstractClass.extendedConcreteImplementedMethod#int:
+   classBuilder=AbstractClass,
+   covariance=Covariance.empty(),
+   declarations=[
+    Interface1.extendedConcreteImplementedMethod,
+    Super.extendedConcreteImplementedMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: AbstractClass.extendedAbstractImplementedMethod#int:
+   classBuilder=AbstractClass,
+   covariance=Covariance.empty(),
+   declarations=[
+    Interface1.extendedAbstractImplementedMethod,
+    Super.extendedAbstractImplementedMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: AbstractClass.implementedMethod#int:
+   classBuilder=AbstractClass,
+   covariance=Covariance.empty(),
+   declarations=[Interface1.implementedMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: AbstractClass.implementedMultipleMethod#int:
+   classBuilder=AbstractClass,
+   covariance=Covariance.empty(),
+   declarations=[
+    Interface1.implementedMultipleMethod,
+    Interface2.implementedMultipleMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+  AbstractClass.extendedAbstractImplementedMethod,
+  AbstractClass.extendedAbstractMethod,
+  AbstractClass.implementedMethod,
+  AbstractClass.implementedMultipleMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+  Super,
+  AbstractClass,
+  Object]
+*/
+class ConcreteSub extends AbstractClass {
+  /*member: ConcreteSub.extendedConcreteMethod#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteMethod],
+   isSynthesized,
+   member=Super.extendedConcreteMethod
+  */
+  /*member: ConcreteSub.extendedConcreteMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[Super.extendedConcreteMethod],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteMethod
+  */
+
+  /*member: ConcreteSub.extendedAbstractMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[Super.extendedAbstractMethod],
+   isSynthesized,
+   member=AbstractClass.extendedAbstractMethod
+  */
+
+  /*member: ConcreteSub.extendedConcreteImplementedMethod#cls:
+   classBuilder=ConcreteSub,
+   inherited-implements=[AbstractClass.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+  /*member: ConcreteSub.extendedConcreteImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedConcreteImplementedMethod,
+    Super.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=AbstractClass.extendedConcreteImplementedMethod
+  */
+
+  /*member: ConcreteSub.extendedAbstractImplementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.extendedAbstractImplementedMethod,
+    Super.extendedAbstractImplementedMethod],
+   isSynthesized,
+   member=AbstractClass.extendedAbstractImplementedMethod
+  */
+
+  /*member: ConcreteSub.implementedMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[Interface1.implementedMethod],
+   isSynthesized,
+   member=AbstractClass.implementedMethod
+  */
+
+  /*member: ConcreteSub.implementedMultipleMethod#int:
+   classBuilder=AbstractClass,
+   declarations=[
+    Interface1.implementedMultipleMethod,
+    Interface2.implementedMultipleMethod],
+   isSynthesized,
+   member=AbstractClass.implementedMultipleMethod
+  */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+  Super.extendedAbstractImplementedMethod,
+  Super.extendedAbstractMethod,
+  Interface1.extendedAbstractImplementedMethod,
+  Interface1.implementedMethod,
+  Interface1.implementedMultipleMethod,
+  Interface2.implementedMultipleMethod],
+ interfaces=[
+  Interface1,
+  Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+  Super,
+  Object]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+  /*member: ConcreteClass.extendedConcreteMethod#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteMethod],
+   isSynthesized,
+   member=Super.extendedConcreteMethod
+  */
+  /*member: ConcreteClass.extendedConcreteMethod#int:
+   classBuilder=ConcreteClass,
+   covariance=Covariance.empty(),
+   declarations=[Super.extendedConcreteMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: ConcreteClass.extendedAbstractMethod#int:
+   classBuilder=ConcreteClass,
+   covariance=Covariance.empty(),
+   declarations=[Super.extendedAbstractMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: ConcreteClass.extendedConcreteImplementedMethod#cls:
+   classBuilder=ConcreteClass,
+   inherited-implements=[ConcreteClass.extendedConcreteImplementedMethod],
+   isSynthesized,
+   member=Super.extendedConcreteImplementedMethod
+  */
+  /*member: ConcreteClass.extendedConcreteImplementedMethod#int:
+   classBuilder=ConcreteClass,
+   covariance=Covariance.empty(),
+   declarations=[
+    Interface1.extendedConcreteImplementedMethod,
+    Super.extendedConcreteImplementedMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: ConcreteClass.extendedAbstractImplementedMethod#int:
+   classBuilder=ConcreteClass,
+   covariance=Covariance.empty(),
+   declarations=[
+    Interface1.extendedAbstractImplementedMethod,
+    Super.extendedAbstractImplementedMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: ConcreteClass.implementedMethod#int:
+   classBuilder=ConcreteClass,
+   covariance=Covariance.empty(),
+   declarations=[Interface1.implementedMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+
+  /*member: ConcreteClass.implementedMultipleMethod#int:
+   classBuilder=ConcreteClass,
+   covariance=Covariance.empty(),
+   declarations=[
+    Interface1.implementedMultipleMethod,
+    Interface2.implementedMultipleMethod],
+   isSynthesized,
+   memberSignature,
+   type=void Function(int*)*
+  */
+}
+
+/*class: OptOutInterface:
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+/*member: OptOutInterface.extendedConcreteImplementedMethod#cls:
+ classBuilder=OptOutInterface,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+*/
+/*member: OptOutInterface.extendedConcreteImplementedMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: OptOutInterface.extendedAbstractImplementedMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: OptOutInterface.extendedConcreteMethod#cls:
+ classBuilder=OptOutInterface,
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+*/
+/*member: OptOutInterface.extendedConcreteMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedConcreteMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: OptOutInterface.extendedAbstractMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedAbstractMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+abstract class OptOutInterface extends Super {}
+
+/*class: ClassImplementsOptOut:
+ interfaces=[OptOutInterface],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super]
+*/
+/*member: ClassImplementsOptOut.extendedConcreteImplementedMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+  OptOutInterface.extendedConcreteImplementedMethod,
+  Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: ClassImplementsOptOut.extendedAbstractImplementedMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+  OptOutInterface.extendedAbstractImplementedMethod,
+  Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: ClassImplementsOptOut.extendedConcreteMethod#cls:
+ classBuilder=ClassImplementsOptOut,
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+*/
+/*member: ClassImplementsOptOut.extendedConcreteImplementedMethod#cls:
+ classBuilder=ClassImplementsOptOut,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+*/
+/*member: ClassImplementsOptOut.extendedConcreteMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+  OptOutInterface.extendedConcreteMethod,
+  Super.extendedConcreteMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: ClassImplementsOptOut.extendedAbstractMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+  OptOutInterface.extendedAbstractMethod,
+  Super.extendedAbstractMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+abstract class ClassImplementsOptOut extends Super implements OptOutInterface {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_field.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_field.dart
new file mode 100644
index 0000000..01f7b92
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_field.dart
@@ -0,0 +1,765 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractField,
+  Super.extendedAbstractField=,
+  Super.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteField = 0;
+
+  /*member: Super.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractField;
+
+  /*member: Super.extendedConcreteMixedInConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteMixedInConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteMixedInConcreteField = 0;
+
+  /*member: Super.extendedAbstractMixedInConcreteField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractMixedInConcreteField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractMixedInConcreteField;
+
+  /*member: Super.extendedConcreteMixedInAbstractField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedConcreteMixedInAbstractField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int extendedConcreteMixedInAbstractField = 0;
+
+  /*member: Super.extendedAbstractMixedInAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: Super.extendedAbstractMixedInAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractMixedInAbstractField;
+}
+
+/*class: Mixin:
+ abstractMembers=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Mixin.extendedConcreteMixedInAbstractField,
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Mixin.mixedInAbstractField,
+  Mixin.mixedInAbstractField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+  /*member: Mixin.mixedInConcreteField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.mixedInConcreteField=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int mixedInConcreteField = 0;
+
+  /*member: Mixin.mixedInAbstractField#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.mixedInAbstractField=#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  abstract int mixedInAbstractField;
+
+  /*member: Mixin.extendedConcreteMixedInConcreteField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.extendedConcreteMixedInConcreteField=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int extendedConcreteMixedInConcreteField = 0;
+
+  /*member: Mixin.extendedAbstractMixedInConcreteField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.extendedAbstractMixedInConcreteField=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int extendedAbstractMixedInConcreteField = 0;
+
+  /*member: Mixin.extendedConcreteMixedInAbstractField#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.extendedConcreteMixedInAbstractField=#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  abstract int extendedConcreteMixedInAbstractField;
+
+  /*member: Mixin.extendedAbstractMixedInAbstractField#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  /*member: Mixin.extendedAbstractMixedInAbstractField=#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  abstract int extendedAbstractMixedInAbstractField;
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/ /*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteField=,
+  Super.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteField=,
+  Super.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Super.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField=]
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Super.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Super.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.mixedInAbstractField,
+  Mixin.mixedInAbstractField=]
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.mixedInAbstractField,
+  Mixin.mixedInAbstractField=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField=]
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+  Super.extendedAbstractField,
+  Super.extendedAbstractField=,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField=,
+  _ClassMixin&Super&Mixin.mixedInAbstractField,
+  _ClassMixin&Super&Mixin.mixedInAbstractField=],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+  /*member: ClassMixin.mixedInConcreteField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteField
+  */
+  /*member: ClassMixin.mixedInConcreteField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteField
+  */
+  /*member: ClassMixin.mixedInConcreteField=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteField=
+  */
+  /*member: ClassMixin.mixedInConcreteField=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInConcreteField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteField=
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInConcreteField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInConcreteField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInConcreteField,
+    Super.extendedConcreteMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInConcreteField=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=
+  */
+  /*member: ClassMixin.extendedConcreteMixedInConcreteField=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInConcreteField=,
+    Super.extendedConcreteMixedInConcreteField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInConcreteField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+  */
+  /*member: ClassMixin.extendedAbstractMixedInConcreteField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInConcreteField,
+    Super.extendedAbstractMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+  */
+  /*member: ClassMixin.extendedAbstractMixedInConcreteField=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=
+  */
+  /*member: ClassMixin.extendedAbstractMixedInConcreteField=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInConcreteField=,
+    Super.extendedAbstractMixedInConcreteField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInAbstractField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractField,
+    Super.extendedConcreteMixedInAbstractField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractField=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractField=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractField=,
+    Super.extendedConcreteMixedInAbstractField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=
+  */
+
+  /*member: ClassMixin.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ClassMixin.extendedConcreteField=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ClassMixin.mixedInAbstractField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractField
+  */
+  /*member: ClassMixin.mixedInAbstractField=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractField=
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInAbstractField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractField,
+    Super.extendedAbstractMixedInAbstractField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField
+  */
+  /*member: ClassMixin.extendedAbstractMixedInAbstractField=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractField=,
+    Super.extendedAbstractMixedInAbstractField=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField=
+  */
+
+  /*member: ClassMixin.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  /*member: ClassMixin.extendedAbstractField=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+  NamedMixin.extendedAbstractMixedInAbstractField,
+  NamedMixin.extendedAbstractMixedInAbstractField=,
+  NamedMixin.mixedInAbstractField,
+  NamedMixin.mixedInAbstractField=,
+  Super.extendedAbstractField,
+  Super.extendedAbstractField=],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.mixedInConcreteField,
+  Mixin.mixedInConcreteField=],
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.mixedInConcreteField,
+  Mixin.mixedInConcreteField=],
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Mixin.extendedConcreteMixedInConcreteField=,
+  Super.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField=],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Mixin.extendedConcreteMixedInConcreteField=,
+  Super.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField=],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteField=,
+  Super.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Mixin.extendedAbstractMixedInConcreteField=,
+  Super.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField=],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Mixin.extendedAbstractMixedInConcreteField=,
+  Super.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField=],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteField=,
+  Super.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Super.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField=]
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField=#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Super.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Mixin.extendedConcreteMixedInAbstractField=,
+  Super.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField=]
+*/
+
+/*member: NamedMixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.mixedInAbstractField,
+  Mixin.mixedInAbstractField=]
+*/
+/*member: NamedMixin.mixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.mixedInAbstractField,
+  Mixin.mixedInAbstractField=]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField=]
+*/
+/*member: NamedMixin.extendedAbstractMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Mixin.extendedAbstractMixedInAbstractField=,
+  Super.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField=]
+*/
+
+/*member: NamedMixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_final_field.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_final_field.dart
new file mode 100644
index 0000000..b1e0208
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_final_field.dart
@@ -0,0 +1,413 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractField,
+  Super.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInConcreteField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final int extendedConcreteField = 0;
+
+  /*member: Super.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractField;
+
+  /*member: Super.extendedConcreteMixedInConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final int extendedConcreteMixedInConcreteField = 0;
+
+  /*member: Super.extendedAbstractMixedInConcreteField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractMixedInConcreteField;
+
+  /*member: Super.extendedConcreteMixedInAbstractField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  final int extendedConcreteMixedInAbstractField = 0;
+
+  /*member: Super.extendedAbstractMixedInAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractMixedInAbstractField;
+}
+
+/*class: Mixin:
+ abstractMembers=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Mixin.extendedConcreteMixedInAbstractField,
+  Mixin.mixedInAbstractField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+  /*member: Mixin.mixedInConcreteField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  final int mixedInConcreteField = 0;
+
+  /*member: Mixin.mixedInAbstractField#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  abstract final int mixedInAbstractField;
+
+  /*member: Mixin.extendedConcreteMixedInConcreteField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  final int extendedConcreteMixedInConcreteField = 0;
+
+  /*member: Mixin.extendedAbstractMixedInConcreteField#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  final int extendedAbstractMixedInConcreteField = 0;
+
+  /*member: Mixin.extendedConcreteMixedInAbstractField#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  abstract final int extendedConcreteMixedInAbstractField;
+
+  /*member: Mixin.extendedAbstractMixedInAbstractField#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  abstract final int extendedAbstractMixedInAbstractField;
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractField]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+  Super.extendedAbstractField,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField,
+  _ClassMixin&Super&Mixin.mixedInAbstractField],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+  /*member: ClassMixin.mixedInConcreteField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteField
+  */
+  /*member: ClassMixin.mixedInConcreteField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteField
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInConcreteField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInConcreteField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInConcreteField,
+    Super.extendedConcreteMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInConcreteField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+  */
+  /*member: ClassMixin.extendedAbstractMixedInConcreteField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInConcreteField,
+    Super.extendedAbstractMixedInConcreteField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInAbstractField#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractField
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractField,
+    Super.extendedConcreteMixedInAbstractField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField
+  */
+
+  /*member: ClassMixin.extendedConcreteField#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ClassMixin.mixedInAbstractField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractField
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInAbstractField#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractField,
+    Super.extendedAbstractMixedInAbstractField],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField
+  */
+
+  /*member: ClassMixin.extendedAbstractField#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+  NamedMixin.extendedAbstractMixedInAbstractField,
+  NamedMixin.mixedInAbstractField,
+  Super.extendedAbstractField],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteField],
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteField,
+  Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteField,
+  Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractField,
+  Super.extendedConcreteMixedInAbstractField]
+*/
+
+/*member: NamedMixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractField]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractField,
+  Super.extendedAbstractMixedInAbstractField]
+*/
+
+/*member: NamedMixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_getter.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_getter.dart
new file mode 100644
index 0000000..e4edc5c
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_getter.dart
@@ -0,0 +1,412 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractGetter,
+  Super.extendedAbstractMixedInAbstractGetter,
+  Super.extendedAbstractMixedInConcreteGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedConcreteGetter => 0;
+
+  /*member: Super.extendedAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedAbstractGetter;
+
+  /*member: Super.extendedConcreteMixedInConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedConcreteMixedInConcreteGetter => 0;
+
+  /*member: Super.extendedAbstractMixedInConcreteGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedAbstractMixedInConcreteGetter;
+
+  /*member: Super.extendedConcreteMixedInAbstractGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedConcreteMixedInAbstractGetter => 0;
+
+  /*member: Super.extendedAbstractMixedInAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  int get extendedAbstractMixedInAbstractGetter;
+}
+
+/*class: Mixin:
+ abstractMembers=[
+  Mixin.extendedAbstractMixedInAbstractGetter,
+  Mixin.extendedConcreteMixedInAbstractGetter,
+  Mixin.mixedInAbstractGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+  /*member: Mixin.mixedInConcreteGetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int get mixedInConcreteGetter => 0;
+
+  /*member: Mixin.mixedInAbstractGetter#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int get mixedInAbstractGetter;
+
+  /*member: Mixin.extendedConcreteMixedInConcreteGetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int get extendedConcreteMixedInConcreteGetter => 0;
+
+  /*member: Mixin.extendedAbstractMixedInConcreteGetter#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int get extendedAbstractMixedInConcreteGetter => 0;
+
+  /*member: Mixin.extendedConcreteMixedInAbstractGetter#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int get extendedConcreteMixedInAbstractGetter;
+
+  /*member: Mixin.extendedAbstractMixedInAbstractGetter#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  int get extendedAbstractMixedInAbstractGetter;
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteGetter,
+  Super.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteGetter,
+  Super.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractGetter
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractGetter,
+  Super.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractGetter,
+  Super.extendedConcreteMixedInAbstractGetter]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractGetter]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractGetter,
+  Super.extendedAbstractMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractGetter,
+  Super.extendedAbstractMixedInAbstractGetter]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+  Super.extendedAbstractGetter,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractGetter,
+  _ClassMixin&Super&Mixin.mixedInAbstractGetter],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+  /*member: ClassMixin.mixedInConcreteGetter#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteGetter
+  */
+  /*member: ClassMixin.mixedInConcreteGetter#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInConcreteGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteGetter
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInConcreteGetter#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter
+  */
+  /*member: ClassMixin.extendedConcreteMixedInConcreteGetter#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInConcreteGetter,
+    Super.extendedConcreteMixedInConcreteGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInConcreteGetter#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter
+  */
+  /*member: ClassMixin.extendedAbstractMixedInConcreteGetter#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInConcreteGetter,
+    Super.extendedAbstractMixedInConcreteGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInAbstractGetter#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractGetter
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractGetter#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractGetter,
+    Super.extendedConcreteMixedInAbstractGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter
+  */
+
+  /*member: ClassMixin.extendedConcreteGetter#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ClassMixin.mixedInAbstractGetter#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractGetter
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInAbstractGetter#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractGetter,
+    Super.extendedAbstractMixedInAbstractGetter],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractGetter
+  */
+
+  /*member: ClassMixin.extendedAbstractGetter#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+  NamedMixin.extendedAbstractMixedInAbstractGetter,
+  NamedMixin.mixedInAbstractGetter,
+  Super.extendedAbstractGetter],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteGetter#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteGetter],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteGetter],
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+/*member: NamedMixin.mixedInConcreteGetter#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+/*member: NamedMixin.mixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractGetter]
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteGetter,
+  Super.extendedConcreteMixedInConcreteGetter],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteGetter#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteGetter,
+  Super.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteGetter#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteGetter,
+  Super.extendedAbstractMixedInConcreteGetter],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteGetter#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteGetter,
+  Super.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractGetter#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractGetter
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractGetter,
+  Super.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractGetter,
+  Super.extendedConcreteMixedInAbstractGetter]
+*/
+
+/*member: NamedMixin.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractGetter,
+  Super.extendedAbstractMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractGetter,
+  Super.extendedAbstractMixedInAbstractGetter]
+*/
+
+/*member: NamedMixin.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_method.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_method.dart
new file mode 100644
index 0000000..9e80172
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_method.dart
@@ -0,0 +1,403 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMethod() {}
+
+  /*member: Super.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMethod();
+
+  /*member: Super.extendedConcreteMixedInConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInConcreteMethod() {}
+
+  /*member: Super.extendedAbstractMixedInConcreteMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInConcreteMethod();
+
+  /*member: Super.extendedConcreteMixedInAbstractMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInAbstractMethod() {}
+
+  /*member: Super.extendedAbstractMixedInAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInAbstractMethod();
+}
+
+/*class: Mixin:
+ abstractMembers=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Mixin.mixedInAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+  /*member: Mixin.mixedInConcreteMethod#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void mixedInConcreteMethod() {}
+
+  /*member: Mixin.mixedInAbstractMethod#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void mixedInAbstractMethod();
+
+  /*member: Mixin.extendedConcreteMixedInConcreteMethod#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInConcreteMethod() {}
+
+  /*member: Mixin.extendedAbstractMixedInConcreteMethod#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInConcreteMethod() {}
+
+  /*member: Mixin.extendedConcreteMixedInAbstractMethod#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInAbstractMethod();
+
+  /*member: Mixin.extendedAbstractMixedInAbstractMethod#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInAbstractMethod();
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+  Super.extendedAbstractMethod,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod,
+  _ClassMixin&Super&Mixin.mixedInAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _ClassMixin&Super&Mixin]
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: ClassMixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class ClassMixin extends Super with Mixin {
+  /*member: ClassMixin.extendedConcreteMixedInConcreteMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+  */
+
+  /*member: ClassMixin.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractMethod
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractMethod,
+    Super.extendedConcreteMixedInAbstractMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod
+  */
+
+  /*member: ClassMixin.mixedInConcreteMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+  */
+
+  /*member: ClassMixin.mixedInAbstractMethod#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractMethod
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInConcreteMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInAbstractMethod#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractMethod,
+    Super.extendedAbstractMixedInAbstractMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod
+  */
+
+  /*member: ClassMixin.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+  NamedMixin.extendedAbstractMixedInAbstractMethod,
+  NamedMixin.mixedInAbstractMethod,
+  Super.extendedAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod]
+*/
+/*member: NamedMixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod]
+*/
+/*member: NamedMixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: NamedMixin.mixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteMethod],
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: NamedMixin.mixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class NamedMixin = Super with Mixin;
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_override.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_override.dart
new file mode 100644
index 0000000..2f8edef
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_override.dart
@@ -0,0 +1,411 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMethod() {}
+
+  /*member: Super.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMethod();
+
+  /*member: Super.extendedConcreteMixedInConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInConcreteMethod() {}
+
+  /*member: Super.extendedAbstractMixedInConcreteMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInConcreteMethod();
+
+  /*member: Super.extendedConcreteMixedInAbstractMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInAbstractMethod() {}
+
+  /*member: Super.extendedAbstractMixedInAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInAbstractMethod();
+}
+
+/*class: Mixin:
+ abstractMembers=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Mixin.mixedInAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+  /*member: Mixin.mixedInConcreteMethod#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void mixedInConcreteMethod(int i) {}
+
+  /*member: Mixin.mixedInAbstractMethod#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void mixedInAbstractMethod(int i);
+
+  /*member: Mixin.extendedConcreteMixedInConcreteMethod#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInConcreteMethod(int i) {}
+
+  /*member: Mixin.extendedAbstractMixedInConcreteMethod#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInConcreteMethod(int i) {}
+
+  /*member: Mixin.extendedConcreteMixedInAbstractMethod#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedConcreteMixedInAbstractMethod(int i);
+
+  /*member: Mixin.extendedAbstractMixedInAbstractMethod#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void extendedAbstractMixedInAbstractMethod(int i);
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+  Super.extendedAbstractMethod,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod,
+  _ClassMixin&Super&Mixin.mixedInAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _ClassMixin&Super&Mixin]
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: ClassMixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class ClassMixin extends Super with Mixin {
+  /*member: ClassMixin.extendedConcreteMixedInConcreteMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractMethod
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractMethod,
+    Super.extendedConcreteMixedInAbstractMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod
+  */
+
+  /*member: ClassMixin.extendedConcreteMethod#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ClassMixin.mixedInAbstractMethod#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractMethod
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInAbstractMethod#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractMethod,
+    Super.extendedAbstractMixedInAbstractMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod
+  */
+
+  /*member: ClassMixin.extendedAbstractMethod#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#cls:
+   classBuilder=_ClassMixin&Super&Mixin,
+   concreteMixinStub,
+   isSynthesized,
+   stubTarget=Mixin.mixedInConcreteMethod
+  */
+
+  /*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#cls:
+   classBuilder=_ClassMixin&Super&Mixin,
+   concreteMixinStub,
+   isSynthesized,
+   stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+  */
+
+  /*member: ClassMixin.mixedInConcreteMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInConcreteMethod#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+  */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+  NamedMixin.extendedAbstractMixedInAbstractMethod,
+  NamedMixin.mixedInAbstractMethod,
+  Super.extendedAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractMethod,
+  Super.extendedConcreteMixedInAbstractMethod]
+*/
+
+/*member: NamedMixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractMethod,
+  Super.extendedAbstractMixedInAbstractMethod]
+*/
+
+/*member: NamedMixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteMethod],
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: NamedMixin.mixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteMethod,
+  Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteMethod,
+  Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class NamedMixin = Super with Mixin;
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_setter.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_setter.dart
new file mode 100644
index 0000000..758f3dd
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_setter.dart
@@ -0,0 +1,413 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ abstractMembers=[
+  Super.extendedAbstractMixedInAbstractSetter=,
+  Super.extendedAbstractMixedInConcreteSetter=,
+  Super.extendedAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteSetter(int i) {}
+
+  /*member: Super.extendedAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractSetter(int i);
+
+  /*member: Super.extendedConcreteMixedInConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteMixedInConcreteSetter(int i) {}
+
+  /*member: Super.extendedAbstractMixedInConcreteSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractMixedInConcreteSetter(int i);
+
+  /*member: Super.extendedConcreteMixedInAbstractSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedConcreteMixedInAbstractSetter(int i) {}
+
+  /*member: Super.extendedAbstractMixedInAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void set extendedAbstractMixedInAbstractSetter(int i);
+}
+
+/*class: Mixin:
+ abstractMembers=[
+  Mixin.extendedAbstractMixedInAbstractSetter=,
+  Mixin.extendedConcreteMixedInAbstractSetter=,
+  Mixin.mixedInAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+  /*member: Mixin.mixedInConcreteSetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set mixedInConcreteSetter(int i) {}
+
+  /*member: Mixin.mixedInAbstractSetter=#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set mixedInAbstractSetter(int i);
+
+  /*member: Mixin.extendedConcreteMixedInConcreteSetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set extendedConcreteMixedInConcreteSetter(int i) {}
+
+  /*member: Mixin.extendedAbstractMixedInConcreteSetter=#cls:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set extendedAbstractMixedInConcreteSetter(int i) {}
+
+  /*member: Mixin.extendedConcreteMixedInAbstractSetter=#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set extendedConcreteMixedInAbstractSetter(int i);
+
+  /*member: Mixin.extendedAbstractMixedInAbstractSetter=#int:
+   classBuilder=Mixin,
+   isSourceDeclaration
+  */
+  void set extendedAbstractMixedInAbstractSetter(int i);
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteSetter=,
+  Super.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteSetter=,
+  Super.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractSetter=,
+  Super.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractSetter=,
+  Super.extendedConcreteMixedInAbstractSetter=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractSetter=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractSetter=,
+  Super.extendedAbstractMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractSetter=,
+  Super.extendedAbstractMixedInAbstractSetter=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+  Super.extendedAbstractSetter=,
+  _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractSetter=,
+  _ClassMixin&Super&Mixin.mixedInAbstractSetter=],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  Super,
+  _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+  /*member: ClassMixin.mixedInConcreteSetter=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteSetter=
+  */
+  /*member: ClassMixin.mixedInConcreteSetter=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInConcreteSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInConcreteSetter=
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInConcreteSetter=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=
+  */
+  /*member: ClassMixin.extendedConcreteMixedInConcreteSetter=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInConcreteSetter=,
+    Super.extendedConcreteMixedInConcreteSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInConcreteSetter=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=
+  */
+  /*member: ClassMixin.extendedAbstractMixedInConcreteSetter=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInConcreteSetter=,
+    Super.extendedAbstractMixedInConcreteSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=
+  */
+
+  /*member: ClassMixin.extendedConcreteMixedInAbstractSetter=#cls:
+   classBuilder=ClassMixin,
+   inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=],
+   isSynthesized,
+   member=Super.extendedConcreteMixedInAbstractSetter=
+  */
+  /*member: ClassMixin.extendedConcreteMixedInAbstractSetter=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedConcreteMixedInAbstractSetter=,
+    Super.extendedConcreteMixedInAbstractSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=
+  */
+
+  /*member: ClassMixin.extendedConcreteSetter=#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+
+  /*member: ClassMixin.mixedInAbstractSetter=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[Mixin.mixedInAbstractSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.mixedInAbstractSetter=
+  */
+
+  /*member: ClassMixin.extendedAbstractMixedInAbstractSetter=#int:
+   classBuilder=_ClassMixin&Super&Mixin,
+   declarations=[
+    Mixin.extendedAbstractMixedInAbstractSetter=,
+    Super.extendedAbstractMixedInAbstractSetter=],
+   isSynthesized,
+   member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractSetter=
+  */
+
+  /*member: ClassMixin.extendedAbstractSetter=#int:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+  NamedMixin.extendedAbstractMixedInAbstractSetter=,
+  NamedMixin.mixedInAbstractSetter=,
+  Super.extendedAbstractSetter=],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteSetter=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteSetter=],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteSetter=],
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+/*member: NamedMixin.mixedInConcreteSetter=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInConcreteSetter=,
+  Super.extendedConcreteMixedInConcreteSetter=],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteSetter=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedConcreteMixedInConcreteSetter=,
+  Super.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteSetter=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInConcreteSetter=,
+  Super.extendedAbstractMixedInConcreteSetter=],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteSetter=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+  Mixin.extendedAbstractMixedInConcreteSetter=,
+  Super.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractSetter=#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractSetter=
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedConcreteMixedInAbstractSetter=,
+  Super.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedConcreteMixedInAbstractSetter=,
+  Super.extendedConcreteMixedInAbstractSetter=]
+*/
+
+/*member: NamedMixin.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractSetter=]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+  Mixin.extendedAbstractMixedInAbstractSetter=,
+  Super.extendedAbstractMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+  Mixin.extendedAbstractMixedInAbstractSetter=,
+  Super.extendedAbstractMixedInAbstractSetter=]
+*/
+
+/*member: NamedMixin.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/no_such_method.dart b/pkg/front_end/test/class_hierarchy/data/no_such_method.dart
new file mode 100644
index 0000000..c29b312
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/no_such_method.dart
@@ -0,0 +1,780 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+  /*member: Interface.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void method();
+
+  /*member: Interface.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int get getter;
+
+  /*member: Interface.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  void set setter(int value);
+
+  /*member: Interface.field#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: Interface.field=#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  int field;
+
+  /*member: Interface.finalField#cls:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  final int finalField;
+}
+
+/*class: SuperAbstract:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class SuperAbstract {
+  /*member: SuperAbstract.noSuchMethod#int:
+   classBuilder=SuperAbstract,
+   declarations=[
+    Object.noSuchMethod,
+    SuperAbstract.noSuchMethod],
+   declared-overrides=[Object.noSuchMethod],
+   isSynthesized
+  */
+  noSuchMethod(Invocation invocation);
+}
+
+/*class: FromSuperAbstract:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  SuperAbstract]
+*/
+class FromSuperAbstract extends SuperAbstract implements Interface {
+  /*member: FromSuperAbstract.noSuchMethod#int:
+   classBuilder=FromSuperAbstract,
+   declarations=[
+    Object.noSuchMethod,
+    SuperAbstract.noSuchMethod],
+   isSynthesized,
+   member=SuperAbstract.noSuchMethod
+  */
+
+  /*member: FromSuperAbstract.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromSuperAbstract.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperAbstract.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperAbstract.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperAbstract.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperAbstract.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: SuperConcrete:
+ hasNoSuchMethod,
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class SuperConcrete {
+  /*member: SuperConcrete.noSuchMethod#cls:
+   classBuilder=SuperConcrete,
+   declared-overrides=[Object.noSuchMethod],
+   isSourceDeclaration
+  */
+  @override
+  noSuchMethod(Invocation invocation) {
+    return null;
+  }
+}
+
+/*class: FromSuperConcrete:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  SuperConcrete]
+*/
+class FromSuperConcrete extends SuperConcrete implements Interface {
+  /*member: FromSuperConcrete.noSuchMethod#cls:
+   classBuilder=FromSuperConcrete,
+   inherited-implements=[FromSuperConcrete.noSuchMethod],
+   isSynthesized,
+   member=SuperConcrete.noSuchMethod
+  */
+  /*member: FromSuperConcrete.noSuchMethod#int:
+   classBuilder=FromSuperConcrete,
+   declarations=[
+    Object.noSuchMethod,
+    SuperConcrete.noSuchMethod],
+   isSynthesized,
+   member=SuperConcrete.noSuchMethod
+  */
+
+  /*member: FromSuperConcrete.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromSuperConcrete.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcrete.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcrete.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcrete.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcrete.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: FromSuperConcreteAbstract:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[
+  Interface,
+  SuperAbstract],
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  SuperConcrete]
+*/
+class FromSuperConcreteAbstract extends SuperConcrete
+    implements SuperAbstract, Interface {
+  /*member: FromSuperConcreteAbstract.noSuchMethod#cls:
+   classBuilder=FromSuperConcreteAbstract,
+   inherited-implements=[FromSuperConcreteAbstract.noSuchMethod],
+   isSynthesized,
+   member=SuperConcrete.noSuchMethod
+  */
+  /*member: FromSuperConcreteAbstract.noSuchMethod#int:
+   classBuilder=FromSuperConcreteAbstract,
+   declarations=[
+    Object.noSuchMethod,
+    SuperAbstract.noSuchMethod,
+    SuperConcrete.noSuchMethod],
+   isSynthesized,
+   member=SuperConcrete.noSuchMethod
+  */
+
+  /*member: FromSuperConcreteAbstract.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromSuperConcreteAbstract.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcreteAbstract.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcreteAbstract.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcreteAbstract.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromSuperConcreteAbstract.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: MixinAbstract:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class MixinAbstract {
+  /*member: MixinAbstract.noSuchMethod#int:
+   classBuilder=MixinAbstract,
+   declarations=[
+    MixinAbstract.noSuchMethod,
+    Object.noSuchMethod],
+   declared-overrides=[Object.noSuchMethod],
+   isSynthesized
+  */
+  noSuchMethod(Invocation invocation);
+}
+
+/*class: FromMixinAbstract:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+  MixinAbstract,
+  Object]
+*/
+class FromMixinAbstract extends MixinAbstract implements Interface {
+  /*member: FromMixinAbstract.noSuchMethod#int:
+   classBuilder=FromMixinAbstract,
+   declarations=[
+    MixinAbstract.noSuchMethod,
+    Object.noSuchMethod],
+   isSynthesized,
+   member=MixinAbstract.noSuchMethod
+  */
+
+  /*member: FromMixinAbstract.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromMixinAbstract.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinAbstract.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinAbstract.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinAbstract.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinAbstract.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: MixinConcrete:
+ hasNoSuchMethod,
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class MixinConcrete {
+  /*member: MixinConcrete.noSuchMethod#cls:
+   classBuilder=MixinConcrete,
+   declared-overrides=[Object.noSuchMethod],
+   isSourceDeclaration
+  */
+  @override
+  noSuchMethod(Invocation invocation) {
+    return null;
+  }
+}
+
+/*class: _FromMixinConcrete&Object&MixinConcrete:
+ hasNoSuchMethod,
+ interfaces=[MixinConcrete],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+/*member: _FromMixinConcrete&Object&MixinConcrete.noSuchMethod#cls:
+ classBuilder=_FromMixinConcrete&Object&MixinConcrete,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+/*member: _FromMixinConcrete&Object&MixinConcrete.noSuchMethod#int:
+ classBuilder=_FromMixinConcrete&Object&MixinConcrete,
+ concreteMixinStub,
+ declarations=[
+  MixinConcrete.noSuchMethod,
+  Object.noSuchMethod],
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+
+/*class: FromMixinConcrete:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[
+  Interface,
+  MixinConcrete],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  _FromMixinConcrete&Object&MixinConcrete]
+*/
+class FromMixinConcrete with MixinConcrete implements Interface {
+  /*member: FromMixinConcrete.noSuchMethod#cls:
+   classBuilder=FromMixinConcrete,
+   inherited-implements=[FromMixinConcrete.noSuchMethod],
+   isSynthesized,
+   member=_FromMixinConcrete&Object&MixinConcrete.noSuchMethod
+  */
+  /*member: FromMixinConcrete.noSuchMethod#int:
+   classBuilder=FromMixinConcrete,
+   declarations=[
+    Object.noSuchMethod,
+    _FromMixinConcrete&Object&MixinConcrete.noSuchMethod],
+   isSynthesized,
+   member=_FromMixinConcrete&Object&MixinConcrete.noSuchMethod
+  */
+
+  /*member: FromMixinConcrete.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromMixinConcrete.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcrete.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcrete.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcrete.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcrete.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: _FromMixinConcreteAbstract&Object&MixinConcrete:
+ hasNoSuchMethod,
+ interfaces=[MixinConcrete],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod#cls:
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod#int:
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete,
+ concreteMixinStub,
+ declarations=[
+  MixinConcrete.noSuchMethod,
+  Object.noSuchMethod],
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+
+/*class: _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract:
+ hasNoSuchMethod,
+ interfaces=[
+  MixinAbstract,
+  MixinConcrete],
+ maxInheritancePath=3,
+ superclasses=[
+  Object,
+  _FromMixinConcreteAbstract&Object&MixinConcrete]
+*/
+
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod#cls:
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract,
+ isSynthesized,
+ member=_FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod
+*/
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod#int:
+ abstractMixinStub,
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract,
+ declarations=[
+  MixinAbstract.noSuchMethod,
+  MixinAbstract.noSuchMethod,
+  _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod],
+ isSynthesized,
+ mixin-overrides=[
+  MixinAbstract.noSuchMethod,
+  _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod]
+*/
+
+/*class: FromMixinConcreteAbstract:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[
+  Interface,
+  MixinAbstract,
+  MixinConcrete],
+ maxInheritancePath=4,
+ superclasses=[
+  Object,
+  _FromMixinConcreteAbstract&Object&MixinConcrete,
+  _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract]
+*/
+class FromMixinConcreteAbstract
+    with MixinConcrete, MixinAbstract
+    implements Interface {
+  /*member: FromMixinConcreteAbstract.noSuchMethod#cls:
+   classBuilder=FromMixinConcreteAbstract,
+   inherited-implements=[FromMixinConcreteAbstract.noSuchMethod],
+   isSynthesized,
+   member=_FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod
+  */
+  /*member: FromMixinConcreteAbstract.noSuchMethod#int:
+   classBuilder=FromMixinConcreteAbstract,
+   declarations=[
+    Object.noSuchMethod,
+    _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod],
+   isSynthesized,
+   member=_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod
+  */
+
+  /*member: FromMixinConcreteAbstract.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromMixinConcreteAbstract.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcreteAbstract.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcreteAbstract.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcreteAbstract.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromMixinConcreteAbstract.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: InterfaceAbstract:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class InterfaceAbstract {
+  /*member: InterfaceAbstract.noSuchMethod#int:
+   classBuilder=InterfaceAbstract,
+   declarations=[
+    InterfaceAbstract.noSuchMethod,
+    Object.noSuchMethod],
+   declared-overrides=[Object.noSuchMethod],
+   isSynthesized
+  */
+  noSuchMethod(Invocation invocation);
+}
+
+/*class: FromInterfaceAbstract:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ interfaces=[
+  Interface,
+  InterfaceAbstract],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class FromInterfaceAbstract implements InterfaceAbstract, Interface {
+  /*member: FromInterfaceAbstract.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromInterfaceAbstract.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceAbstract.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceAbstract.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceAbstract.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceAbstract.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: InterfaceConcrete:
+ hasNoSuchMethod,
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class InterfaceConcrete {
+  /*member: InterfaceConcrete.noSuchMethod#cls:
+   classBuilder=InterfaceConcrete,
+   declared-overrides=[Object.noSuchMethod],
+   isSourceDeclaration
+  */
+  @override
+  noSuchMethod(Invocation invocation) {
+    return null;
+  }
+}
+
+/*class: FromInterfaceConcrete:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ interfaces=[
+  Interface,
+  InterfaceConcrete],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class FromInterfaceConcrete implements InterfaceConcrete, Interface {
+  /*member: FromInterfaceConcrete.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: FromInterfaceConcrete.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceConcrete.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceConcrete.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceConcrete.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: FromInterfaceConcrete.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+}
+
+/*class: DeclaredAbstract:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class DeclaredAbstract implements Interface {
+  /*member: DeclaredAbstract.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: DeclaredAbstract.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredAbstract.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredAbstract.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredAbstract.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredAbstract.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredAbstract.noSuchMethod#int:
+   classBuilder=DeclaredAbstract,
+   declarations=[
+    DeclaredAbstract.noSuchMethod,
+    Object.noSuchMethod],
+   declared-overrides=[Object.noSuchMethod],
+   isSynthesized
+  */
+  noSuchMethod(Invocation invocation);
+}
+
+/*class: DeclaredConcrete:
+ abstractMembers=[
+  Interface.field,
+  Interface.field=,
+  Interface.finalField,
+  Interface.getter,
+  Interface.method,
+  Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class DeclaredConcrete implements Interface {
+  /*member: DeclaredConcrete.field#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+  /*member: DeclaredConcrete.field=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredConcrete.finalField#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredConcrete.method#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredConcrete.getter#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredConcrete.setter=#int:
+   classBuilder=Interface,
+   isSourceDeclaration
+  */
+
+  /*member: DeclaredConcrete.noSuchMethod#cls:
+   classBuilder=DeclaredConcrete,
+   declared-overrides=[Object.noSuchMethod],
+   isSourceDeclaration
+  */
+  @override
+  noSuchMethod(Invocation invocation) {
+    return null;
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/override.dart b/pkg/front_end/test/class_hierarchy/data/override.dart
new file mode 100644
index 0000000..a3e687a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/override.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+  /*member: Super.extendedMethod1#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedMethod1(int i) {}
+
+  /*member: Super.extendedMethod2#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void extendedMethod2(num i) {}
+
+  /*member: Super.overriddenMethod1#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void overriddenMethod1(int i) {}
+
+  /*member: Super.overriddenMethod2#cls:
+   classBuilder=Super,
+   isSourceDeclaration
+  */
+  void overriddenMethod2(num n) {}
+}
+
+/*class: Class:
+ maxInheritancePath=2,
+ superclasses=[
+  Object,
+  Super]
+*/
+/*member: Class.extendedMethod1#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.extendedMethod1],
+ isSynthesized,
+ member=Super.extendedMethod1
+*/
+/*member: Class.extendedMethod2#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.extendedMethod2],
+ isSynthesized,
+ member=Super.extendedMethod2
+*/
+class Class extends Super {
+  /*member: Class.extendedMethod1#int:
+   classBuilder=Class,
+   declarations=[
+    Class.extendedMethod1,
+    Super.extendedMethod1],
+   declared-overrides=[Super.extendedMethod1],
+   isSynthesized
+  */
+  void extendedMethod1(num n);
+
+  /*member: Class.extendedMethod2#int:
+   classBuilder=Class,
+   declarations=[
+    Class.extendedMethod2,
+    Super.extendedMethod2],
+   declared-overrides=[Super.extendedMethod2],
+   isSynthesized
+  */
+  void extendedMethod2(int i);
+
+  /*member: Class.overriddenMethod1#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.overriddenMethod1],
+   isSourceDeclaration
+  */
+  void overriddenMethod1(num n) {}
+
+  /*member: Class.overriddenMethod2#cls:
+   classBuilder=Class,
+   declared-overrides=[Super.overriddenMethod2],
+   isSourceDeclaration
+  */
+  void overriddenMethod2(int n) {}
+}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 1324c7e..572493d 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -21,6 +21,7 @@
 acov
 across
 activated
+adequate
 adi
 affecting
 afterwards
@@ -377,6 +378,7 @@
 eof
 eq
 equation
+erased
 erasure
 es
 establish
@@ -464,6 +466,8 @@
 gardening
 gen
 generation
+getable
+getables
 gets
 getter1a
 getter1b
@@ -1004,6 +1008,7 @@
 rs
 runnable
 s
+sanitizing
 saw
 say
 sb
@@ -1027,6 +1032,8 @@
 server
 service
 session
+setable
+setables
 setaf
 sh
 sha1hash
@@ -1208,6 +1215,7 @@
 trees
 tricky
 trips
+trivially
 ts
 tty
 tuple
@@ -1246,7 +1254,9 @@
 unequal
 unescape
 unexact
+unexpectedly
 unfinalized
+unfold
 unfolds
 unfuture
 unfutured
@@ -1293,6 +1303,7 @@
 util
 utils
 v
+validly
 variable's
 variances
 variant
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
index c556119..d4b2ca4 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
@@ -12,6 +12,26 @@
 //   var interfaceMethod1;
 //       ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/abstract_members.dart:27:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
 //  - A.abstractMethod
 //  - A.property1=
@@ -50,6 +70,36 @@
 //   void interfaceMethod3() {}
 //        ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/abstract_members.dart:42:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:48:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
 //  - A.abstractMethod
 //  - A.property1=
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.strong.expect b/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
index 9a2d8e1..a798711 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
@@ -12,6 +12,26 @@
 //   var interfaceMethod1;
 //       ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/abstract_members.dart:27:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
 //  - A.abstractMethod
 //  - A.property1=
@@ -50,6 +70,36 @@
 //   void interfaceMethod3() {}
 //        ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/abstract_members.dart:42:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:48:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
 //  - A.abstractMethod
 //  - A.property1=
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
index 2f6b693..d789cb9 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
@@ -25,12 +25,12 @@
 // pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
 // class F extends E {}
 //       ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
 //   void foo() {}
 //        ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:21:16: Context: This is the overridden method ('foo').
-// abstract class E extends A implements I {}
-//                ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+//   void foo([a]);
+//        ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
index 0529482..90c7a87 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
@@ -25,12 +25,12 @@
 // pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
 // class F extends E {}
 //       ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
 //   void foo() {}
 //        ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:21:16: Context: This is the overridden method ('foo').
-// abstract class E extends A implements I {}
-//                ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+//   void foo([a]);
+//        ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
index 0529482..90c7a87 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
@@ -25,12 +25,12 @@
 // pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
 // class F extends E {}
 //       ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
 //   void foo() {}
 //        ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:21:16: Context: This is the overridden method ('foo').
-// abstract class E extends A implements I {}
-//                ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+//   void foo([a]);
+//        ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
index 54ce84a..c9348b9 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
@@ -7,6 +7,7 @@
     ;
   method foo() → self::A*
     ;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -15,7 +16,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
@@ -8,6 +8,7 @@
     ;
   method foo() → self::A*
     return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
@@ -8,6 +8,7 @@
     ;
   method foo() → self::A*
     return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
index 43701f7..63c6cb2 100644
--- a/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
@@ -385,141 +385,169 @@
   synthetic constructor •() → self::_Class&Super&M0*
     : super self::Super::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M0::property
 }
 abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1*
     : super self::_Class&Super&M0::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M1::property
 }
 abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2*
     : super self::_Class&Super&M0&M1::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M2::property
 }
 abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
     : super self::_Class&Super&M0&M1&M2::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M3::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
     : super self::_Class&Super&M0&M1&M2&M3::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M4::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
     : super self::_Class&Super&M0&M1&M2&M3&M4::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M5::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M6::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M7::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M8::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M9::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M10::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M11::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M12::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M13::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M14::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M15::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M16::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M17::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M18::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M19::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M20::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M21::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M22::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M23::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M24::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M25::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M26::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M27::property
 }
 class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
   synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
index eee4f5a..226f3df 100644
--- a/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
@@ -386,141 +386,169 @@
   synthetic constructor •() → self::_Class&Super&M0*
     : super self::Super::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M0::property
 }
 abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1*
     : super self::_Class&Super&M0::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M1::property
 }
 abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2*
     : super self::_Class&Super&M0&M1::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M2::property
 }
 abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
     : super self::_Class&Super&M0&M1&M2::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M3::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
     : super self::_Class&Super&M0&M1&M2&M3::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M4::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
     : super self::_Class&Super&M0&M1&M2&M3&M4::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M5::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M6::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M7::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M8::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M9::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M10::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M11::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M12::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M13::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M14::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M15::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M16::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M17::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M18::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M19::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M20::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M21::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M22::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M23::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M24::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M25::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M26::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
     ;
+  abstract mixin-stub get property() → core::int*; -> self::M27::property
 }
 class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
   synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect
index 587242a..597b9c0 100644
--- a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect
@@ -58,6 +58,20 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
+//   int get property5; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
+//   String property5;
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
+//   String get property6; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The return type of the method 'C2.property5' is 'int', which does not match the return type, 'String', of the overridden method, 'C1.property5'.
 // Change to a subtype of 'String'.
 //   int get property5; // error
@@ -66,13 +80,6 @@
 //   String property5;
 //          ^
 //
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
-//   int get property5; // error
-//           ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
-//   String property5;
-//          ^^^^^^^^^
-//
 // pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The return type of the method 'C2.property6' is 'String', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
 // Change to a subtype of 'int'.
 //   String get property6; // error
@@ -81,13 +88,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
-//   String get property6; // error
-//              ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/general/getter_vs_setter_type.dart:115:16: Error: The type 'int' of the inherited getter 'D1.property2' is not assignable to the type 'String' of the inherited setter 'D2.property2'.
 // abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect
index 1515fe4..3a83a52 100644
--- a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect
@@ -58,6 +58,20 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
+//   int get property5; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
+//   String property5;
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
+//   String get property6; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The return type of the method 'C2.property5' is 'int', which does not match the return type, 'String', of the overridden method, 'C1.property5'.
 // Change to a subtype of 'String'.
 //   int get property5; // error
@@ -66,13 +80,6 @@
 //   String property5;
 //          ^
 //
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
-//   int get property5; // error
-//           ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
-//   String property5;
-//          ^^^^^^^^^
-//
 // pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The return type of the method 'C2.property6' is 'String', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
 // Change to a subtype of 'int'.
 //   String get property6; // error
@@ -81,13 +88,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
-//   String get property6; // error
-//              ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/general/getter_vs_setter_type.dart:115:16: Error: The type 'int' of the inherited getter 'D1.property2' is not assignable to the type 'String' of the inherited setter 'D2.property2'.
 // abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/general/hierarchy.dart b/pkg/front_end/testcases/general/hierarchy.dart
new file mode 100644
index 0000000..8c4f658
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class A1 {
+  void extendedClassMember() {}
+  void extendedInterfaceMember();
+}
+
+abstract class A2 {
+  void mixedInClassMember() {}
+  void mixedInInterfaceMember();
+}
+
+abstract class A3 extends A1 with A2 {
+  void declaredClassMember() {}
+  void declaredInterfaceMember();
+}
+
+abstract class A4 = A1 with A2;
+
+abstract class A5 implements A1 {}
+
+class A6 extends A1 implements A1 {}
+
+abstract class B1 {
+  void twiceInterfaceMember() {}
+  void extendedAndImplementedMember() {}
+}
+
+abstract class B2 {
+  void twiceInterfaceMember() {}
+}
+
+abstract class B3 {
+  void extendedAndImplementedMember() {}
+}
+
+abstract class B4 extends B3 implements B1, B2 {}
+
+class B5 extends B4 {}
+
+class B6 extends B3 implements B1, B2 {}
+
+abstract class C1 {
+  void mixedInAndImplementedClassMember() {}
+  void mixedInAndImplementedInterfaceMember();
+}
+
+class C2 {
+  void mixedInAndImplementedClassMember() {}
+  void mixedInAndImplementedInterfaceMember() {}
+}
+
+abstract class C3 with C1 implements C2 {}
+
+class C4 extends C3 {}
+
+class C5 with C1 implements C2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.outline.expect b/pkg/front_end/testcases/general/hierarchy.dart.outline.expect
new file mode 100644
index 0000000..66c5f61
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.outline.expect
@@ -0,0 +1,320 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+//  - A1.extendedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+//   void extendedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    ;
+  method extendedClassMember() → void
+    ;
+  abstract method extendedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+  synthetic constructor •() → self::A2*
+    ;
+  method mixedInClassMember() → void
+    ;
+  abstract method mixedInInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 = self::A1 with self::A2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A3&A1&A2*
+    : super self::A1::•()
+    ;
+  mixin-super-stub method mixedInClassMember() → void
+    return super.{self::A2::mixedInClassMember}();
+  abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A3 extends self::_A3&A1&A2 {
+  synthetic constructor •() → self::A3*
+    ;
+  method declaredClassMember() → void
+    ;
+  abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 = self::A1 with self::A2 {
+  synthetic constructor •() → self::A4*
+    : super self::A1::•()
+    ;
+  mixin-super-stub method mixedInClassMember() → void
+    return super.{self::A2::mixedInClassMember}();
+  abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A5 extends core::Object implements self::A1 {
+  synthetic constructor •() → self::A5*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+  synthetic constructor •() → self::A6*
+    ;
+}
+abstract class B1 extends core::Object {
+  synthetic constructor •() → self::B1*
+    ;
+  method twiceInterfaceMember() → void
+    ;
+  method extendedAndImplementedMember() → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+  synthetic constructor •() → self::B2*
+    ;
+  method twiceInterfaceMember() → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+  synthetic constructor •() → self::B3*
+    ;
+  method extendedAndImplementedMember() → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B4*
+    ;
+}
+class B5 extends self::B4 {
+  synthetic constructor •() → self::B5*
+    ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B6*
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → self::C1*
+    ;
+  method mixedInAndImplementedClassMember() → void
+    ;
+  abstract method mixedInAndImplementedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    ;
+  method mixedInAndImplementedClassMember() → void
+    ;
+  method mixedInAndImplementedInterfaceMember() → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C3&Object&C1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method mixedInAndImplementedClassMember() → void
+    return super.{self::C1::mixedInAndImplementedClassMember}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C3*
+    ;
+}
+class C4 extends self::C3 {
+  synthetic constructor •() → self::C4*
+    ;
+}
+abstract class _C5&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C5&Object&C1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method mixedInAndImplementedClassMember() → void
+    return super.{self::C1::mixedInAndImplementedClassMember}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C5*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.strong.expect b/pkg/front_end/testcases/general/hierarchy.dart.strong.expect
new file mode 100644
index 0000000..3c3d062
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.strong.expect
@@ -0,0 +1,325 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+//  - A1.extendedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+//   void extendedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method extendedClassMember() → void {}
+  abstract method extendedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+  synthetic constructor •() → self::A2*
+    : super core::Object::•()
+    ;
+  method mixedInClassMember() → void {}
+  abstract method mixedInInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 = self::A1 with self::A2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A3&A1&A2*
+    : super self::A1::•()
+    ;
+  mixin-super-stub method mixedInClassMember() → void
+    return super.{self::A2::mixedInClassMember}();
+  abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A3 extends self::_A3&A1&A2 {
+  synthetic constructor •() → self::A3*
+    : super self::_A3&A1&A2::•()
+    ;
+  method declaredClassMember() → void {}
+  abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 = self::A1 with self::A2 {
+  synthetic constructor •() → self::A4*
+    : super self::A1::•()
+    ;
+  mixin-super-stub method mixedInClassMember() → void
+    return super.{self::A2::mixedInClassMember}();
+  abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A5 extends core::Object implements self::A1 {
+  synthetic constructor •() → self::A5*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+  synthetic constructor •() → self::A6*
+    : super self::A1::•()
+    ;
+}
+abstract class B1 extends core::Object {
+  synthetic constructor •() → self::B1*
+    : super core::Object::•()
+    ;
+  method twiceInterfaceMember() → void {}
+  method extendedAndImplementedMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+  synthetic constructor •() → self::B2*
+    : super core::Object::•()
+    ;
+  method twiceInterfaceMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+  synthetic constructor •() → self::B3*
+    : super core::Object::•()
+    ;
+  method extendedAndImplementedMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B4*
+    : super self::B3::•()
+    ;
+}
+class B5 extends self::B4 {
+  synthetic constructor •() → self::B5*
+    : super self::B4::•()
+    ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B6*
+    : super self::B3::•()
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  abstract method mixedInAndImplementedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  method mixedInAndImplementedInterfaceMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C3&Object&C1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method mixedInAndImplementedClassMember() → void
+    return super.{self::C1::mixedInAndImplementedClassMember}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C3*
+    : super self::_C3&Object&C1::•()
+    ;
+}
+class C4 extends self::C3 {
+  synthetic constructor •() → self::C4*
+    : super self::C3::•()
+    ;
+}
+abstract class _C5&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C5&Object&C1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method mixedInAndImplementedClassMember() → void
+    return super.{self::C1::mixedInAndImplementedClassMember}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C5*
+    : super self::_C5&Object&C1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/general/hierarchy.dart.strong.transformed.expect
new file mode 100644
index 0000000..ec7dd97
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.strong.transformed.expect
@@ -0,0 +1,341 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+//  - A1.extendedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+//   void extendedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method extendedClassMember() → void {}
+  abstract method extendedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+  synthetic constructor •() → self::A2*
+    : super core::Object::•()
+    ;
+  method mixedInClassMember() → void {}
+  abstract method mixedInInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 extends self::A1 implements self::A2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_A3&A1&A2*
+    : super self::A1::•()
+    ;
+  method mixedInClassMember() → void {}
+  abstract method mixedInInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A3 extends self::_A3&A1&A2 {
+  synthetic constructor •() → self::A3*
+    : super self::_A3&A1&A2::•()
+    ;
+  method declaredClassMember() → void {}
+  abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 extends self::A1 implements self::A2 /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::A4*
+    : super self::A1::•()
+    ;
+  method mixedInClassMember() → void {}
+  abstract method mixedInInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A5 extends core::Object implements self::A1 {
+  synthetic constructor •() → self::A5*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+  synthetic constructor •() → self::A6*
+    : super self::A1::•()
+    ;
+}
+abstract class B1 extends core::Object {
+  synthetic constructor •() → self::B1*
+    : super core::Object::•()
+    ;
+  method twiceInterfaceMember() → void {}
+  method extendedAndImplementedMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+  synthetic constructor •() → self::B2*
+    : super core::Object::•()
+    ;
+  method twiceInterfaceMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+  synthetic constructor •() → self::B3*
+    : super core::Object::•()
+    ;
+  method extendedAndImplementedMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B4*
+    : super self::B3::•()
+    ;
+}
+class B5 extends self::B4 {
+  synthetic constructor •() → self::B5*
+    : super self::B4::•()
+    ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B6*
+    : super self::B3::•()
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  abstract method mixedInAndImplementedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  method mixedInAndImplementedInterfaceMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 extends core::Object implements self::C1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C3&Object&C1*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract method mixedInAndImplementedInterfaceMember() → void;
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C3*
+    : super self::_C3&Object&C1::•()
+    ;
+}
+class C4 extends self::C3 {
+  synthetic constructor •() → self::C4*
+    : super self::C3::•()
+    ;
+}
+abstract class _C5&Object&C1 extends core::Object implements self::C1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C5&Object&C1*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract method mixedInAndImplementedInterfaceMember() → void;
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C5*
+    : super self::_C5&Object&C1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.textual_outline.expect b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline.expect
new file mode 100644
index 0000000..15a7cc5
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline.expect
@@ -0,0 +1,57 @@
+abstract class A1 {
+  void extendedClassMember() {}
+  void extendedInterfaceMember();
+}
+
+abstract class A2 {
+  void mixedInClassMember() {}
+  void mixedInInterfaceMember();
+}
+
+abstract class A3 extends A1 with A2 {
+  void declaredClassMember() {}
+  void declaredInterfaceMember();
+}
+
+abstract class A4 = A1 with A2;
+
+abstract class A5 implements A1 {}
+
+class A6 extends A1 implements A1 {}
+
+abstract class B1 {
+  void twiceInterfaceMember() {}
+  void extendedAndImplementedMember() {}
+}
+
+abstract class B2 {
+  void twiceInterfaceMember() {}
+}
+
+abstract class B3 {
+  void extendedAndImplementedMember() {}
+}
+
+abstract class B4 extends B3 implements B1, B2 {}
+
+class B5 extends B4 {}
+
+class B6 extends B3 implements B1, B2 {}
+
+abstract class C1 {
+  void mixedInAndImplementedClassMember() {}
+  void mixedInAndImplementedInterfaceMember();
+}
+
+class C2 {
+  void mixedInAndImplementedClassMember() {}
+  void mixedInAndImplementedInterfaceMember() {}
+}
+
+abstract class C3 with C1 implements C2 {}
+
+class C4 extends C3 {}
+
+class C5 with C1 implements C2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..916bcc2
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline_modelled.expect
@@ -0,0 +1,57 @@
+abstract class A1 {
+  void extendedClassMember() {}
+  void extendedInterfaceMember();
+}
+
+abstract class A2 {
+  void mixedInClassMember() {}
+  void mixedInInterfaceMember();
+}
+
+abstract class A3 extends A1 with A2 {
+  void declaredClassMember() {}
+  void declaredInterfaceMember();
+}
+
+abstract class A4 = A1 with A2;
+
+abstract class A5 implements A1 {}
+
+abstract class B1 {
+  void extendedAndImplementedMember() {}
+  void twiceInterfaceMember() {}
+}
+
+abstract class B2 {
+  void twiceInterfaceMember() {}
+}
+
+abstract class B3 {
+  void extendedAndImplementedMember() {}
+}
+
+abstract class B4 extends B3 implements B1, B2 {}
+
+abstract class C1 {
+  void mixedInAndImplementedClassMember() {}
+  void mixedInAndImplementedInterfaceMember();
+}
+
+abstract class C3 with C1 implements C2 {}
+
+class A6 extends A1 implements A1 {}
+
+class B5 extends B4 {}
+
+class B6 extends B3 implements B1, B2 {}
+
+class C2 {
+  void mixedInAndImplementedClassMember() {}
+  void mixedInAndImplementedInterfaceMember() {}
+}
+
+class C4 extends C3 {}
+
+class C5 with C1 implements C2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect
index f522e20..2bf067c 100644
--- a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect
@@ -35,6 +35,7 @@
   synthetic constructor •() → self::_Class&Base&MixinA*
     : super self::Base::•()
     ;
+  abstract mixin-stub method method(core::Object* t) → dynamic; -> self::MixinA::method
 }
 abstract class Class extends self::_Class&Base&MixinA {
   synthetic constructor •() → self::Class*
@@ -104,6 +105,7 @@
   synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin*
     : super self::YamlNode::•()
     ;
+  abstract mixin-stub operator [](core::Object* key) → dynamic; -> self::MapMixin::[]
 }
 abstract class _YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin = self::_YamlMap&YamlNode&MapMixin with self::UnmodifiableMapMixin<dynamic, dynamic> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin*
diff --git a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect
index 1f40ec1..bf294a6 100644
--- a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect
@@ -37,6 +37,7 @@
   synthetic constructor •() → self::_Class&Base&MixinA*
     : super self::Base::•()
     ;
+  abstract mixin-stub method method(core::Object* t) → dynamic; -> self::MixinA::method
 }
 abstract class Class extends self::_Class&Base&MixinA {
   synthetic constructor •() → self::Class*
@@ -110,6 +111,7 @@
   synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin*
     : super self::YamlNode::•()
     ;
+  abstract mixin-stub operator [](core::Object* key) → dynamic; -> self::MapMixin::[]
 }
 abstract class _YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin = self::_YamlMap&YamlNode&MapMixin with self::UnmodifiableMapMixin<dynamic, dynamic> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin*
diff --git a/pkg/front_end/testcases/general/issue41210a.dart b/pkg/front_end/testcases/general/issue41210a.dart
index 7f16a06..78cfc3c 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart
+++ b/pkg/front_end/testcases/general/issue41210a.dart
@@ -24,6 +24,10 @@
 
 class E with A, D {} // ok
 
+abstract class F implements Interface {}
+
+class G with A, F {} // ok
+
 main() {
   print(C().method(0));
 }
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
index 2c30295..20bf60b 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
@@ -95,16 +95,16 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
+  abstract mixin-stub method method(core::num* i) → core::String*; -> self::B::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     ;
-  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
 }
 abstract class D extends core::Object implements self::Interface, self::Interface2 {
   synthetic constructor •() → self::D*
     ;
+  abstract forwarding-stub method method(covariant core::num* i) → core::String*;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -115,7 +115,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract forwarding-stub method method(covariant core::num* i) → core::String*;
 }
 abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
@@ -139,11 +138,51 @@
     : super self::_E&Object&A::•()
     ;
   forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*
-    return super.{self::A::method}(i, s: s);
+    return super.{self::_E&Object&A::method}(i, s: s);
 }
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
     ;
 }
+abstract class F extends core::Object implements self::Interface {
+  synthetic constructor •() → self::F*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    ;
+}
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
index e33f9ba..2766232 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
@@ -98,18 +98,18 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
+  abstract mixin-stub method method(core::num* i) → core::String*; -> self::B::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
 }
 abstract class D extends core::Object implements self::Interface, self::Interface2 {
   synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
+  abstract forwarding-stub method method(covariant core::num* i) → core::String*;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -120,7 +120,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract forwarding-stub method method(covariant core::num* i) → core::String*;
 }
 abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
@@ -144,15 +143,57 @@
     : super self::_E&Object&A::•()
     ;
   forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
-    return super.{self::A::method}(i, s: s);
+    return super.{self::_E&Object&A::method}(i, s: s);
 }
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
     : super self::_E&Object&A&D::•()
     ;
 }
+abstract class F extends core::Object implements self::Interface {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
 static method main() → dynamic {
-  core::print(new self::C::•().{self::C::method}(0));
+  core::print(new self::C::•().{self::_C&Object&A&B::method}(0));
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect
index 8fc1032..599fc0f 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect
@@ -20,4 +20,8 @@
 
 class E with A, D {}
 
+abstract class F implements Interface {}
+
+class G with A, F {}
+
 main() {}
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect
index 6ec25da..d6c9646 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect
@@ -4,6 +4,8 @@
 
 abstract class D implements Interface, Interface2 {}
 
+abstract class F implements Interface {}
+
 abstract class Interface {
   String method(num i);
 }
@@ -16,6 +18,8 @@
 
 class E with A, D {}
 
+class G with A, F {}
+
 main() {}
 mixin A implements Interface {
   String method(num i, {String s = "hello"}) => s;
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart b/pkg/front_end/testcases/general/issue41210b/issue41210.dart
index 01f7b3b..08bd4e4 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart
@@ -8,6 +8,8 @@
 
 class E with A, D {} // ok
 
+class G with A, F {} // ok
+
 main() {
   print(C().method(0));
 }
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
index 8ea72fc..525ba41 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
@@ -24,22 +24,51 @@
     ;
   mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
     return super.{iss::A::method}(i, s: s);
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
 }
 abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
+  abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::B::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     ;
-  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
 }
 abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
     : super core::Object::•()
     ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
   mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
     return super.{iss::A::method}(i, s: s);
 }
@@ -47,12 +76,58 @@
   const synthetic constructor •() → self::_E&Object&A&D*
     : super self::_E&Object&A::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::D::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::D::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::D::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::D::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::D::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::D::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::D::runtimeType
+  forwarding-stub method method(covariant core::num* i) → core::String*
+    return super.{self::_E&Object&A::method}(i);
 }
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
     ;
-  abstract member-signature method method(covariant core::num* i, {core::String* s}) → core::String*; -> self::_E&Object&A&D::method
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::F::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::F::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::F::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::F::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::F::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::F::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::F::runtimeType
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    ;
 }
 static method main() → dynamic
   ;
@@ -135,6 +210,20 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract forwarding-stub method method(covariant core::num* i) → core::String*;
 }
+abstract class F extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::F*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
 
 constants  {
   #C1 = "hello"
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
index 91814ab..eb41372 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
@@ -24,23 +24,52 @@
     ;
   mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(i, s: s);
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
 }
 abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
+  abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::B::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
 }
 abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
     : super core::Object::•()
     ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
   mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(i, s: s);
 }
@@ -48,16 +77,63 @@
   const synthetic constructor •() → self::_E&Object&A&D*
     : super self::_E&Object&A::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::D::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::D::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::D::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::D::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::D::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::D::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::D::runtimeType
+  forwarding-stub method method(covariant core::num* i) → core::String*
+    return super.{self::_E&Object&A::method}(i);
 }
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
     : super self::_E&Object&A&D::•()
     ;
-  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E&Object&A&D::method
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::F::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::F::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::F::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::F::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::F::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::F::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::F::runtimeType
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
 }
 static method main() → dynamic {
-  core::print(new self::C::•().{self::C::method}(0));
+  core::print(new self::C::•().{self::_C&Object&A&B::method}(0));
 }
 
 library;
@@ -142,6 +218,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract forwarding-stub method method(covariant core::num* i) → core::String*;
 }
+abstract class F extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
 
 constants  {
   #C1 = "hello"
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect
index 7354b67..8c473d0 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect
@@ -4,4 +4,6 @@
 
 class E with A, D {}
 
+class G with A, F {}
+
 main() {}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect
index 7354b67..8c473d0 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect
@@ -4,4 +4,6 @@
 
 class E with A, D {}
 
+class G with A, F {}
+
 main() {}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart b/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart
index 61a4823..a209b30 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart
@@ -19,3 +19,5 @@
 }
 
 abstract class D implements Interface, Interface2 {}
+
+abstract class F implements Interface {}
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
index 3ede97f..db60ecb 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -203,8 +203,8 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -215,8 +215,8 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -232,15 +232,15 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -256,8 +256,8 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -278,8 +278,8 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -290,8 +290,8 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -306,8 +306,8 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -327,8 +327,8 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -338,8 +338,8 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -359,8 +359,8 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -385,8 +385,8 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
index a0c20c5..56cdffa 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
@@ -206,8 +206,8 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -218,8 +218,8 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -235,15 +235,15 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -259,8 +259,8 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -281,8 +281,8 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -293,8 +293,8 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -310,8 +310,8 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -332,8 +332,8 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -344,8 +344,8 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -366,8 +366,8 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -393,8 +393,8 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
index 5adab63..01e76d1 100644
--- a/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
@@ -52,11 +52,11 @@
     ;
   mixin-super-stub method method1(core::num* argument1, core::num* argument2) → core::String*
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*
+  mixin-super-stub method method2(covariant core::int* argument1, core::num* argument2) → core::String*
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
+  forwarding-stub method method4(covariant core::int* argument1, covariant core::int* argument2) → core::String*
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
index 716fe27..f6a8a4d 100644
--- a/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
@@ -54,11 +54,11 @@
     ;
   mixin-super-stub method method1(core::num* argument1, core::num* argument2) → core::String*
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*
+  mixin-super-stub method method2(covariant core::int* argument1, core::num* argument2) → core::String*
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
+  forwarding-stub method method4(covariant core::int* argument1, covariant core::int* argument2) → core::String*
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect
index a5302a7..8f9542d 100644
--- a/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect
@@ -72,10 +72,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::MixinClass::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
 }
 abstract class _ClassExtendsMixinClass&Super&MixinClass = self::Super with self::MixinClass /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_ClassExtendsMixinClass&Super&MixinClass*
@@ -83,10 +86,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::MixinClass::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
 }
 abstract class ClassExtendsMixinClass extends self::_ClassExtendsMixinClass&Super&MixinClass {
   synthetic constructor •() → self::ClassExtendsMixinClass*
@@ -98,10 +104,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::Mixin::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::Mixin::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::Mixin::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
 }
 abstract class _ClassExtendsMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_ClassExtendsMixin&Super&Mixin*
@@ -109,10 +118,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::Mixin::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::Mixin::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::Mixin::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
 }
 abstract class ClassExtendsMixin extends self::_ClassExtendsMixin&Super&Mixin {
   synthetic constructor •() → self::ClassExtendsMixin*
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect
index 940088e..1a74047 100644
--- a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect
@@ -66,10 +66,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::MixinClass::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
 }
 abstract class _ClassExtendsMixinClass&Super&MixinClass = self::Super with self::MixinClass /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_ClassExtendsMixinClass&Super&MixinClass*
@@ -77,10 +80,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::MixinClass::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
 }
 abstract class ClassExtendsMixinClass extends self::_ClassExtendsMixinClass&Super&MixinClass {
   synthetic constructor •() → self::ClassExtendsMixinClass*
@@ -93,10 +99,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::Mixin::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::Mixin::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::Mixin::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
 }
 abstract class _ClassExtendsMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_ClassExtendsMixin&Super&Mixin*
@@ -104,10 +113,13 @@
     ;
   mixin-super-stub method concreteExtendsConcreteMixin() → void
     return super.{self::Mixin::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
   mixin-super-stub method concreteMixin() → void
     return super.{self::Mixin::concreteMixin}();
   mixin-super-stub method abstractExtendsConcreteMixin() → void
     return super.{self::Mixin::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
 }
 abstract class ClassExtendsMixin extends self::_ClassExtendsMixin&Super&Mixin {
   synthetic constructor •() → self::ClassExtendsMixin*
@@ -120,11 +132,11 @@
     ;
   method method() → dynamic {
     this.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
-    this.{self::MixinClass::concreteExtendsAbstractMixin}();
+    this.{self::ClassEqMixinClass::concreteExtendsAbstractMixin}();
     this.{self::ClassEqMixinClass::concreteMixin}();
     this.{self::ClassEqMixinClass::abstractExtendsConcreteMixin}();
-    this.{self::MixinClass::abstractExtendsAbstractMixin}();
-    this.{self::MixinClass::abstractMixin}();
+    this.{self::ClassEqMixinClass::abstractExtendsAbstractMixin}();
+    this.{self::ClassEqMixinClass::abstractMixin}();
     super.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::ClassEqMixinClass::concreteMixin}();
@@ -138,10 +150,10 @@
   method method() → dynamic {
     this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
     this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
-    this.{self::MixinClass::concreteExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsAbstractMixin}();
     this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsConcreteMixin}();
-    this.{self::MixinClass::abstractExtendsAbstractMixin}();
-    this.{self::MixinClass::abstractMixin}();
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractMixin}();
     super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
@@ -154,11 +166,11 @@
     ;
   method method() → dynamic {
     this.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
-    this.{self::Mixin::concreteExtendsAbstractMixin}();
+    this.{self::ClassEqMixin::concreteExtendsAbstractMixin}();
     this.{self::ClassEqMixin::concreteMixin}();
     this.{self::ClassEqMixin::abstractExtendsConcreteMixin}();
-    this.{self::Mixin::abstractExtendsAbstractMixin}();
-    this.{self::Mixin::abstractMixin}();
+    this.{self::ClassEqMixin::abstractExtendsAbstractMixin}();
+    this.{self::ClassEqMixin::abstractMixin}();
     super.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::ClassEqMixin::concreteMixin}();
@@ -171,11 +183,11 @@
     ;
   method method() → dynamic {
     this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
-    this.{self::Mixin::concreteExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsAbstractMixin}();
     this.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
     this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsConcreteMixin}();
-    this.{self::Mixin::abstractExtendsAbstractMixin}();
-    this.{self::Mixin::abstractMixin}();
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractMixin}();
     super.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect
index 01a2d50..53cf7f1 100644
--- a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect
@@ -65,9 +65,9 @@
     : super self::Super::•()
     ;
   method concreteExtendsConcreteMixin() → void {}
+  abstract method concreteExtendsAbstractMixin() → void;
   method concreteMixin() → void {}
   method abstractExtendsConcreteMixin() → void {}
-  abstract method concreteExtendsAbstractMixin() → void;
   abstract method abstractExtendsAbstractMixin() → void;
   abstract method abstractMixin() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,9 +86,9 @@
     : super self::Super::•()
     ;
   method concreteExtendsConcreteMixin() → void {}
+  abstract method concreteExtendsAbstractMixin() → void;
   method concreteMixin() → void {}
   method abstractExtendsConcreteMixin() → void {}
-  abstract method concreteExtendsAbstractMixin() → void;
   abstract method abstractExtendsAbstractMixin() → void;
   abstract method abstractMixin() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -112,9 +112,9 @@
     : super self::Super::•()
     ;
   method concreteExtendsConcreteMixin() → void {}
+  abstract method concreteExtendsAbstractMixin() → void;
   method concreteMixin() → void {}
   method abstractExtendsConcreteMixin() → void {}
-  abstract method concreteExtendsAbstractMixin() → void;
   abstract method abstractExtendsAbstractMixin() → void;
   abstract method abstractMixin() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -133,9 +133,9 @@
     : super self::Super::•()
     ;
   method concreteExtendsConcreteMixin() → void {}
+  abstract method concreteExtendsAbstractMixin() → void;
   method concreteMixin() → void {}
   method abstractExtendsConcreteMixin() → void {}
-  abstract method concreteExtendsAbstractMixin() → void;
   abstract method abstractExtendsAbstractMixin() → void;
   abstract method abstractMixin() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -160,11 +160,11 @@
     ;
   method method() → dynamic {
     this.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
-    this.{self::MixinClass::concreteExtendsAbstractMixin}();
+    this.{self::ClassEqMixinClass::concreteExtendsAbstractMixin}();
     this.{self::ClassEqMixinClass::concreteMixin}();
     this.{self::ClassEqMixinClass::abstractExtendsConcreteMixin}();
-    this.{self::MixinClass::abstractExtendsAbstractMixin}();
-    this.{self::MixinClass::abstractMixin}();
+    this.{self::ClassEqMixinClass::abstractExtendsAbstractMixin}();
+    this.{self::ClassEqMixinClass::abstractMixin}();
     super.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::ClassEqMixinClass::concreteMixin}();
@@ -178,10 +178,10 @@
   method method() → dynamic {
     this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
     this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
-    this.{self::MixinClass::concreteExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsAbstractMixin}();
     this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsConcreteMixin}();
-    this.{self::MixinClass::abstractExtendsAbstractMixin}();
-    this.{self::MixinClass::abstractMixin}();
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractMixin}();
     super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
@@ -194,11 +194,11 @@
     ;
   method method() → dynamic {
     this.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
-    this.{self::Mixin::concreteExtendsAbstractMixin}();
+    this.{self::ClassEqMixin::concreteExtendsAbstractMixin}();
     this.{self::ClassEqMixin::concreteMixin}();
     this.{self::ClassEqMixin::abstractExtendsConcreteMixin}();
-    this.{self::Mixin::abstractExtendsAbstractMixin}();
-    this.{self::Mixin::abstractMixin}();
+    this.{self::ClassEqMixin::abstractExtendsAbstractMixin}();
+    this.{self::ClassEqMixin::abstractMixin}();
     super.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::ClassEqMixin::concreteMixin}();
@@ -211,11 +211,11 @@
     ;
   method method() → dynamic {
     this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
-    this.{self::Mixin::concreteExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsAbstractMixin}();
     this.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
     this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsConcreteMixin}();
-    this.{self::Mixin::abstractExtendsAbstractMixin}();
-    this.{self::Mixin::abstractMixin}();
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsAbstractMixin}();
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractMixin}();
     super.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
     super.{self::Super::concreteExtendsAbstractMixin}();
     super.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
index 4c683ea..d815435 100644
--- a/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
@@ -22,7 +22,6 @@
 class C extends core::Iterable<core::Object*> {
   synthetic constructor •() → self::C*
     ;
-  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
   abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
   abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
   abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -59,6 +58,7 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
 }
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
index ae6ded4..2418880 100644
--- a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
@@ -30,7 +30,6 @@
   synthetic constructor •() → self::C*
     : super core::Iterable::•()
     ;
-  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
   abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
   abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
   abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
 }
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
index ae6ded4..2418880 100644
--- a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
@@ -30,7 +30,6 @@
   synthetic constructor •() → self::C*
     : super core::Iterable::•()
     ;
-  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
   abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
   abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
   abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
 }
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect
index 3fb40fc..999fa79 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect
@@ -12,6 +12,26 @@
 //   var interfaceMethod1;
 //       ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:29:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+//                ^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:35:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:35:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
 //  - A.abstractMethod
 //  - A.property1=
@@ -50,6 +70,36 @@
 //   void interfaceMethod3() {}
 //        ^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:44:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:50:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+//       ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:56:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:56:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
 //  - A.abstractMethod
 //  - A.property1=
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect
@@ -8,6 +8,7 @@
     ;
   method foo() → self::A*
     return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect
@@ -8,6 +8,7 @@
     ;
   method foo() → self::A*
     return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
index df77c0e..9bddb8c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
@@ -206,8 +206,8 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -218,8 +218,8 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -235,15 +235,15 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -259,8 +259,8 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -281,8 +281,8 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -293,8 +293,8 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -310,8 +310,8 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -332,8 +332,8 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -344,8 +344,8 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -366,8 +366,8 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -393,8 +393,8 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  mixin-super-stub method foo([dynamic x = #C1]) → dynamic
-    return super.{self::M::foo}(x);
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect
index e603673..50bca4d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect
@@ -30,7 +30,6 @@
   synthetic constructor •() → self::C*
     : super core::Iterable::•()
     ;
-  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
   abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
   abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
   abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
 }
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart:14:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect
index e603673..50bca4d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect
@@ -30,7 +30,6 @@
   synthetic constructor •() → self::C*
     : super core::Iterable::•()
     ;
-  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
   abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
   abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
   abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
 }
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart:14:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
index 136a4b6..cd92eb8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
@@ -7,6 +7,16 @@
     synthetic constructor •() → main::ABC*
       : super a::AB::•()
       ;
+    abstract mixin-stub get _identityHashCode() → dart.core::int*; -> a::C::_identityHashCode
+    abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> a::C::_instanceOf
+    abstract mixin-stub method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOf
+    abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOfTrue
+    abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOfFalse
+    abstract mixin-stub operator ==(dynamic other) → dart.core::bool*; -> a::C::==
+    abstract mixin-stub get hashCode() → dart.core::int*; -> a::C::hashCode
+    abstract mixin-stub method toString() → dart.core::String*; -> a::C::toString
+    abstract mixin-stub method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> a::C::noSuchMethod
+    abstract mixin-stub get runtimeType() → dart.core::Type*; -> a::C::runtimeType
   }
 }
 library from "package:module/a.dart" as a {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
index 20bd0f2..83dfce6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -6,6 +6,7 @@
   abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
     abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
     abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
@@ -68,6 +69,7 @@
       ;
     abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
     abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> fra::State::_widget
+    abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
index 89c1841..7e07afc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -6,6 +6,7 @@
   abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
     abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
     abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
@@ -66,6 +67,13 @@
     synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
       : super fra::State::•()
       ;
+    abstract mixin-stub get _widget() → main::HotReloadIssue*; -> aft::AfterLayoutMixin::_widget
+    abstract mixin-stub set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> aft::AfterLayoutMixin::_widget
+    abstract mixin-stub method toString() → dart.core::String*; -> aft::AfterLayoutMixin::toString
+    abstract mixin-stub operator ==(dynamic other) → dart.core::bool*; -> aft::AfterLayoutMixin::==
+    abstract mixin-stub get hashCode() → dart.core::int*; -> aft::AfterLayoutMixin::hashCode
+    abstract mixin-stub method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> aft::AfterLayoutMixin::noSuchMethod
+    abstract mixin-stub get runtimeType() → dart.core::Type*; -> aft::AfterLayoutMixin::runtimeType
   }
   class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
     synthetic constructor •() → main::_HotReloadIssueState*
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
index 4ebbef1..3cb283a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
@@ -5,7 +5,6 @@
     synthetic constructor •() → main::AIterator*
       : super dart.core::Iterator::•()
       ;
-    abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -16,6 +15,7 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+    abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
   }
   class Foo extends dart.core::Object {
     final field dynamic a;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
index f8aea1f..e82a2d4 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
@@ -34,7 +34,6 @@
     synthetic constructor •() → main::BIterator*
       : super dart.core::Iterator::•()
       ;
-    abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -45,6 +44,7 @@
     abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+    abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
   }
   class Foo extends dart.core::Object {
     final field invalid-type kjsdf = null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
index daf5d03..9f2d3d5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
@@ -10,7 +10,6 @@
     ;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -55,6 +54,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method F<T extends core::Object* = dynamic>() → self::F::T*
   ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
index 503c83f..0887aa4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
@@ -10,7 +10,6 @@
     return null;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -55,6 +54,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 21dd720..7754fb8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -11,7 +11,6 @@
     return null;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -56,6 +55,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
index e2413d9..fa0d3a1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
@@ -10,7 +10,6 @@
     ;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -55,6 +54,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method foo() → asy::Stream<core::List<core::int*>*>* async* 
   ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index 2420358..d6d38a5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -37,7 +37,6 @@
     return null;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -82,6 +81,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method foo() → asy::Stream<core::List<core::int*>*>* async* {
   yield<core::int*>[];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
index 5557102..5421bab 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
@@ -37,7 +37,6 @@
     return null;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -82,6 +81,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method foo() → asy::Stream<core::List<core::int*>*>* /* originally async* */ {
   asy::_AsyncStarStreamController<core::List<core::int*>*>* :controller;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index 3ceab23e..98b90b7 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -57,7 +57,6 @@
     ;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -102,6 +101,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method test() → dynamic async 
   ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 040669a..fc3c8e8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -100,7 +100,6 @@
     return null;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -145,6 +144,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method test() → dynamic async {
   self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 4aa6578..e1ed3dc 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -195,7 +195,6 @@
     return null;
   abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
   abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
-  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
   abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
   abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
   abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -240,6 +239,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
 }
 static method test() → dynamic /* originally async */ {
   final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
index db93300..1575bda 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
@@ -23,6 +23,7 @@
 class E extends core::StackTrace {
   synthetic constructor •() → self::E*
     ;
+  abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
index 17d888d..adbb087 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
@@ -26,6 +26,7 @@
   synthetic constructor •() → self::E*
     : super core::StackTrace::•()
     ;
+  abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
index 17d888d..adbb087 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
@@ -26,6 +26,7 @@
   synthetic constructor •() → self::E*
     : super core::StackTrace::•()
     ;
+  abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect
index 7c87b5f..08e7b3e 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect
@@ -2,6 +2,13 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32: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'.
 // Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
 //   void set property6(int i); // error
@@ -10,12 +17,12 @@
 //   late final int? property6;
 //                   ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-//   void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
 //            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-//   late final int? property6;
-//                   ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
 //
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52: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'.
 // Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
index 1e3b9c1..f982c6a 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
@@ -2,6 +2,13 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32: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'.
 // Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
 //   void set property6(int i); // error
@@ -10,12 +17,12 @@
 //   late final int? property6;
 //                   ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-//   void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
 //            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-//   late final int? property6;
-//                   ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
 //
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52: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'.
 // Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
index 1e3b9c1..f982c6a 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
@@ -2,6 +2,13 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32: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'.
 // Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
 //   void set property6(int i); // error
@@ -10,12 +17,12 @@
 //   late final int? property6;
 //                   ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-//   void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
 //            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-//   late final int? property6;
-//                   ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
 //
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52: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'.
 // Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
index f3ffff6..8d9af18 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
@@ -2,6 +2,13 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32: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'.
 // Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
 //   void set property6(int i); // error
@@ -10,12 +17,12 @@
 //   late final int? property6;
 //                   ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-//   void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
 //            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-//   late final int? property6;
-//                   ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
 //
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52: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'.
 // Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
index f3ffff6..8d9af18 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
@@ -2,6 +2,13 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32: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'.
 // Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
 //   void set property6(int i); // error
@@ -10,12 +17,12 @@
 //   late final int? property6;
 //                   ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-//   void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
 //            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-//   late final int? property6;
-//                   ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
 //
 // pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52: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'.
 // Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart b/pkg/front_end/testcases/late_lowering/late_override.dart
new file mode 100644
index 0000000..d2a3ddd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Interface {
+  late int implementedLateFieldDeclaredGetterSetter;
+}
+
+class Class implements Interface {
+  int get implementedLateFieldDeclaredGetterSetter => 0;
+
+  void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.outline.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.outline.expect
new file mode 100644
index 0000000..4278a64
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+  field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter;
+  synthetic constructor •() → self::Interface
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int;
+  set implementedLateFieldDeclaredGetterSetter(core::int #t1) → void;
+}
+class Class extends core::Object implements self::Interface {
+  synthetic constructor •() → self::Class
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    ;
+  set implementedLateFieldDeclaredGetterSetter(core::int value) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.expect
new file mode 100644
index 0000000..0dffea5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+  field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter") : #t1{core::int};
+  set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+}
+class Class extends core::Object implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return 0;
+  set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.transformed.expect
new file mode 100644
index 0000000..0dffea5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+  field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter") : #t1{core::int};
+  set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+}
+class Class extends core::Object implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return 0;
+  set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline.expect
new file mode 100644
index 0000000..24986e8
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+class Interface {
+  late int implementedLateFieldDeclaredGetterSetter;
+}
+
+class Class implements Interface {
+  int get implementedLateFieldDeclaredGetterSetter => 0;
+  void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..61b08f4
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+class Class implements Interface {
+  int get implementedLateFieldDeclaredGetterSetter => 0;
+  void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
+class Interface {
+  ---- unknown chunk starts ----
+late
+---- unknown chunk ends ----
+  int implementedLateFieldDeclaredGetterSetter;
+}
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.expect
new file mode 100644
index 0000000..3f8b983
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+  field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+  field core::bool _#Interface#implementedLateFieldDeclaredGetterSetter#isSet = false;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} ?{core::int} let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1{core::int} : throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter");
+  set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void {
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} = true;
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+  }
+}
+class Class extends core::Object implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return 0;
+  set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.transformed.expect
new file mode 100644
index 0000000..3f8b983
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+  field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+  field core::bool _#Interface#implementedLateFieldDeclaredGetterSetter#isSet = false;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} ?{core::int} let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1{core::int} : throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter");
+  set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void {
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} = true;
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+  }
+}
+class Class extends core::Object implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return 0;
+  set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
index 8b55238..f0666bf 100644
--- a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
@@ -95,141 +95,169 @@
   synthetic constructor •() → self::_Class&Super&M0
     : super self::Super::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M0::property
 }
 abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1
     : super self::_Class&Super&M0::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M1::property
 }
 abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2
     : super self::_Class&Super&M0&M1::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M2::property
 }
 abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
     : super self::_Class&Super&M0&M1&M2::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M3::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
     : super self::_Class&Super&M0&M1&M2&M3::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M4::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
     : super self::_Class&Super&M0&M1&M2&M3&M4::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M5::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M6::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M7::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M8::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M9::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M10::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M11::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M12::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M13::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M14::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M15::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M16::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M17::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M18::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M19::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M20::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M21::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M22::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M23::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M24::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M25::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M26::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M27::property
 }
 class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
   synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
index 974275d..2ae4ce3 100644
--- a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
@@ -96,141 +96,169 @@
   synthetic constructor •() → self::_Class&Super&M0
     : super self::Super::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M0::property
 }
 abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1
     : super self::_Class&Super&M0::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M1::property
 }
 abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2
     : super self::_Class&Super&M0&M1::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M2::property
 }
 abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
     : super self::_Class&Super&M0&M1&M2::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M3::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
     : super self::_Class&Super&M0&M1&M2&M3::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M4::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
     : super self::_Class&Super&M0&M1&M2&M3&M4::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M5::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M6::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M7::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M8::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M9::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M10::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M11::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M12::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M13::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M14::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M15::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M16::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M17::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M18::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M19::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M20::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M21::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M22::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M23::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M24::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M25::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M26::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M27::property
 }
 class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
   synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
index 974275d..2ae4ce3 100644
--- a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
@@ -96,141 +96,169 @@
   synthetic constructor •() → self::_Class&Super&M0
     : super self::Super::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M0::property
 }
 abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1
     : super self::_Class&Super&M0::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M1::property
 }
 abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2
     : super self::_Class&Super&M0&M1::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M2::property
 }
 abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
     : super self::_Class&Super&M0&M1&M2::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M3::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
     : super self::_Class&Super&M0&M1&M2&M3::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M4::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
     : super self::_Class&Super&M0&M1&M2&M3&M4::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M5::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M6::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M7::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M8::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M9::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M10::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M11::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M12::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M13::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M14::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M15::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M16::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M17::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M18::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M19::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M20::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M21::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M22::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M23::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M24::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M25::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M26::property
 }
 abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
     : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
     ;
+  abstract mixin-stub get property() → core::int; -> self::M27::property
 }
 class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
   synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect
index da98632..a05e6c9 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   num get property6; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6 = 0;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
 // Change to a subtype of 'int'.
 //   num get property6; // error
@@ -45,13 +52,6 @@
 //   int property6 = 0;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   num get property6; // error
-//           ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6 = 0;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect
index f2f3537..c6058f6 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   num get property6; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6 = 0;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
 // Change to a subtype of 'int'.
 //   num get property6; // error
@@ -45,13 +52,6 @@
 //   int property6 = 0;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   num get property6; // error
-//           ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6 = 0;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect
index f2f3537..c6058f6 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   num get property6; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6 = 0;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
 // Change to a subtype of 'int'.
 //   num get property6; // error
@@ -45,13 +52,6 @@
 //   int property6 = 0;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   num get property6; // error
-//           ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6 = 0;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect
index 36042d2..40bce371 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect
@@ -9,6 +9,13 @@
 //   late final int? property6;
 //                   ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
 // 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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -17,13 +24,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect
index e53ccba4..4d7c28b4 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect
@@ -9,6 +9,13 @@
 //   late final int? property6;
 //                   ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
 // 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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -17,13 +24,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect
index e53ccba4..4d7c28b4 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect
@@ -9,6 +9,13 @@
 //   late final int? property6;
 //                   ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
 // 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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -17,13 +24,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect
index e53ccba4..4d7c28b4 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect
@@ -9,6 +9,13 @@
 //   late final int? property6;
 //                   ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
 // 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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -17,13 +24,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect
index e53ccba4..4d7c28b4 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect
@@ -9,6 +9,13 @@
 //   late final int? property6;
 //                   ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
 // 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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -17,13 +24,6 @@
 //   late int property6;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-//   late int property6;
-//            ^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect
index ced9893..73e689a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101: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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -45,13 +52,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101: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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -45,13 +52,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101: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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -45,13 +52,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101: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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -45,13 +52,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
@@ -37,6 +37,13 @@
 //   void set property3(int i);
 //            ^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101: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'.
 // Change to a subtype of 'int'.
 //   int? get property6; // error
@@ -45,13 +52,6 @@
 //   int property6;
 //       ^
 //
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-//   int? get property6; // error
-//            ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-//   int property6;
-//       ^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
 // abstract class D3 implements D1, D2 /* error on property3 */ {}
 //                ^
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
index e08ec43..30674ab 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
@@ -173,6 +173,16 @@
   synthetic constructor •() → gen::LegacyClass3*
     : super self::Class1::•()
     ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
   abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
   abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
@@ -185,15 +195,5 @@
   abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
   abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
   abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
index e08ec43..30674ab 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
@@ -173,6 +173,16 @@
   synthetic constructor •() → gen::LegacyClass3*
     : super self::Class1::•()
     ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
   abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
   abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
@@ -185,15 +195,5 @@
   abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
   abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
   abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect
index e1f73da..0f16923 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect
@@ -28,10 +28,12 @@
   synthetic constructor •() → self::Class
     : super self::Super::•()
     ;
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
   mixin-super-stub method extendedConcreteMixedInConcreteMethod() → void
     return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
-  abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
-  forwarding-stub method extendedConcreteMixedInConcreteImplementedMethod(covariant core::num i) → void
+  forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void
+    return super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(i);
+  forwarding-stub method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void
     return super.{self::Mixin::extendedConcreteMixedInConcreteImplementedMethod}(i);
 }
 class Sub extends self::Class {
@@ -39,15 +41,14 @@
     : super self::Class::•()
     ;
   method test() → void {
-    this.{self::Mixin::extendedConcreteMixedInAbstractMethod}();
+    this.{self::Class::extendedConcreteMixedInAbstractMethod}();
     super.{self::Super::extendedConcreteMixedInAbstractMethod}();
     this.{self::Class::extendedConcreteMixedInConcreteMethod}();
     super.{self::Class::extendedConcreteMixedInConcreteMethod}();
-    this.{self::Sub::extendedConcreteMixedInAbstractImplementedMethod}(0);
-    super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(0);
+    this.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
+    super.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
     this.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
     super.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
   }
-  abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
index 709b09a..8f44020 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
@@ -28,25 +28,24 @@
   synthetic constructor •() → self::Class
     : super self::Super::•()
     ;
+  abstract method extendedConcreteMixedInAbstractMethod() → void;
   method extendedConcreteMixedInConcreteMethod() → void {}
   abstract method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void;
   method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void {}
-  abstract method extendedConcreteMixedInAbstractMethod() → void;
 }
 class Sub extends self::Class {
   synthetic constructor •() → self::Sub
     : super self::Class::•()
     ;
   method test() → void {
-    this.{self::Mixin::extendedConcreteMixedInAbstractMethod}();
+    this.{self::Class::extendedConcreteMixedInAbstractMethod}();
     super.{self::Super::extendedConcreteMixedInAbstractMethod}();
     this.{self::Class::extendedConcreteMixedInConcreteMethod}();
     super.{self::Class::extendedConcreteMixedInConcreteMethod}();
-    this.{self::Sub::extendedConcreteMixedInAbstractImplementedMethod}(0);
-    super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(0);
+    this.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
+    super.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
     this.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
     super.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
   }
-  abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect
index 825a474..f1538ce 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect
@@ -12,13 +12,6 @@
 //   int get extendedMethodMixedInGetter => 0;
 //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Error: Can't declare a member that conflicts with an inherited one.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:17:12: Context: This is the inherited member.
-//   void set extendedSetterMixedInMethod(int value) {}
-//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:93:11: Error: Can't declare a member that conflicts with an inherited one.
 //   int get extendedMethodDeclaredGetter => 0;
 //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -57,51 +50,37 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:100:11: Error: Can't declare a member that conflicts with an inherited one.
 //   int get mixedInMethodDeclaredGetter => 0;
 //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:29:8: Context: This is the inherited member.
+//   void mixedInMethodDeclaredGetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:102:7: Error: Can't declare a member that conflicts with an inherited one.
 //   int mixedInMethodDeclaredField = 0;
 //       ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:31:8: Context: This is the inherited member.
+//   void mixedInMethodDeclaredField() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:103:8: Error: Can't declare a member that conflicts with an inherited one.
 //   void mixedInGetterDeclaredMethod() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:32:11: Context: This is the inherited member.
+//   int get mixedInGetterDeclaredMethod => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:104:8: Error: Can't declare a member that conflicts with an inherited one.
 //   void mixedInSetterDeclaredMethod() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:104:8: Error: 'Mixin.mixedInSetterDeclaredMethod==' is already declared in this scope.
-//   void mixedInSetterDeclaredMethod() {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: Previous declaration of 'Mixin.mixedInSetterDeclaredMethod=='.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:33:12: Context: This is the inherited member.
+//   void set mixedInSetterDeclaredMethod(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:105:8: Error: Can't declare a member that conflicts with an inherited one.
 //   void mixedInFieldDeclaredMethod() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:105:8: Error: 'Mixin.mixedInFieldDeclaredMethod=' is already declared in this scope.
-//   void mixedInFieldDeclaredMethod() {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: Previous declaration of 'Mixin.mixedInFieldDeclaredMethod='.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:34:7: Context: This is the inherited member.
+//   int mixedInFieldDeclaredMethod = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:107:11: Error: Can't declare a member that conflicts with an inherited one.
 //   int get implementedMethodDeclaredGetter => 0;
@@ -155,16 +134,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:101:12: Error: Can't declare a member that conflicts with an inherited one.
 //   void set mixedInMethodDeclaredSetter(int value) {}
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:101:12: Error: 'Mixin.mixedInMethodDeclaredSetter' is already declared in this scope.
-//   void set mixedInMethodDeclaredSetter(int value) {}
-//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: Previous declaration of 'Mixin.mixedInMethodDeclaredSetter'.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:30:8: Context: This is the inherited member.
+//   void mixedInMethodDeclaredSetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:108:12: Error: Can't declare a member that conflicts with an inherited one.
 //   void set implementedMethodDeclaredSetter(int value) {}
@@ -277,6 +249,8 @@
   synthetic constructor •() → self::_Class&Super&Mixin
     : super self::Super::•()
     ;
+  mixin-super-stub method mixedInMethodDeclaredSetter() → void
+    return super.{self::Mixin::mixedInMethodDeclaredSetter}();
   mixin-super-stub get mixedInFieldDeclaredMethod() → core::int
     return super.{self::Mixin::mixedInFieldDeclaredMethod};
   mixin-super-stub set mixedInFieldDeclaredMethod(core::int value) → void
@@ -285,12 +259,12 @@
     return super.{self::Mixin::mixedInFieldImplementedMethod};
   mixin-super-stub set mixedInFieldImplementedMethod(core::int value) → void
     return super.{self::Mixin::mixedInFieldImplementedMethod} = value;
+  mixin-super-stub get extendedMethodMixedInField() → core::int
+    return super.{self::Mixin::extendedMethodMixedInField};
   mixin-super-stub set extendedMethodMixedInField(core::int value) → void
     return super.{self::Mixin::extendedMethodMixedInField} = value;
   mixin-super-stub method mixedInMethodDeclaredGetter() → void
     return super.{self::Mixin::mixedInMethodDeclaredGetter}();
-  mixin-super-stub method mixedInMethodDeclaredSetter() → void
-    return super.{self::Mixin::mixedInMethodDeclaredSetter}();
   mixin-super-stub method mixedInMethodDeclaredField() → void
     return super.{self::Mixin::mixedInMethodDeclaredField}();
   mixin-super-stub get mixedInGetterDeclaredMethod() → core::int
@@ -303,8 +277,14 @@
     return super.{self::Mixin::mixedInMethodImplementedField}();
   mixin-super-stub get mixedInGetterImplementedMethod() → core::int
     return super.{self::Mixin::mixedInGetterImplementedMethod};
+  mixin-super-stub get extendedMethodMixedInGetter() → core::int
+    return super.{self::Mixin::extendedMethodMixedInGetter};
+  mixin-super-stub method extendedGetterMixedInMethod() → void
+    return super.{self::Mixin::extendedGetterMixedInMethod}();
   mixin-super-stub method extendedSetterMixedInMethod() → void
     return super.{self::Mixin::extendedSetterMixedInMethod}();
+  mixin-super-stub method extendedFieldMixedInMethod() → void
+    return super.{self::Mixin::extendedFieldMixedInMethod}();
   mixin-super-stub set mixedInSetterDeclaredMethod(core::int value) → void
     return super.{self::Mixin::mixedInSetterDeclaredMethod} = value;
   mixin-super-stub set mixedInSetterImplementedMethod(core::int value) → void
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect
index fd7af41..becdaa6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect
@@ -3,12 +3,15 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-//  - AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedField=
+//  - Super.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractImplementedMultipleField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -17,26 +20,38 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   int extendedAbstractImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField=' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField=' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
 //  - Super.extendedAbstractImplementedField
@@ -51,6 +66,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   int extendedAbstractImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect
index fd7af41..becdaa6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect
@@ -3,12 +3,15 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-//  - AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedField=
+//  - Super.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractImplementedMultipleField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -17,26 +20,38 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   int extendedAbstractImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField=' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField=' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
 //  - Super.extendedAbstractImplementedField
@@ -51,6 +66,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   int extendedAbstractImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect
index 1fe2215..e65fe64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect
@@ -3,9 +3,12 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedMultipleField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   final int extendedAbstractImplementedField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:12:22: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract final int extendedAbstractImplementedField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:16:22: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract final int extendedAbstractImplementedMultipleField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractImplementedField
 //  - Super.extendedAbstractImplementedMultipleField
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   final int extendedAbstractImplementedField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect
index 1fe2215..e65fe64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect
@@ -3,9 +3,12 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedMultipleField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   final int extendedAbstractImplementedField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:12:22: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract final int extendedAbstractImplementedField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:16:22: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract final int extendedAbstractImplementedMultipleField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractImplementedField
 //  - Super.extendedAbstractImplementedMultipleField
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   final int extendedAbstractImplementedField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect
index 68eae42..39f968f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect
@@ -3,9 +3,12 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter
+//  - Interface1.extendedAbstractImplementedGetter
+//  - Interface1.extendedAbstractImplementedMultipleGetter
+//  - Interface2.extendedAbstractImplementedMultipleGetter
 //  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractImplementedGetter
+//  - Super.extendedAbstractImplementedMultipleGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:12:11: Context: 'Super.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:16:11: Context: 'Super.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedGetter
+//  - Interface1.extendedAbstractImplementedMultipleGetter
+//  - Interface2.extendedAbstractImplementedMultipleGetter
 //  - Super.extendedAbstractGetter
 //  - Super.extendedAbstractImplementedGetter
 //  - Super.extendedAbstractImplementedMultipleGetter
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect
index 68eae42..39f968f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect
@@ -3,9 +3,12 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter
+//  - Interface1.extendedAbstractImplementedGetter
+//  - Interface1.extendedAbstractImplementedMultipleGetter
+//  - Interface2.extendedAbstractImplementedMultipleGetter
 //  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractImplementedGetter
+//  - Super.extendedAbstractImplementedMultipleGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:12:11: Context: 'Super.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:16:11: Context: 'Super.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedGetter
+//  - Interface1.extendedAbstractImplementedMultipleGetter
+//  - Interface2.extendedAbstractImplementedMultipleGetter
 //  - Super.extendedAbstractGetter
 //  - Super.extendedAbstractImplementedGetter
 //  - Super.extendedAbstractImplementedMultipleGetter
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect
index 7d6110d..2bb4d30 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect
@@ -3,8 +3,11 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.extendedAbstractImplementedMultipleMethod
+//  - Interface2.extendedAbstractImplementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractImplementedMultipleMethod
 //  - Super.extendedAbstractMethod
 // Try to either
 //  - provide an implementation,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:16:8: Context: 'Super.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.extendedAbstractImplementedMultipleMethod
+//  - Interface2.extendedAbstractImplementedMultipleMethod
 //  - Super.extendedAbstractImplementedMethod
 //  - Super.extendedAbstractImplementedMultipleMethod
 //  - Super.extendedAbstractMethod
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
 //   void extendedAbstractImplementedMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect
index 7d6110d..2bb4d30 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect
@@ -3,8 +3,11 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.extendedAbstractImplementedMultipleMethod
+//  - Interface2.extendedAbstractImplementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractImplementedMultipleMethod
 //  - Super.extendedAbstractMethod
 // Try to either
 //  - provide an implementation,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:16:8: Context: 'Super.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.extendedAbstractImplementedMultipleMethod
+//  - Interface2.extendedAbstractImplementedMultipleMethod
 //  - Super.extendedAbstractImplementedMethod
 //  - Super.extendedAbstractImplementedMultipleMethod
 //  - Super.extendedAbstractMethod
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
 //   void extendedAbstractImplementedMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect
index 9a3a3e9..e2cfcb3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect
@@ -3,8 +3,11 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==
-//  - AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==
+//  - Interface1.extendedAbstractImplementedMultipleSetter=
+//  - Interface1.extendedAbstractImplementedSetter=
+//  - Interface2.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedSetter=
 //  - Super.extendedAbstractSetter=
 // Try to either
 //  - provide an implementation,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:12:12: Context: 'Super.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
 //   void set extendedAbstractSetter(int value);
 //            ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMultipleSetter=
+//  - Interface1.extendedAbstractImplementedSetter=
+//  - Interface2.extendedAbstractImplementedMultipleSetter=
 //  - Super.extendedAbstractImplementedMultipleSetter=
 //  - Super.extendedAbstractImplementedSetter=
 //  - Super.extendedAbstractSetter=
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
 //   void set extendedAbstractImplementedMultipleSetter(int value);
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect
index 9a3a3e9..e2cfcb3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect
@@ -3,8 +3,11 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==
-//  - AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==
+//  - Interface1.extendedAbstractImplementedMultipleSetter=
+//  - Interface1.extendedAbstractImplementedSetter=
+//  - Interface2.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedSetter=
 //  - Super.extendedAbstractSetter=
 // Try to either
 //  - provide an implementation,
@@ -14,17 +17,29 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:12:12: Context: 'Super.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
 //   void set extendedAbstractSetter(int value);
 //            ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMultipleSetter=
+//  - Interface1.extendedAbstractImplementedSetter=
+//  - Interface2.extendedAbstractImplementedMultipleSetter=
 //  - Super.extendedAbstractImplementedMultipleSetter=
 //  - Super.extendedAbstractImplementedSetter=
 //  - Super.extendedAbstractSetter=
@@ -36,6 +51,15 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
 //   void set extendedAbstractImplementedMultipleSetter(int value);
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect
index d886bdb..fe7b938 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect
@@ -2,17 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field1' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:6:7: Context: The return type of the method 'Super.field1' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field1'.
-// Change to a subtype of 'int'.
-//   num field1 = 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:23:16: Context: This is the overridden method ('field1').
-//   abstract int field1;
-//                ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The return type of the method 'Class.field2' is 'String', which does not match the return type, 'num', of the overridden method, 'Super.field2'.
 // Change to a subtype of 'num'.
 //   abstract String field2;
@@ -21,17 +10,6 @@
 //   num field2 = 0;
 //       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field2' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: The return type of the method 'Super.field2' is 'num', which does not match the return type, 'String', of the overridden method, 'Class.field2'.
-// Change to a subtype of 'String'.
-//   num field2 = 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Context: This is the overridden method ('field2').
-//   abstract String field2;
-//                   ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The return type of the method 'Class.field2' is 'String', which does not match the return type, 'int', of the overridden method, 'Interface.field2'.
 // Change to a subtype of 'int'.
 //   abstract String field2;
@@ -56,17 +34,6 @@
 //   covariant int field2 = 0;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field3' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:8:7: Context: The return type of the method 'Super.field3' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field3'.
-// Change to a subtype of 'int'.
-//   num field3 = 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Context: This is the overridden method ('field3').
-//   abstract int field3;
-//                ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Error: The parameter '#externalFieldValue' of the method 'Class.field3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.field3'.
 // Change to a supertype of 'num', or, for a covariant parameter, a subtype.
 //   abstract int field3;
@@ -75,17 +42,6 @@
 //   num field3 = 0;
 //       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field4' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:10:17: Context: The return type of the method 'Super.field4' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field4'.
-// Change to a subtype of 'int'.
-//   covariant num field4 = 0;
-//                 ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:27:16: Context: This is the overridden method ('field4').
-//   abstract int field4;
-//                ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:28:16: Error: The return type of the method 'Class.field5' is 'num', which does not match the return type, 'int', of the overridden method, 'Super.field5'.
 // Change to a subtype of 'int'.
 //   abstract num field5;
@@ -102,6 +58,50 @@
 //   int field5 = 0;
 //       ^
 //
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field1' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:6:7: Context: The return type of the method 'Super.field1' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field1'.
+// Change to a subtype of 'int'.
+//   num field1 = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:23:16: Context: This is the overridden method ('field1').
+//   abstract int field1;
+//                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: The return type of the method 'Super.field2' is 'num', which does not match the return type, 'String', of the overridden method, 'Class.field2'.
+// Change to a subtype of 'String'.
+//   num field2 = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Context: This is the overridden method ('field2').
+//   abstract String field2;
+//                   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field3' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:8:7: Context: The return type of the method 'Super.field3' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field3'.
+// Change to a subtype of 'int'.
+//   num field3 = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Context: This is the overridden method ('field3').
+//   abstract int field3;
+//                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field4' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:10:17: Context: The return type of the method 'Super.field4' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field4'.
+// Change to a subtype of 'int'.
+//   covariant num field4 = 0;
+//                 ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:27:16: Context: This is the overridden method ('field4').
+//   abstract int field4;
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect
index 9e0138f..e46c242 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect
@@ -10,17 +10,6 @@
 //   void method2(num n) {}
 //        ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:22:7: Error: The implementation of 'method2' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:20: Context: The parameter 'n' of the method 'Super.method2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.method2'.
-// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
-//   void method2(num n) {}
-//                    ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:8: Context: This is the overridden method ('method2').
-//   void method2(String i);
-//        ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:23: Error: The parameter 'i' of the method 'Class.method2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.method2'.
 // Change to a supertype of 'int', or, for a covariant parameter, a subtype.
 //   void method2(String i);
@@ -37,6 +26,17 @@
 //   void method3(num n) {}
 //        ^
 //
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:22:7: Error: The implementation of 'method2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:20: Context: The parameter 'n' of the method 'Super.method2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.method2'.
+// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
+//   void method2(num n) {}
+//                    ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:8: Context: This is the overridden method ('method2').
+//   void method2(String i);
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect
index a58eb8f..a95406c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect
@@ -10,17 +10,6 @@
 //   void set setter2(num n) {}
 //            ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:22:7: Error: The implementation of 'setter2' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:24: Context: The parameter 'n' of the method 'Super.setter2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.setter2'.
-// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
-//   void set setter2(num n) {}
-//                        ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:12: Context: This is the overridden method ('setter2').
-//   void set setter2(String i);
-//            ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:27: Error: The parameter 'i' of the method 'Class.setter2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.setter2'.
 // Change to a supertype of 'int', or, for a covariant parameter, a subtype.
 //   void set setter2(String i);
@@ -37,6 +26,17 @@
 //   void set setter3(num n) {}
 //            ^
 //
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:22:7: Error: The implementation of 'setter2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:24: Context: The parameter 'n' of the method 'Super.setter2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.setter2'.
+// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
+//   void set setter2(num n) {}
+//                        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:12: Context: This is the overridden method ('setter2').
+//   void set setter2(String i);
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect
index 638bf6e..e9fa156 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect
@@ -3,16 +3,18 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1
-//  - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=
-//  - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2
-//  - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=
+//  - Interface1.extendedAbstractCovariantImplementedField
+//  - Interface1.extendedAbstractImplementedCovariantField
+//  - Interface1.implementsMultipleCovariantField1
+//  - Interface1.implementsMultipleCovariantField2
+//  - Interface2.implementsMultipleCovariantField1
+//  - Interface2.implementsMultipleCovariantField2
 //  - Super.extendedAbstractCovariantField
 //  - Super.extendedAbstractCovariantField=
+//  - Super.extendedAbstractCovariantImplementedField
+//  - Super.extendedAbstractCovariantImplementedField=
+//  - Super.extendedAbstractImplementedCovariantField
+//  - Super.extendedAbstractImplementedCovariantField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -21,38 +23,46 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+//   int extendedAbstractCovariantImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+//   covariant int extendedAbstractImplementedCovariantField = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
+//   covariant int implementsMultipleCovariantField1 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:30:7: Context: 'Interface1.implementsMultipleCovariantField2' is defined here.
+//   int implementsMultipleCovariantField2 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:34:7: Context: 'Interface2.implementsMultipleCovariantField1' is defined here.
+//   int implementsMultipleCovariantField1 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:36:17: Context: 'Interface2.implementsMultipleCovariantField2' is defined here.
+//   covariant int implementsMultipleCovariantField2 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField' is defined here.
 //   abstract covariant int extendedAbstractCovariantField;
 //                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField=' is defined here.
 //   abstract covariant int extendedAbstractCovariantField;
 //                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField=' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField=' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedField
+//  - Interface1.extendedAbstractImplementedCovariantField
 //  - Interface1.implementsMultipleCovariantField1
 //  - Interface1.implementsMultipleCovariantField2
 //  - Interface2.implementsMultipleCovariantField1
@@ -71,6 +81,12 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+//   int extendedAbstractCovariantImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+//   covariant int extendedAbstractImplementedCovariantField = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
 //   covariant int implementsMultipleCovariantField1 = 0;
 //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect
index 638bf6e..e9fa156 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect
@@ -3,16 +3,18 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1
-//  - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=
-//  - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2
-//  - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=
+//  - Interface1.extendedAbstractCovariantImplementedField
+//  - Interface1.extendedAbstractImplementedCovariantField
+//  - Interface1.implementsMultipleCovariantField1
+//  - Interface1.implementsMultipleCovariantField2
+//  - Interface2.implementsMultipleCovariantField1
+//  - Interface2.implementsMultipleCovariantField2
 //  - Super.extendedAbstractCovariantField
 //  - Super.extendedAbstractCovariantField=
+//  - Super.extendedAbstractCovariantImplementedField
+//  - Super.extendedAbstractCovariantImplementedField=
+//  - Super.extendedAbstractImplementedCovariantField
+//  - Super.extendedAbstractImplementedCovariantField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -21,38 +23,46 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+//   int extendedAbstractCovariantImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+//   covariant int extendedAbstractImplementedCovariantField = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
+//   covariant int implementsMultipleCovariantField1 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:30:7: Context: 'Interface1.implementsMultipleCovariantField2' is defined here.
+//   int implementsMultipleCovariantField2 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:34:7: Context: 'Interface2.implementsMultipleCovariantField1' is defined here.
+//   int implementsMultipleCovariantField1 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:36:17: Context: 'Interface2.implementsMultipleCovariantField2' is defined here.
+//   covariant int implementsMultipleCovariantField2 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField' is defined here.
 //   abstract covariant int extendedAbstractCovariantField;
 //                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField=' is defined here.
 //   abstract covariant int extendedAbstractCovariantField;
 //                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField=' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField=' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedField
+//  - Interface1.extendedAbstractImplementedCovariantField
 //  - Interface1.implementsMultipleCovariantField1
 //  - Interface1.implementsMultipleCovariantField2
 //  - Interface2.implementsMultipleCovariantField1
@@ -71,6 +81,12 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+//   int extendedAbstractCovariantImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+//   covariant int extendedAbstractImplementedCovariantField = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
 //   covariant int implementsMultipleCovariantField1 = 0;
 //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect
index a4f6917..e15c8ba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect
@@ -3,11 +3,15 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1
-//  - AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod
+//  - Interface1.extendedAbstractCovariantImplementedMethod
+//  - Interface1.extendedAbstractImplementedCovariantMethod
+//  - Interface1.implementsMultipleCovariantMethod1
+//  - Interface1.implementsMultipleCovariantMethod2
+//  - Interface2.implementsMultipleCovariantMethod1
+//  - Interface2.implementsMultipleCovariantMethod2
+//  - Super.extendedAbstractCovariantImplementedMethod
 //  - Super.extendedAbstractCovariantMethod
+//  - Super.extendedAbstractImplementedCovariantMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:30:8: Context: 'Interface1.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:34:8: Context: 'Interface2.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:36:8: Context: 'Interface2.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:12:8: Context: 'Super.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(covariant int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:8:8: Context: 'Super.extendedAbstractCovariantMethod' is defined here.
 //   void extendedAbstractCovariantMethod(covariant int i);
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:16:8: Context: 'Super.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedMethod
+//  - Interface1.extendedAbstractImplementedCovariantMethod
 //  - Interface1.implementsMultipleCovariantMethod1
 //  - Interface1.implementsMultipleCovariantMethod2
 //  - Interface2.implementsMultipleCovariantMethod1
@@ -48,6 +66,12 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
 //   void implementsMultipleCovariantMethod1(covariant int i) {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect
index a4f6917..e15c8ba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect
@@ -3,11 +3,15 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1
-//  - AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod
+//  - Interface1.extendedAbstractCovariantImplementedMethod
+//  - Interface1.extendedAbstractImplementedCovariantMethod
+//  - Interface1.implementsMultipleCovariantMethod1
+//  - Interface1.implementsMultipleCovariantMethod2
+//  - Interface2.implementsMultipleCovariantMethod1
+//  - Interface2.implementsMultipleCovariantMethod2
+//  - Super.extendedAbstractCovariantImplementedMethod
 //  - Super.extendedAbstractCovariantMethod
+//  - Super.extendedAbstractImplementedCovariantMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:30:8: Context: 'Interface1.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:34:8: Context: 'Interface2.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:36:8: Context: 'Interface2.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:12:8: Context: 'Super.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(covariant int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:8:8: Context: 'Super.extendedAbstractCovariantMethod' is defined here.
 //   void extendedAbstractCovariantMethod(covariant int i);
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:16:8: Context: 'Super.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedMethod
+//  - Interface1.extendedAbstractImplementedCovariantMethod
 //  - Interface1.implementsMultipleCovariantMethod1
 //  - Interface1.implementsMultipleCovariantMethod2
 //  - Interface2.implementsMultipleCovariantMethod1
@@ -48,6 +66,12 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
 //   void implementsMultipleCovariantMethod1(covariant int i) {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect
index 5aca172..bb95986 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect
@@ -3,11 +3,15 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==
-//  - AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==
+//  - Interface1.extendedAbstractCovariantImplementedSetter=
+//  - Interface1.extendedAbstractImplementedCovariantSetter=
+//  - Interface1.implementsMultipleCovariantSetter1=
+//  - Interface1.implementsMultipleCovariantSetter2=
+//  - Interface2.implementsMultipleCovariantSetter1=
+//  - Interface2.implementsMultipleCovariantSetter2=
+//  - Super.extendedAbstractCovariantImplementedSetter=
 //  - Super.extendedAbstractCovariantSetter=
+//  - Super.extendedAbstractImplementedCovariantSetter=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:30:12: Context: 'Interface1.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:34:12: Context: 'Interface2.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:36:12: Context: 'Interface2.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:12:12: Context: 'Super.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(covariant int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:8:12: Context: 'Super.extendedAbstractCovariantSetter=' is defined here.
 //   void set extendedAbstractCovariantSetter(covariant int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedSetter=
+//  - Interface1.extendedAbstractImplementedCovariantSetter=
 //  - Interface1.implementsMultipleCovariantSetter1=
 //  - Interface1.implementsMultipleCovariantSetter2=
 //  - Interface2.implementsMultipleCovariantSetter1=
@@ -48,6 +66,12 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
 //   void set implementsMultipleCovariantSetter1(covariant int i) {}
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect
index 5aca172..bb95986 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect
@@ -3,11 +3,15 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==
-//  - AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==
-//  - AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==
-//  - AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==
+//  - Interface1.extendedAbstractCovariantImplementedSetter=
+//  - Interface1.extendedAbstractImplementedCovariantSetter=
+//  - Interface1.implementsMultipleCovariantSetter1=
+//  - Interface1.implementsMultipleCovariantSetter2=
+//  - Interface2.implementsMultipleCovariantSetter1=
+//  - Interface2.implementsMultipleCovariantSetter2=
+//  - Super.extendedAbstractCovariantImplementedSetter=
 //  - Super.extendedAbstractCovariantSetter=
+//  - Super.extendedAbstractImplementedCovariantSetter=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:30:12: Context: 'Interface1.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:34:12: Context: 'Interface2.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:36:12: Context: 'Interface2.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:12:12: Context: 'Super.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(covariant int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:8:12: Context: 'Super.extendedAbstractCovariantSetter=' is defined here.
 //   void set extendedAbstractCovariantSetter(covariant int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedSetter=
+//  - Interface1.extendedAbstractImplementedCovariantSetter=
 //  - Interface1.implementsMultipleCovariantSetter1=
 //  - Interface1.implementsMultipleCovariantSetter2=
 //  - Interface2.implementsMultipleCovariantSetter1=
@@ -48,6 +66,12 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
 //   void set implementsMultipleCovariantSetter1(covariant int i) {}
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect
index 613c55c..894fe23 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect
@@ -2,28 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedGetterMixedInField'.
-// abstract class Class extends Super
-//                ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: The return type of the method 'Mixin.extendedGetterMixedInField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterMixedInField'.
-// Change to a subtype of 'String'.
-//   int extendedGetterMixedInField = 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is the overridden method ('extendedGetterMixedInField').
-//   String get extendedGetterMixedInField => '';
-//              ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Class 'Super with Mixin' inherits multiple members named 'extendedGetterMixedInField' with incompatible signatures.
-// Try adding a declaration of 'extendedGetterMixedInField' to 'Super with Mixin'.
-// abstract class Class extends Super
-//                ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: This is one of the overridden members.
-//   int extendedGetterMixedInField = 0;
-//       ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is one of the overridden members.
-//   String get extendedGetterMixedInField => '';
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the getter 'Super with Mixin.extendedSetterMixedInField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterMixedInField'.
 // abstract class Class extends Super
 //                ^^^^^^^^^^^^^^^^^^^^...
@@ -52,12 +30,15 @@
 //   final String extendedFieldMixedInSetter = '';
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:90:7: Error: The return type of the method 'Class.extendedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterDeclaredField'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedGetterMixedInField'.
+// abstract class Class extends Super
+//                ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: The return type of the method 'Mixin.extendedGetterMixedInField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterMixedInField'.
 // Change to a subtype of 'String'.
-//   int extendedGetterDeclaredField = 0;
+//   int extendedGetterMixedInField = 0;
 //       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:6:14: Context: This is the overridden method ('extendedGetterDeclaredField').
-//   String get extendedGetterDeclaredField => '';
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is the overridden method ('extendedGetterMixedInField').
+//   String get extendedGetterMixedInField => '';
 //              ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:93:16: Error: The type 'String' of the field 'Class.extendedSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterDeclaredField'.
@@ -74,14 +55,6 @@
 //   void set extendedSetterDeclaredGetter(int value) {}
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:96:7: Error: The return type of the method 'Class.mixedInGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super with Mixin.mixedInGetterDeclaredField'.
-// Change to a subtype of 'String'.
-//   int mixedInGetterDeclaredField = 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the overridden method ('mixedInGetterDeclaredField').
-// abstract class Class extends Super
-//                ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:99:16: Error: The type 'String' of the field 'Class.mixedInSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.mixedInSetterDeclaredField'.
 //   final String mixedInSetterDeclaredField = '';
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -96,14 +69,6 @@
 // abstract class Class extends Super
 //                ^^^^^^^^^^^^^^^^^^^^...
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:102:7: Error: The return type of the method 'Class.implementedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Interface1.implementedGetterDeclaredField'.
-// Change to a subtype of 'String'.
-//   int implementedGetterDeclaredField = 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:63:14: Context: This is the overridden method ('implementedGetterDeclaredField').
-//   String get implementedGetterDeclaredField => '';
-//              ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:105:16: Error: The type 'String' of the field 'Class.implementedSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Interface1.implementedSetterDeclaredField'.
 //   final String implementedSetterDeclaredField = '';
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -198,9 +163,9 @@
 // Try adding a declaration of 'Mixin.mixedInGetterImplementedField' to 'Class'.
 // abstract class Class extends Super
 //                ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is one of the overridden members.
-// abstract class Class extends Super
-//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:35:14: Context: This is one of the overridden members.
+//   String get mixedInGetterImplementedField => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:57:7: Context: This is one of the overridden members.
 //   int mixedInGetterImplementedField = 0;
 //       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -397,6 +362,30 @@
 //   void set implementedSetterImplementedGetter(int value) {}
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:90:7: Error: The return type of the method 'Class.extendedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterDeclaredField'.
+// Change to a subtype of 'String'.
+//   int extendedGetterDeclaredField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:6:14: Context: This is the overridden method ('extendedGetterDeclaredField').
+//   String get extendedGetterDeclaredField => '';
+//              ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:96:7: Error: The return type of the method 'Class.mixedInGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super with Mixin.mixedInGetterDeclaredField'.
+// Change to a subtype of 'String'.
+//   int mixedInGetterDeclaredField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the overridden method ('mixedInGetterDeclaredField').
+// abstract class Class extends Super
+//                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:102:7: Error: The return type of the method 'Class.implementedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Interface1.implementedGetterDeclaredField'.
+// Change to a subtype of 'String'.
+//   int implementedGetterDeclaredField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:63:14: Context: This is the overridden method ('implementedGetterDeclaredField').
+//   String get implementedGetterDeclaredField => '';
+//              ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -505,6 +494,8 @@
     return super.{self::Mixin::mixedInGetterDeclaredSetter};
   mixin-super-stub get mixedInFieldDeclaredSetter() → core::String
     return super.{self::Mixin::mixedInFieldDeclaredSetter};
+  mixin-super-stub get extendedGetterMixedInField() → core::int
+    return super.{self::Mixin::extendedGetterMixedInField};
   mixin-super-stub set extendedGetterMixedInField(core::int value) → void
     return super.{self::Mixin::extendedGetterMixedInField} = value;
   mixin-super-stub get extendedSetterMixedInField() → core::String
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect
index 46a2aa3..4701040 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect
@@ -29,10 +29,12 @@
 //       ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
-//  - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=
 //  - AbstractClass.declareAbstractImplementMultipleField
 //  - AbstractClass.declareAbstractImplementMultipleField=
+//  - Interface1.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.declareAbstractImplementMultipleField
+//  - Interface2.implementMultipleField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -41,18 +43,24 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
 //   abstract int declareAbstractImplementMultipleField;
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField=' is defined here.
 //   abstract int declareAbstractImplementMultipleField;
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:10:7: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+//   int declareAbstractImplementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:6:7: Context: 'Interface1.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:18:7: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+//   int declareAbstractImplementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:14:7: Context: 'Interface2.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect
index 46a2aa3..4701040 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect
@@ -29,10 +29,12 @@
 //       ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
-//  - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=
 //  - AbstractClass.declareAbstractImplementMultipleField
 //  - AbstractClass.declareAbstractImplementMultipleField=
+//  - Interface1.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.declareAbstractImplementMultipleField
+//  - Interface2.implementMultipleField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -41,18 +43,24 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
 //   abstract int declareAbstractImplementMultipleField;
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField=' is defined here.
 //   abstract int declareAbstractImplementMultipleField;
 //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:10:7: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+//   int declareAbstractImplementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:6:7: Context: 'Interface1.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:18:7: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+//   int declareAbstractImplementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:14:7: Context: 'Interface2.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect
index eef1c6c..5ebd497f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect
@@ -25,8 +25,11 @@
 //             ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
 //  - AbstractClass.declareAbstractImplementMultipleField
+//  - Interface1.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.declareAbstractImplementMultipleField
+//  - Interface2.implementMultipleField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:30:22: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
 //   abstract final int declareAbstractImplementMultipleField;
 //                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:10:13: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+//   final int declareAbstractImplementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:18:13: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+//   final int declareAbstractImplementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect
index eef1c6c..5ebd497f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
 //             ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
 //  - AbstractClass.declareAbstractImplementMultipleField
+//  - Interface1.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.declareAbstractImplementMultipleField
+//  - Interface2.implementMultipleField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:30:22: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
 //   abstract final int declareAbstractImplementMultipleField;
 //                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:10:13: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+//   final int declareAbstractImplementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:18:13: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+//   final int declareAbstractImplementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect
index 0083177..538cee7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect
@@ -25,8 +25,11 @@
 //           ^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter
 //  - AbstractClass.declareAbstractImplementMultipleGetter
+//  - Interface1.declareAbstractImplementMultipleGetter
+//  - Interface1.implementMultipleGetter
+//  - Interface2.declareAbstractImplementMultipleGetter
+//  - Interface2.implementMultipleGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:30:11: Context: 'AbstractClass.declareAbstractImplementMultipleGetter' is defined here.
 //   int get declareAbstractImplementMultipleGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:10:11: Context: 'Interface1.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:6:11: Context: 'Interface1.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:18:11: Context: 'Interface2.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:14:11: Context: 'Interface2.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect
index 0083177..538cee7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
 //           ^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter
 //  - AbstractClass.declareAbstractImplementMultipleGetter
+//  - Interface1.declareAbstractImplementMultipleGetter
+//  - Interface1.implementMultipleGetter
+//  - Interface2.declareAbstractImplementMultipleGetter
+//  - Interface2.implementMultipleGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:30:11: Context: 'AbstractClass.declareAbstractImplementMultipleGetter' is defined here.
 //   int get declareAbstractImplementMultipleGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:10:11: Context: 'Interface1.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:6:11: Context: 'Interface1.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:18:11: Context: 'Interface2.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:14:11: Context: 'Interface2.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect
index 3bbc542..66a5d5e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect
@@ -25,8 +25,11 @@
 //        ^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod
 //  - AbstractClass.declareAbstractImplementMultipleMethod
+//  - Interface1.declareAbstractImplementMultipleMethod
+//  - Interface1.implementMultipleMethod
+//  - Interface2.declareAbstractImplementMultipleMethod
+//  - Interface2.implementMultipleMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:30:8: Context: 'AbstractClass.declareAbstractImplementMultipleMethod' is defined here.
 //   void declareAbstractImplementMultipleMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:10:8: Context: 'Interface1.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:6:8: Context: 'Interface1.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:18:8: Context: 'Interface2.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:14:8: Context: 'Interface2.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect
index 3bbc542..66a5d5e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
 //        ^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod
 //  - AbstractClass.declareAbstractImplementMultipleMethod
+//  - Interface1.declareAbstractImplementMultipleMethod
+//  - Interface1.implementMultipleMethod
+//  - Interface2.declareAbstractImplementMultipleMethod
+//  - Interface2.implementMultipleMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:30:8: Context: 'AbstractClass.declareAbstractImplementMultipleMethod' is defined here.
 //   void declareAbstractImplementMultipleMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:10:8: Context: 'Interface1.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:6:8: Context: 'Interface1.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:18:8: Context: 'Interface2.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:14:8: Context: 'Interface2.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect
index 773632f..c960de6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect
@@ -25,8 +25,11 @@
 //            ^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==
 //  - AbstractClass.declareAbstractImplementMultipleSetter=
+//  - Interface1.declareAbstractImplementMultipleSetter=
+//  - Interface1.implementMultipleSetter=
+//  - Interface2.declareAbstractImplementMultipleSetter=
+//  - Interface2.implementMultipleSetter=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:30:12: Context: 'AbstractClass.declareAbstractImplementMultipleSetter=' is defined here.
 //   void set declareAbstractImplementMultipleSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:10:12: Context: 'Interface1.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:6:12: Context: 'Interface1.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:18:12: Context: 'Interface2.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:14:12: Context: 'Interface2.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect
index 773632f..c960de6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
 //            ^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==
 //  - AbstractClass.declareAbstractImplementMultipleSetter=
+//  - Interface1.declareAbstractImplementMultipleSetter=
+//  - Interface1.implementMultipleSetter=
+//  - Interface2.declareAbstractImplementMultipleSetter=
+//  - Interface2.implementMultipleSetter=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:30:12: Context: 'AbstractClass.declareAbstractImplementMultipleSetter=' is defined here.
 //   void set declareAbstractImplementMultipleSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:10:12: Context: 'Interface1.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:6:12: Context: 'Interface1.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:18:12: Context: 'Interface2.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:14:12: Context: 'Interface2.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect
index 995b5ba..350fd3f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect
@@ -5,43 +5,32 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
 // class Class /* error */ extends LegacyClass implements SuperQ {
 //       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyClass.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
 //   int optionalArgumentsMethod(int i) => i;
 //       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:9:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyClass extends Super implements SuperExtra {}
-//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
 // class ClassQ /* error */ extends LegacyClassQ implements Super {
 //       ^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyClassQ.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
 //   int? optionalArgumentsMethod(int? i) => i;
 //        ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:11:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyClassQ extends SuperQ implements SuperExtra {}
-//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
 // class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
 //       ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyMixedIn.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
 //   int optionalArgumentsMethod(int i) => i;
 //       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:13:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyMixedIn with Super implements SuperExtra {}
-//                ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'nullabilityMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
-// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
-//       ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:6:29: Context: The parameter 'i' of the method 'Object with Super.nullabilityMethod' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'SuperQ.nullabilityMethod'.
-// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
-//   int nullabilityMethod(int i, {required int j}) => i;
-//                             ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:17:8: Context: This is the overridden method ('nullabilityMethod').
-//   int? nullabilityMethod(int? i, {int? j}) => i;
-//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: Class 'ClassMixedIn' inherits multiple members named 'nullabilityMethod' with incompatible signatures.
 // Try adding a declaration of 'nullabilityMethod' to 'ClassMixedIn'.
@@ -54,36 +43,14 @@
 //   int? nullabilityMethod(int? i, {int? j}) => i;
 //        ^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'nullabilitySetter' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
-// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
-//       ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:8:34: Context: The parameter 'value' of the method 'Object with Super.nullabilitySetter' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'SuperQ.nullabilitySetter'.
-// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
-//   void set nullabilitySetter(int value) {}
-//                                  ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:19:12: Context: This is the overridden method ('nullabilitySetter').
-//   void set nullabilitySetter(int? value) {}
-//            ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
 // class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
 //       ^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyMixedInQ.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
 //   int? optionalArgumentsMethod(int? i) => i;
 //        ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:15:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
-//                ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'nullabilityMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
-// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
-//       ^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:17:8: Context: The return type of the method 'Object with SuperQ.nullabilityMethod' is 'int?', which does not match the return type, 'int', of the overridden method, 'Super.nullabilityMethod'.
-// Change to a subtype of 'int'.
-//   int? nullabilityMethod(int? i, {int? j}) => i;
-//        ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:6:7: Context: This is the overridden method ('nullabilityMethod').
-//   int nullabilityMethod(int i, {required int j}) => i;
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
 //       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: Class 'ClassMixedInQ' inherits multiple members named 'nullabilityMethod' with incompatible signatures.
@@ -97,51 +64,16 @@
 //   int nullabilityMethod(int i, {required int j}) => i;
 //       ^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'nullabilityGetter' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
-// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
-//       ^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:18:12: Context: The return type of the method 'Object with SuperQ.nullabilityGetter' is 'int?', which does not match the return type, 'int', of the overridden method, 'Super.nullabilityGetter'.
-// Change to a subtype of 'int'.
-//   int? get nullabilityGetter => null;
-//            ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:7:11: Context: This is the overridden method ('nullabilityGetter').
-//   int get nullabilityGetter => 0;
-//           ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
-//     i = super.nullabilityMethod(null); // ok
-//                                ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-//     i = super.optionalArgumentsMethod(null); // ok
-//                                       ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-//     super.nullabilitySetter = null; // ok
-//                               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityMethod(null); // ok
-//               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.optionalArgumentsMethod(null); // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityGetter; // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
 //     nullabilitySetter = null; // error
 //                         ^
@@ -150,40 +82,16 @@
 //     var v1 = nullabilityMethod(null); // ok
 //                               ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:65:32: Error: Required named parameter 'j' must be provided.
-//     i = super.nullabilityMethod(null); // ok
-//                                ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:69:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-//     i = super.optionalArgumentsMethod(null); // ok
-//                                       ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:79:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-//     super.nullabilitySetter = null; // ok
-//                               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:90:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityMethod(null); // ok
-//               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:94:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.optionalArgumentsMethod(null); // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:100:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityGetter; // ok
-//               ^
-//
 import self as self;
 import "in_out_in_lib2.dart" as in_;
 import "in_out_in_lib1.dart" as in_2;
@@ -199,23 +107,17 @@
   method test() → dynamic {
     core::int i;
     core::int? v1 = this.{self::Class::nullabilityMethod}(null);
-    i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
-    i = super.nullabilityMethod(null); // ok
-                               ^" in super.{in_2::Super::nullabilityMethod}(null);
+    i = super.{in_2::Super::nullabilityMethod}(null);
     i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null);
-    i = super.{in_2::Super::optionalArgumentsMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-    i = super.optionalArgumentsMethod(null); // ok
-                                      ^" in null as{TypeError,ForNonNullableByDefault} core::int);
-    let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_2::Super::optionalArgumentsMethod}(null);
+    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
     core::int? v2 = this.{self::Class::nullabilityGetter};
     i = super.{in_2::Super::nullabilityGetter};
     this.{self::Class::nullabilitySetter} = null;
-    super.{in_2::Super::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-    super.nullabilitySetter = null; // ok
-                              ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_2::Super::nullabilitySetter} = null;
   }
   abstract member-signature method nullabilityMethod(core::int? i, {core::int? j = #C1}) → core::int?; -> in_2::Super::nullabilityMethod
   abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
@@ -237,22 +139,16 @@
   method test() → dynamic {
     core::int i;
     this.{in_::LegacyClassQ::nullabilityMethod}(null);
-    i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityMethod(null); // ok
-              ^" in super.{in_2::SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+    i = super.{in_2::SuperQ::nullabilityMethod}(null);
     i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null);
-    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.optionalArgumentsMethod(null); // ok
-              ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
-    let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+    let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
     i = this.{self::ClassQ::nullabilityGetter};
-    i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityGetter; // ok
-              ^" in super.{in_2::SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
-    this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    i = super.{in_2::SuperQ::nullabilityGetter};
+    this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
     nullabilitySetter = null; // error
                         ^" in null as{TypeError,ForNonNullableByDefault} core::int;
     super.{in_2::SuperQ::nullabilitySetter} = null;
@@ -275,26 +171,20 @@
     ;
   method test() → dynamic {
     core::int i;
-    invalid-type v1 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:63:31: Error: Required named parameter 'j' must be provided.
+    invalid-type v1 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:63:31: Error: Required named parameter 'j' must be provided.
     var v1 = nullabilityMethod(null); // ok
                               ^" in this.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
-    i = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:65:32: Error: Required named parameter 'j' must be provided.
-    i = super.nullabilityMethod(null); // ok
-                               ^" in super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
     i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null);
-    i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:69:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-    i = super.optionalArgumentsMethod(null); // ok
-                                      ^" in null as{TypeError,ForNonNullableByDefault} core::int);
-    let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
+    let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
     core::int v2 = this.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
     i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
     this.{self::ClassMixedIn::nullabilitySetter} = null;
-    super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:79:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-    super.nullabilitySetter = null; // ok
-                              ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = null;
   }
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -314,21 +204,15 @@
   method test() → dynamic {
     core::int i;
     this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
-    i = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:90:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityMethod(null); // ok
-              ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
     i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null);
-    i = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:94:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.optionalArgumentsMethod(null); // ok
-              ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
-    let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
+    let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
     i = this.{self::ClassMixedInQ::nullabilityGetter};
-    i = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:100:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityGetter; // ok
-              ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
     this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
     super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
   }
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect
index d8b7132..8700bf7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect
@@ -2,40 +2,56 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
-//     i = super.nullabilityMethod(null); // ok
-//                                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int optionalArgumentsMethod(int i) => i;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-//     i = super.optionalArgumentsMethod(null); // ok
-//                                       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+//       ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int? optionalArgumentsMethod(int? i) => i;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib2.dart:13:16: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedIn with Super implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib2.dart:15:16: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-//     super.nullabilitySetter = null; // ok
-//                               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityMethod(null); // ok
-//               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.optionalArgumentsMethod(null); // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityGetter; // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
 //     nullabilitySetter = null; // error
 //                         ^
@@ -69,23 +85,17 @@
   method test() → dynamic {
     core::int i;
     core::int? v1 = this.{self::Class::nullabilityMethod}(null);
-    i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
-    i = super.nullabilityMethod(null); // ok
-                               ^" in super.{in_2::Super::nullabilityMethod}(null);
+    i = super.{in_2::Super::nullabilityMethod}(null);
     i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null);
-    i = super.{in_2::Super::optionalArgumentsMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-    i = super.optionalArgumentsMethod(null); // ok
-                                      ^" in null as{TypeError,ForNonNullableByDefault} core::int);
-    let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_2::Super::optionalArgumentsMethod}(null);
+    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
     core::int? v2 = this.{self::Class::nullabilityGetter};
     i = super.{in_2::Super::nullabilityGetter};
     this.{self::Class::nullabilitySetter} = null;
-    super.{in_2::Super::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-    super.nullabilitySetter = null; // ok
-                              ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_2::Super::nullabilitySetter} = null;
   }
   abstract member-signature method nullabilityMethod(core::int? i, {core::int? j}) → core::int?; -> in_2::Super::nullabilityMethod
   abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
@@ -107,22 +117,16 @@
   method test() → dynamic {
     core::int i;
     this.{in_::LegacyClassQ::nullabilityMethod}(null);
-    i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityMethod(null); // ok
-              ^" in super.{in_2::SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+    i = super.{in_2::SuperQ::nullabilityMethod}(null);
     i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null);
-    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.optionalArgumentsMethod(null); // ok
-              ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
-    let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+    let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
     i = this.{self::ClassQ::nullabilityGetter};
-    i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityGetter; // ok
-              ^" in super.{in_2::SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
-    this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    i = super.{in_2::SuperQ::nullabilityGetter};
+    this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
     nullabilitySetter = null; // error
                         ^" in null as{TypeError,ForNonNullableByDefault} core::int;
     super.{in_2::SuperQ::nullabilitySetter} = null;
@@ -149,7 +153,7 @@
     i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
     i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null);
     i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
-    let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
@@ -181,13 +185,13 @@
     i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
     i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null);
     i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
-    let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
     i = this.{self::ClassMixedInQ::nullabilityGetter};
     i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
-    this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
     nullabilitySetter = null; // error
                         ^" in null as{TypeError,ForNonNullableByDefault} core::int;
     super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
@@ -261,8 +265,6 @@
     return super.{in_2::Super::nullabilityGetter};
   mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
     return super.{in_2::Super::optionalArgumentsMethod}(i);
-  mixin-super-stub set nullabilitySetter(core::int* value) → void
-    return super.{in_2::Super::nullabilitySetter} = value;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -273,6 +275,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::Super::nullabilitySetter} = value;
 }
 abstract class LegacyMixedIn extends in_::_LegacyMixedIn&Object&Super implements in_2::SuperExtra {
   synthetic constructor •() → in_::LegacyMixedIn*
@@ -290,8 +294,6 @@
     return super.{in_2::SuperQ::nullabilityGetter};
   mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
     return super.{in_2::SuperQ::optionalArgumentsMethod}(i);
-  mixin-super-stub set nullabilitySetter(core::int* value) → void
-    return super.{in_2::SuperQ::nullabilitySetter} = value;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -302,6 +304,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::SuperQ::nullabilitySetter} = value;
 }
 abstract class LegacyMixedInQ extends in_::_LegacyMixedInQ&Object&SuperQ implements in_2::SuperExtra {
   synthetic constructor •() → in_::LegacyMixedInQ*
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect
index fac4e38..68209cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect
@@ -2,44 +2,60 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:15:33: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-//     i = super.nullabilityMethod(null); // ok
-//                                 ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int optionalArgumentsMethod(int i) => i;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-//     i = super.optionalArgumentsMethod(null); // ok
-//                                       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+//       ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int? optionalArgumentsMethod(int? i) => i;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib2.dart:13:16: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedIn with Super implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib2.dart:15:16: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-//     super.nullabilitySetter = null; // ok
-//                               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
 //     nullabilityMethod(null); // error
 //                       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityMethod(null); // ok
-//               ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.optionalArgumentsMethod(null); // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //     super.optionalArgumentsMethod(null, null); // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-//     i = super.nullabilityGetter; // ok
-//               ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
 //     nullabilitySetter = null; // error
 //                         ^
@@ -77,23 +93,17 @@
   method test() → dynamic {
     core::int i;
     core::int? v1 = this.{self::Class::nullabilityMethod}(null);
-    i = super.{in_2::Super::nullabilityMethod}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:15:33: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-    i = super.nullabilityMethod(null); // ok
-                                ^" in null as{TypeError,ForNonNullableByDefault} core::int);
+    i = super.{in_2::Super::nullabilityMethod}(null);
     i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null);
-    i = super.{in_2::Super::optionalArgumentsMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-    i = super.optionalArgumentsMethod(null); // ok
-                                      ^" in null as{TypeError,ForNonNullableByDefault} core::int);
-    let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_2::Super::optionalArgumentsMethod}(null);
+    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
     core::int? v2 = this.{self::Class::nullabilityGetter};
     i = super.{in_2::Super::nullabilityGetter};
     this.{self::Class::nullabilitySetter} = null;
-    super.{in_2::Super::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-    super.nullabilitySetter = null; // ok
-                              ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_2::Super::nullabilitySetter} = null;
   }
   abstract member-signature method nullabilityMethod(core::int? i) → core::int?; -> in_2::Super::nullabilityMethod
   abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
@@ -114,25 +124,19 @@
     ;
   method test() → dynamic {
     core::int i;
-    this.{self::ClassQ::nullabilityMethod}(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+    this.{self::ClassQ::nullabilityMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
     nullabilityMethod(null); // error
                       ^" in null as{TypeError,ForNonNullableByDefault} core::int);
-    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityMethod(null); // ok
-              ^" in super.{in_2::SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+    i = super.{in_2::SuperQ::nullabilityMethod}(null);
     i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null);
-    i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.optionalArgumentsMethod(null); // ok
-              ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
-    let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+    let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
     i = this.{self::ClassQ::nullabilityGetter};
-    i = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-    i = super.nullabilityGetter; // ok
-              ^" in super.{in_2::SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
-    this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    i = super.{in_2::SuperQ::nullabilityGetter};
+    this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
     nullabilitySetter = null; // error
                         ^" in null as{TypeError,ForNonNullableByDefault} core::int;
     super.{in_2::SuperQ::nullabilitySetter} = null;
@@ -160,7 +164,7 @@
     i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
     i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null);
     i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
-    let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
@@ -188,19 +192,19 @@
     ;
   method test() → dynamic {
     core::int i;
-    this.{self::ClassMixedInQ::nullabilityMethod}(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:88:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+    this.{self::ClassMixedInQ::nullabilityMethod}(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:88:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
     nullabilityMethod(null); // error
                       ^" in null as{TypeError,ForNonNullableByDefault} core::int);
     i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
     i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null);
     i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
-    let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+    let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
     super.optionalArgumentsMethod(null, null); // error
                                  ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
     i = this.{self::ClassMixedInQ::nullabilityGetter};
     i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
-    this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
     nullabilitySetter = null; // error
                         ^" in null as{TypeError,ForNonNullableByDefault} core::int;
     super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
@@ -311,8 +315,6 @@
     return super.{in_2::Super::nullabilityGetter};
   mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
     return super.{in_2::Super::optionalArgumentsMethod}(i);
-  mixin-super-stub set nullabilitySetter(core::int* value) → void
-    return super.{in_2::Super::nullabilitySetter} = value;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -323,6 +325,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::Super::nullabilitySetter} = value;
 }
 abstract class LegacyMixedIn extends in_::_LegacyMixedIn&Object&Super implements in_2::SuperExtra {
   synthetic constructor •() → in_::LegacyMixedIn*
@@ -340,8 +344,6 @@
     return super.{in_2::SuperQ::nullabilityGetter};
   mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
     return super.{in_2::SuperQ::optionalArgumentsMethod}(i);
-  mixin-super-stub set nullabilitySetter(core::int* value) → void
-    return super.{in_2::SuperQ::nullabilitySetter} = value;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -352,6 +354,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::SuperQ::nullabilitySetter} = value;
 }
 abstract class LegacyMixedInQ extends in_::_LegacyMixedInQ&Object&SuperQ implements in_2::SuperExtra {
   synthetic constructor •() → in_::LegacyMixedInQ*
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect
index d5e1037..4124088 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect
@@ -3,8 +3,11 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
-//  - Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod
-//  - Interface2.Super.extendedMethod%Interface2.extendedMethod
+//  - Interface2.extendedMethod
+//  - Interface2.mixedInMethod
+//  - Mixin.mixedInMethod
+//  - Super with Mixin.mixedInMethod
+//  - Super.extendedMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -13,12 +16,65 @@
 //
 // class ClassImplements implements Interface2 {}
 //       ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Super.extendedMethod%Interface2.extendedMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: 'Interface2.extendedMethod' is defined here.
+//   int extendedMethod();
+//       ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: 'Interface2.mixedInMethod' is defined here.
+//   int mixedInMethod();
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Mixin.mixedInMethod' is defined here.
+//   num mixedInMethod() => 0;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Super with Mixin.mixedInMethod' is defined here.
+//   num mixedInMethod() => 0;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: 'Super.extendedMethod' is defined here.
+//   num extendedMethod() => 0;
+//       ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassDeclaresExtends' does not conform to its interface.
 // class ClassDeclaresExtends extends Super with Mixin {
@@ -64,50 +120,6 @@
 //   int mixedInMethod();
 //       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
-// class ClassExtends extends Super with Mixin implements Interface1 {}
-//       ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-//   num extendedMethod() => 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-//   int extendedMethod();
-//       ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
-// class ClassExtendsWithNoSuchMethod extends Super
-//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-//   num extendedMethod() => 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-//   int extendedMethod();
-//       ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-//       ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.extendedMethod'.
-// Change to a subtype of 'int'.
-//   num extendedMethod() => 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: This is the overridden method ('extendedMethod').
-//   int extendedMethod();
-//       ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-//       ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.mixedInMethod'.
-// Change to a subtype of 'int'.
-// abstract class Interface2 extends Super with Mixin {
-//                ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: This is the overridden method ('mixedInMethod').
-//   int mixedInMethod();
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect
index 92e7e34..b0ede7c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect
@@ -3,8 +3,11 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
-//  - Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod
-//  - Interface2.Super.extendedMethod%Interface2.extendedMethod
+//  - Interface2.extendedMethod
+//  - Interface2.mixedInMethod
+//  - Mixin.mixedInMethod
+//  - Super with Mixin.mixedInMethod
+//  - Super.extendedMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -13,12 +16,65 @@
 //
 // class ClassImplements implements Interface2 {}
 //       ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Super.extendedMethod%Interface2.extendedMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: 'Interface2.extendedMethod' is defined here.
+//   int extendedMethod();
+//       ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: 'Interface2.mixedInMethod' is defined here.
+//   int mixedInMethod();
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Mixin.mixedInMethod' is defined here.
+//   num mixedInMethod() => 0;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Super with Mixin.mixedInMethod' is defined here.
+//   num mixedInMethod() => 0;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: 'Super.extendedMethod' is defined here.
+//   num extendedMethod() => 0;
+//       ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassDeclaresExtends' does not conform to its interface.
 // class ClassDeclaresExtends extends Super with Mixin {
@@ -64,50 +120,6 @@
 //   int mixedInMethod();
 //       ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
-// class ClassExtends extends Super with Mixin implements Interface1 {}
-//       ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-//   num extendedMethod() => 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-//   int extendedMethod();
-//       ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
-// class ClassExtendsWithNoSuchMethod extends Super
-//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-//   num extendedMethod() => 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-//   int extendedMethod();
-//       ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-//       ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.extendedMethod'.
-// Change to a subtype of 'int'.
-//   num extendedMethod() => 0;
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: This is the overridden method ('extendedMethod').
-//   int extendedMethod();
-//       ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-//       ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.mixedInMethod'.
-// Change to a subtype of 'int'.
-// abstract class Interface2 extends Super with Mixin {
-//                ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: This is the overridden method ('mixedInMethod').
-//   int mixedInMethod();
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect
index b334412..f789cb9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect
@@ -3,10 +3,12 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:11:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementedMethod
-//  - AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod
-//  - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-//  - AbstractClass.Super.extendedAbstractMethod
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.implementedMethod
+//  - Interface1.implementedMultipleMethod
+//  - Interface2.implementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -15,20 +17,27 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
+//   void implementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:22:8: Context: 'Interface1.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:26:8: Context: 'Interface2.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:13:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
 //  - Interface1.implementedMethod
 //  - Interface1.implementedMultipleMethod
 //  - Interface2.implementedMultipleMethod
@@ -42,6 +51,9 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
 //   void implementedMethod(int i) {}
 //        ^^^^^^^^^^^^^^^^^
@@ -69,9 +81,7 @@
     : super mem::Super::•()
     ;
   abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
-  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
   abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
-  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -82,6 +92,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
   abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
 }
@@ -95,9 +107,7 @@
     : super mem::Super::•()
     ;
   abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
-  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
   abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
-  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -108,6 +118,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
   abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect
index b334412..f789cb9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect
@@ -3,10 +3,12 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:11:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-//  - AbstractClass.Interface1.implementedMethod
-//  - AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod
-//  - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-//  - AbstractClass.Super.extendedAbstractMethod
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.implementedMethod
+//  - Interface1.implementedMultipleMethod
+//  - Interface2.implementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -15,20 +17,27 @@
 //
 // class ConcreteSub extends AbstractClass {}
 //       ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
+//   void implementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:22:8: Context: 'Interface1.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:26:8: Context: 'Interface2.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:13:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
 //  - Interface1.implementedMethod
 //  - Interface1.implementedMultipleMethod
 //  - Interface2.implementedMultipleMethod
@@ -42,6 +51,9 @@
 //
 // class ConcreteClass extends Super implements Interface1, Interface2 {}
 //       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
 //   void implementedMethod(int i) {}
 //        ^^^^^^^^^^^^^^^^^
@@ -69,9 +81,7 @@
     : super mem::Super::•()
     ;
   abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
-  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
   abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
-  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -82,6 +92,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
   abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
 }
@@ -95,9 +107,7 @@
     : super mem::Super::•()
     ;
   abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
-  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
   abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
-  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -108,6 +118,8 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
   abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
   abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect
index 31f91b2..185fc0d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect
@@ -77,6 +77,8 @@
 //  - Mixin.mixedInAbstractField=
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -103,6 +105,12 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractField
@@ -111,6 +119,8 @@
 //  - Mixin.mixedInAbstractField=
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -137,6 +147,12 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -177,6 +193,8 @@
     return super.{self::Mixin::mixedInConcreteField};
   mixin-super-stub set mixedInConcreteField(core::int value) → void
     return super.{self::Mixin::mixedInConcreteField} = value;
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub set mixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::mixedInAbstractField
   mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
     return super.{self::Mixin::extendedConcreteMixedInConcreteField};
   mixin-super-stub set extendedConcreteMixedInConcreteField(core::int value) → void
@@ -185,6 +203,10 @@
     return super.{self::Mixin::extendedAbstractMixedInConcreteField};
   mixin-super-stub set extendedAbstractMixedInConcreteField(core::int value) → void
     return super.{self::Mixin::extendedAbstractMixedInConcreteField} = value;
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+  abstract mixin-stub set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedAbstractMixedInAbstractField
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
   synthetic constructor •() → self::ClassMixin
@@ -199,6 +221,8 @@
     return super.{self::Mixin::mixedInConcreteField};
   mixin-super-stub set mixedInConcreteField(core::int value) → void
     return super.{self::Mixin::mixedInConcreteField} = value;
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub set mixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::mixedInAbstractField
   mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
     return super.{self::Mixin::extendedConcreteMixedInConcreteField};
   mixin-super-stub set extendedConcreteMixedInConcreteField(core::int value) → void
@@ -207,5 +231,9 @@
     return super.{self::Mixin::extendedAbstractMixedInConcreteField};
   mixin-super-stub set extendedAbstractMixedInConcreteField(core::int value) → void
     return super.{self::Mixin::extendedAbstractMixedInConcreteField} = value;
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+  abstract mixin-stub set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedAbstractMixedInAbstractField
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect
index 54bbe20..3e41841 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect
@@ -77,6 +77,8 @@
 //  - Mixin.mixedInAbstractField=
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -103,6 +105,12 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractField
@@ -111,6 +119,8 @@
 //  - Mixin.mixedInAbstractField=
 //  - Super.extendedAbstractField
 //  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -137,6 +147,12 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
 //   abstract int extendedAbstractField;
 //                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -177,10 +193,10 @@
     : super self::Super::•()
     ;
   abstract get mixedInAbstractField() → core::int;
-  abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
   abstract get extendedConcreteMixedInAbstractField() → core::int;
-  abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
   abstract get extendedAbstractMixedInAbstractField() → core::int;
+  abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
+  abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
   abstract set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void;
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -196,10 +212,10 @@
     : super self::Super::•()
     ;
   abstract get mixedInAbstractField() → core::int;
-  abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
   abstract get extendedConcreteMixedInAbstractField() → core::int;
-  abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
   abstract get extendedAbstractMixedInAbstractField() → core::int;
+  abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
+  abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
   abstract set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect
index b40e865..aa5c0aa6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractField
 //  - Mixin.mixedInAbstractField
 //  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractField
 //  - Mixin.mixedInAbstractField
 //  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -125,6 +133,9 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteField};
   mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
     return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
   synthetic constructor •() → self::ClassMixin
@@ -141,5 +152,8 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteField};
   mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
     return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect
index 4b2a25d..4a7ba31 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractField
 //  - Mixin.mixedInAbstractField
 //  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractField
 //  - Mixin.mixedInAbstractField
 //  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
 //   abstract final int extendedAbstractField;
 //                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -122,8 +130,8 @@
   synthetic constructor •() → self::_ClassMixin&Super&Mixin
     : super self::Super::•()
     ;
-  abstract get mixedInAbstractField() → core::int;
   abstract get extendedConcreteMixedInAbstractField() → core::int;
+  abstract get mixedInAbstractField() → core::int;
   abstract get extendedAbstractMixedInAbstractField() → core::int;
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -138,8 +146,8 @@
   synthetic constructor •() → self::NamedMixin
     : super self::Super::•()
     ;
-  abstract get mixedInAbstractField() → core::int;
   abstract get extendedConcreteMixedInAbstractField() → core::int;
+  abstract get mixedInAbstractField() → core::int;
   abstract get extendedAbstractMixedInAbstractField() → core::int;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect
index 36afe4a..09d72f2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractGetter
 //  - Mixin.mixedInAbstractGetter
 //  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractGetter
 //  - Mixin.mixedInAbstractGetter
 //  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -131,6 +139,9 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteGetter};
   mixin-super-stub get extendedAbstractMixedInConcreteGetter() → core::int
     return super.{self::Mixin::extendedAbstractMixedInConcreteGetter};
+  abstract mixin-stub get extendedConcreteMixedInAbstractGetter() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractGetter
+  abstract mixin-stub get mixedInAbstractGetter() → core::int; -> self::Mixin::mixedInAbstractGetter
+  abstract mixin-stub get extendedAbstractMixedInAbstractGetter() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractGetter
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
   synthetic constructor •() → self::ClassMixin
@@ -147,5 +158,8 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteGetter};
   mixin-super-stub get extendedAbstractMixedInConcreteGetter() → core::int
     return super.{self::Mixin::extendedAbstractMixedInConcreteGetter};
+  abstract mixin-stub get extendedConcreteMixedInAbstractGetter() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractGetter
+  abstract mixin-stub get mixedInAbstractGetter() → core::int; -> self::Mixin::mixedInAbstractGetter
+  abstract mixin-stub get extendedAbstractMixedInAbstractGetter() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractGetter
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect
index 78a254e..f307297 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractGetter
 //  - Mixin.mixedInAbstractGetter
 //  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractGetter
 //  - Mixin.mixedInAbstractGetter
 //  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
 //   int get extendedAbstractGetter;
 //           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -131,8 +139,8 @@
     return 0;
   get extendedAbstractMixedInConcreteGetter() → core::int
     return 0;
-  abstract get mixedInAbstractGetter() → core::int;
   abstract get extendedConcreteMixedInAbstractGetter() → core::int;
+  abstract get mixedInAbstractGetter() → core::int;
   abstract get extendedAbstractMixedInAbstractGetter() → core::int;
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -150,8 +158,8 @@
     return 0;
   get extendedAbstractMixedInConcreteGetter() → core::int
     return 0;
-  abstract get mixedInAbstractGetter() → core::int;
   abstract get extendedConcreteMixedInAbstractGetter() → core::int;
+  abstract get mixedInAbstractGetter() → core::int;
   abstract get extendedAbstractMixedInAbstractGetter() → core::int;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect
index 0c88f5c..2c5b765 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractMethod
 //  - Mixin.mixedInAbstractMethod
 //  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractMethod
 //  - Mixin.mixedInAbstractMethod
 //  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -125,6 +133,9 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
   mixin-super-stub method extendedAbstractMixedInConcreteMethod() → void
     return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}();
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod() → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod() → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
   synthetic constructor •() → self::ClassMixin
@@ -141,5 +152,8 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
   mixin-super-stub method extendedAbstractMixedInConcreteMethod() → void
     return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}();
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod() → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod() → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect
index 2d2295c..ab66dec 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractMethod
 //  - Mixin.mixedInAbstractMethod
 //  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractMethod
 //  - Mixin.mixedInAbstractMethod
 //  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -122,8 +130,8 @@
   method mixedInConcreteMethod() → void {}
   method extendedConcreteMixedInConcreteMethod() → void {}
   method extendedAbstractMixedInConcreteMethod() → void {}
-  abstract method mixedInAbstractMethod() → void;
   abstract method extendedConcreteMixedInAbstractMethod() → void;
+  abstract method mixedInAbstractMethod() → void;
   abstract method extendedAbstractMixedInAbstractMethod() → void;
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -138,8 +146,8 @@
   method mixedInConcreteMethod() → void {}
   method extendedConcreteMixedInConcreteMethod() → void {}
   method extendedAbstractMixedInConcreteMethod() → void {}
-  abstract method mixedInAbstractMethod() → void;
   abstract method extendedConcreteMixedInAbstractMethod() → void;
+  abstract method mixedInAbstractMethod() → void;
   abstract method extendedAbstractMixedInAbstractMethod() → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect
index 57d2af3..77883ed 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect
@@ -50,6 +50,7 @@
 //  - Mixin.extendedAbstractMixedInAbstractMethod
 //  - Mixin.mixedInAbstractMethod
 //  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractMethod
 //  - Mixin.mixedInAbstractMethod
 //  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
 // Try to either
 //  - provide an implementation,
 //  - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
 //   void extendedAbstractMethod();
 //        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedConcreteMixedInConcreteMethod'.
 // class ClassMixin extends Super with Mixin {}
@@ -130,6 +138,16 @@
 //   void extendedAbstractMixedInAbstractMethod();
 //        ^
 //
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: The implementation of 'extendedConcreteMixedInAbstractMethod' in the non-abstract class 'ClassMixin' does not conform to its interface.
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: The method 'Super.extendedConcreteMixedInAbstractMethod' has fewer positional arguments than those of overridden method 'Super with Mixin.extendedConcreteMixedInAbstractMethod'.
+//   void extendedConcreteMixedInAbstractMethod() {}
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
+// class ClassMixin extends Super with Mixin {}
+//       ^
+//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The mixin application class 'NamedMixin' introduces an erroneous override of 'extendedConcreteMixedInConcreteMethod'.
 // class NamedMixin = Super with Mixin;
 //       ^^^^^^^^^^
@@ -170,60 +188,6 @@
 //   void extendedAbstractMixedInAbstractMethod();
 //        ^
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Class 'Super with Mixin' inherits multiple members named 'extendedConcreteMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedConcreteMixedInConcreteMethod' to 'Super with Mixin'.
-// class ClassMixin extends Super with Mixin {}
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:24:8: Context: This is one of the overridden members.
-//   void extendedConcreteMixedInConcreteMethod(int i) {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:10:8: Context: This is one of the overridden members.
-//   void extendedConcreteMixedInConcreteMethod() {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Class 'Super with Mixin' inherits multiple members named 'extendedAbstractMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedAbstractMixedInConcreteMethod' to 'Super with Mixin'.
-// class ClassMixin extends Super with Mixin {}
-//       ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:26:8: Context: This is one of the overridden members.
-//   void extendedAbstractMixedInConcreteMethod(int i) {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: This is one of the overridden members.
-//   void extendedAbstractMixedInConcreteMethod();
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: The implementation of 'extendedConcreteMixedInAbstractMethod' in the non-abstract class 'ClassMixin' does not conform to its interface.
-// class ClassMixin extends Super with Mixin {}
-//       ^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: The method 'Super.extendedConcreteMixedInAbstractMethod' has fewer positional arguments than those of overridden method 'Mixin.extendedConcreteMixedInAbstractMethod'.
-//   void extendedConcreteMixedInAbstractMethod() {}
-//        ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:28:8: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
-//   void extendedConcreteMixedInAbstractMethod(int i);
-//        ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: Class 'NamedMixin' inherits multiple members named 'extendedConcreteMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedConcreteMixedInConcreteMethod' to 'NamedMixin'.
-// class NamedMixin = Super with Mixin;
-//       ^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:24:8: Context: This is one of the overridden members.
-//   void extendedConcreteMixedInConcreteMethod(int i) {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:10:8: Context: This is one of the overridden members.
-//   void extendedConcreteMixedInConcreteMethod() {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: Class 'NamedMixin' inherits multiple members named 'extendedAbstractMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedAbstractMixedInConcreteMethod' to 'NamedMixin'.
-// class NamedMixin = Super with Mixin;
-//       ^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:26:8: Context: This is one of the overridden members.
-//   void extendedAbstractMixedInConcreteMethod(int i) {}
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: This is one of the overridden members.
-//   void extendedAbstractMixedInConcreteMethod();
-//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -255,6 +219,13 @@
     ;
   mixin-super-stub method mixedInConcreteMethod(core::int i) → void
     return super.{self::Mixin::mixedInConcreteMethod}(i);
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}(i);
+  mixin-super-stub method extendedAbstractMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}(i);
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod(core::int i) → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
   synthetic constructor •() → self::ClassMixin
@@ -267,5 +238,12 @@
     ;
   mixin-super-stub method mixedInConcreteMethod(core::int i) → void
     return super.{self::Mixin::mixedInConcreteMethod}(i);
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}(i);
+  mixin-super-stub method extendedAbstractMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}(i);
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod(core::int i) → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect
index a61aba7..c9a2f79 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect
@@ -49,6 +49,7 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractSetter=
 //  - Mixin.mixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInAbstractSetter=
 //  - Super.extendedAbstractSetter=
 // Try to either
 //  - provide an implementation,
@@ -64,6 +65,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
 //   void set mixedInAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
 //   void set extendedAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^
@@ -71,6 +75,7 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractSetter=
 //  - Mixin.mixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInAbstractSetter=
 //  - Super.extendedAbstractSetter=
 // Try to either
 //  - provide an implementation,
@@ -86,6 +91,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
 //   void set mixedInAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
 //   void set extendedAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^
@@ -125,6 +133,9 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteSetter} = i;
   mixin-super-stub set extendedAbstractMixedInConcreteSetter(core::int i) → void
     return super.{self::Mixin::extendedAbstractMixedInConcreteSetter} = i;
+  abstract mixin-stub set extendedConcreteMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractSetter
+  abstract mixin-stub set mixedInAbstractSetter(core::int i) → void; -> self::Mixin::mixedInAbstractSetter
+  abstract mixin-stub set extendedAbstractMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractSetter
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
   synthetic constructor •() → self::ClassMixin
@@ -141,5 +152,8 @@
     return super.{self::Mixin::extendedConcreteMixedInConcreteSetter} = i;
   mixin-super-stub set extendedAbstractMixedInConcreteSetter(core::int i) → void
     return super.{self::Mixin::extendedAbstractMixedInConcreteSetter} = i;
+  abstract mixin-stub set extendedConcreteMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractSetter
+  abstract mixin-stub set mixedInAbstractSetter(core::int i) → void; -> self::Mixin::mixedInAbstractSetter
+  abstract mixin-stub set extendedAbstractMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractSetter
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect
index d17ef57..7bdf664 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect
@@ -49,6 +49,7 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractSetter=
 //  - Mixin.mixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInAbstractSetter=
 //  - Super.extendedAbstractSetter=
 // Try to either
 //  - provide an implementation,
@@ -64,6 +65,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
 //   void set mixedInAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
 //   void set extendedAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^
@@ -71,6 +75,7 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
 //  - Mixin.extendedAbstractMixedInAbstractSetter=
 //  - Mixin.mixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInAbstractSetter=
 //  - Super.extendedAbstractSetter=
 // Try to either
 //  - provide an implementation,
@@ -86,6 +91,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
 //   void set mixedInAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
 //   void set extendedAbstractSetter(int i);
 //            ^^^^^^^^^^^^^^^^^^^^^^
@@ -122,8 +130,8 @@
   set mixedInConcreteSetter(core::int i) → void {}
   set extendedConcreteMixedInConcreteSetter(core::int i) → void {}
   set extendedAbstractMixedInConcreteSetter(core::int i) → void {}
-  abstract set mixedInAbstractSetter(core::int i) → void;
   abstract set extendedConcreteMixedInAbstractSetter(core::int i) → void;
+  abstract set mixedInAbstractSetter(core::int i) → void;
   abstract set extendedAbstractMixedInAbstractSetter(core::int i) → void;
 }
 class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -138,8 +146,8 @@
   set mixedInConcreteSetter(core::int i) → void {}
   set extendedConcreteMixedInConcreteSetter(core::int i) → void {}
   set extendedAbstractMixedInConcreteSetter(core::int i) → void {}
-  abstract set mixedInAbstractSetter(core::int i) → void;
   abstract set extendedConcreteMixedInAbstractSetter(core::int i) → void;
+  abstract set mixedInAbstractSetter(core::int i) → void;
   abstract set extendedAbstractMixedInAbstractSetter(core::int i) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect
index 197d429..0f94026 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect
@@ -283,23 +283,24 @@
   const synthetic constructor •() → self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract
     : super self::_FromMixinConcreteAbstract&Object&MixinConcrete::•()
     ;
+  abstract mixin-stub method noSuchMethod(core::Invocation invocation) → dynamic; -> self::MixinAbstract::noSuchMethod
 }
 class FromMixinConcreteAbstract extends self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract implements self::Interface {
   synthetic constructor •() → self::FromMixinConcreteAbstract
     : super self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::•()
     ;
   no-such-method-forwarder get getter() → core::int
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
   no-such-method-forwarder get field() → core::int
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
   no-such-method-forwarder method method() → void
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
   no-such-method-forwarder get finalField() → core::int
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
   no-such-method-forwarder set setter(core::int value) → void
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
   no-such-method-forwarder set field(core::int value) → void
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
 }
 class InterfaceAbstract extends core::Object {
   synthetic constructor •() → self::InterfaceAbstract
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect
index e524f56..730cbf4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect
@@ -294,17 +294,17 @@
     : super self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::•()
     ;
   no-such-method-forwarder get getter() → core::int
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
   no-such-method-forwarder get field() → core::int
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
   no-such-method-forwarder method method() → void
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
   no-such-method-forwarder get finalField() → core::int
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
   no-such-method-forwarder set setter(core::int value) → void
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
   no-such-method-forwarder set field(core::int value) → void
-    return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
 }
 class InterfaceAbstract extends core::Object {
   synthetic constructor •() → self::InterfaceAbstract
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect
index eda0257..773c139 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect
@@ -2,17 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:16:7: Error: The implementation of 'extendedMethod1' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super {
-//       ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:7:28: Context: The parameter 'i' of the method 'Super.extendedMethod1' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Class.extendedMethod1'.
-// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
-//   void extendedMethod1(int i) {}
-//                            ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:18:8: Context: This is the overridden method ('extendedMethod1').
-//   void extendedMethod1(num n);
-//        ^
-//
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:21:28: Error: The parameter 'i' of the method 'Class.extendedMethod2' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.extendedMethod2'.
 // Change to a supertype of 'num', or, for a covariant parameter, a subtype.
 //   void extendedMethod2(int i);
@@ -29,6 +18,17 @@
 //   void overriddenMethod2(num n) {}
 //        ^
 //
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:16:7: Error: The implementation of 'extendedMethod1' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:7:28: Context: The parameter 'i' of the method 'Super.extendedMethod1' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Class.extendedMethod1'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void extendedMethod1(int i) {}
+//                            ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:18:8: Context: This is the overridden method ('extendedMethod1').
+//   void extendedMethod1(num n);
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect
index d73e778..91d4ae2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect
@@ -19,9 +19,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:70:15: Error: Can't declare a member that conflicts with an inherited one.
 //   static void mixedInInstanceDeclaredStaticMethod() {}
 //               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:56:16: Context: This is the inherited member.
-// abstract class Class extends Super with Mixin implements Interface {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:27:8: Context: This is the inherited member.
+//   void mixedInInstanceDeclaredStaticMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:73:15: Error: Can't declare a member that conflicts with an inherited one.
 //   static void implementedInstanceDeclaredStaticMethod() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect
index e5cd1f8..4477dde 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect
@@ -19,9 +19,9 @@
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:70:15: Error: Can't declare a member that conflicts with an inherited one.
 //   static void mixedInInstanceDeclaredStaticMethod() {}
 //               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:56:16: Context: This is the inherited member.
-// abstract class Class extends Super with Mixin implements Interface {
-//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:27:8: Context: This is the inherited member.
+//   void mixedInInstanceDeclaredStaticMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:73:15: Error: Can't declare a member that conflicts with an inherited one.
 //   static void implementedInstanceDeclaredStaticMethod() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
index a1df551..a878892 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
@@ -9,20 +9,37 @@
   const synthetic constructor •() → self::_C&Object&A*
     : super core::Object::•()
     ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> baz2::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> baz2::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> baz2::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> baz2::A::hashCode
   mixin-super-stub method toString({core::String* s = #C1}) → core::String*
     return super.{baz2::A::toString}(s: s);
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> baz2::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> baz2::A::runtimeType
 }
 abstract class _C&Object&A&B = self::_C&Object&A with baz2::B /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::toString
+  abstract mixin-stub get _identityHashCode() → core::int*; -> baz2::B::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> baz2::B::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> baz2::B::==
+  abstract mixin-stub get hashCode() → core::int*; -> baz2::B::hashCode
+  abstract mixin-stub method toString() → core::String*; -> baz2::B::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> baz2::B::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> baz2::B::runtimeType
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::toString
 }
 static method main() → void {
   core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
index dac9776..2ba727b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
@@ -9,6 +9,16 @@
   const synthetic constructor •() → self::_C&Object&A*
     : super core::Object::•()
     ;
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
   mixin-super-stub method method({core::String* s = #C1}) → core::String*
     return super.{iss::A::method}(s: s);
 }
@@ -16,16 +26,25 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
+  abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
+  abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
+  abstract mixin-stub method toString() → core::String*; -> iss::B::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
+  abstract mixin-stub method method() → core::String*; -> iss::B::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
 }
 static method main() → dynamic {
-  core::print(new self::C::•().{self::C::method}());
+  core::print(new self::C::•().{self::_C&Object&A&B::method}());
 }
 
 library;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect
index b8246e1..ec08b47 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect
@@ -61,6 +61,7 @@
   synthetic constructor •() → iss::B*
     : super core::Object::•()
     ;
+  abstract member-signature method method() → core::String*; -> iss2::Interface::method
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -71,7 +72,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method method() → core::String*; -> iss2::Interface::method
 }
 static method main() → void {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect
index ba3f39c..f7c6ef0 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect
@@ -26,6 +26,7 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
+  abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method() → core::String*; -> #lib1::Interface::method
   abstract member-signature get /* from org-dartlang-testcase:///issue41210b_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -36,7 +37,6 @@
   abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ toString() → core::String*; -> core::Object::toString
   abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///issue41210b_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method() → core::String*; -> #lib1::Interface::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
@@ -72,6 +72,7 @@
   synthetic constructor •() → iss::B*
     : super core::Object::•()
     ;
+  abstract member-signature method method() → core::String*; -> iss2::Interface::method
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -82,7 +83,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method method() → core::String*; -> iss2::Interface::method
 }
 static method main() → void {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
index 3a9fde4..cf0c156 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
@@ -2,6 +2,8 @@
 import self as self;
 import "foundation_binding_lib.dart" as fou;
 import "scheduler_binding_lib.dart" as sch;
+import "dart:core" as core;
+import "dart:async" as asy;
 import "services_binding_lib.dart" as ser;
 
 import "org-dartlang-testcase:///foundation_lib.dart";
@@ -12,6 +14,17 @@
   synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding*
     : super fou::BindingBase::•()
     ;
+  abstract mixin-stub method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> sch::SchedulerBinding::registerSignalServiceExtension
+  abstract mixin-stub get _identityHashCode() → core::int*; -> sch::SchedulerBinding::_identityHashCode
+  abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> sch::SchedulerBinding::_instanceOf
+  abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOf
+  abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOfTrue
+  abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOfFalse
+  abstract mixin-stub operator ==(dynamic other) → core::bool*; -> sch::SchedulerBinding::==
+  abstract mixin-stub get hashCode() → core::int*; -> sch::SchedulerBinding::hashCode
+  abstract mixin-stub method toString() → core::String*; -> sch::SchedulerBinding::toString
+  abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> sch::SchedulerBinding::noSuchMethod
+  abstract mixin-stub get runtimeType() → core::Type*; -> sch::SchedulerBinding::runtimeType
 }
 abstract class _TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding = self::_TestSchedulerBinding&BindingBase&SchedulerBinding with ser::ServicesBinding /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding*
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
index 7f60cbd..4ac860d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
@@ -10,6 +10,8 @@
 
 class E2 = Object with A, D;
 
+class E3 = Object with A, F;
+
 abstract class C6 extends C3 implements C4 {}
 
 abstract class C8 extends C5 implements C7 {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
index 1763bc0..212f813 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
@@ -4,6 +4,7 @@
 class E1 with A, D {}
 
 class E2 = Object with A, D;
+class E3 = Object with A, F;
 
 abstract class C6 extends C3 implements C4 {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
index 9bd7263..ea6829e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
@@ -8,4 +8,5 @@
 class E1 with A, D {}
 
 class E2 = Object with A, D;
+class E3 = Object with A, F;
 main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
index 7b96874..11f8668 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
@@ -26,13 +26,13 @@
   const synthetic constructor •() → self::_E1&Object&A&D*
     : super self::_E1&Object&A::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  forwarding-stub method method(covariant core::num* i) → core::String*
+    return super.{self::_E1&Object&A::method}(i);
 }
 class E1 extends self::_E1&Object&A&D {
   synthetic constructor •() → self::E1*
     : super self::_E1&Object&A&D::•()
     ;
-  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E1&Object&A&D::method
 }
 abstract class _E2&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E2&Object&A*
@@ -55,13 +55,35 @@
   const synthetic constructor •() → self::E2*
     : super self::_E2&Object&A::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  forwarding-stub method method(covariant core::num* i) → core::String*
+    return super.{self::_E2&Object&A::method}(i);
+}
+abstract class _E3&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E3&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E3 = self::_E3&Object&A with mai::F /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E3*
+    : super self::_E3&Object&A::•()
+    ;
 }
 abstract class C6 extends mai::C3 implements mai::C4 {
   synthetic constructor •() → self::C6*
     : super mai::C3::•()
     ;
-  abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,12 +94,12 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
 }
 abstract class C8 extends mai::C5 implements mai::C7 {
   synthetic constructor •() → self::C8*
     : super mai::C5::•()
     ;
-  abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -88,6 +110,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
 }
 static method main() → dynamic {}
 
@@ -117,6 +140,11 @@
     ;
   abstract forwarding-stub method method(covariant core::num i) → core::String;
 }
+abstract class F extends core::Object implements mai::Interface {
+  synthetic constructor •() → mai::F
+    : super core::Object::•()
+    ;
+}
 abstract class C1 extends core::Object {
   synthetic constructor •() → mai::C1
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
index 26c7fd6..7b32bba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
@@ -26,13 +26,13 @@
   const synthetic constructor •() → self::_E1&Object&A&D*
     : super self::_E1&Object&A::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  forwarding-stub method method(covariant core::num* i) → core::String*
+    return super.{self::_E1&Object&A::method}(i);
 }
 class E1 extends self::_E1&Object&A&D {
   synthetic constructor •() → self::E1*
     : super self::_E1&Object&A&D::•()
     ;
-  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E1&Object&A&D::method
 }
 abstract class _E2&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E2&Object&A*
@@ -55,13 +55,35 @@
   const synthetic constructor •() → self::E2*
     : super self::_E2&Object&A::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  forwarding-stub method method(covariant core::num* i) → core::String*
+    return super.{self::_E2&Object&A::method}(i);
+}
+abstract class _E3&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E3&Object&A*
+    : super core::Object::•()
+    ;
+  method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E3 extends self::_E3&Object&A implements mai::F /*isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::E3*
+    : super self::_E3&Object&A::•()
+    ;
 }
 abstract class C6 extends mai::C3 implements mai::C4 {
   synthetic constructor •() → self::C6*
     : super mai::C3::•()
     ;
-  abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,12 +94,12 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
 }
 abstract class C8 extends mai::C5 implements mai::C7 {
   synthetic constructor •() → self::C8*
     : super mai::C5::•()
     ;
-  abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -88,6 +110,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
 }
 static method main() → dynamic {}
 
@@ -117,6 +140,11 @@
     ;
   abstract forwarding-stub method method(covariant core::num i) → core::String;
 }
+abstract class F extends core::Object implements mai::Interface {
+  synthetic constructor •() → mai::F
+    : super core::Object::•()
+    ;
+}
 abstract class C1 extends core::Object {
   synthetic constructor •() → mai::C1
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
index 5291414..6bcc053 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
@@ -16,6 +16,8 @@
 
 abstract class D implements Interface, Interface2 {}
 
+abstract class F implements Interface {}
+
 abstract class C1 {
   method2();
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect
index e001ce8..d8ff996 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect
@@ -45,11 +45,11 @@
   synthetic constructor •() → self::_DwB0&C0&B
     : super mix::C0::•()
     ;
-  mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int) → core::int>
+  mixin-super-stub get a() → core::List<(core::int) → core::int>
     return super.{mix2::B::a};
-  mixin-super-stub set /*isLegacy*/ a(core::List<(core::int) → core::int> _) → void
+  mixin-super-stub set a(core::List<(core::int) → core::int> _) → void
     return super.{mix2::B::a} = _;
-  mixin-super-stub method /*isLegacy*/ m((core::int) → core::int x) → (core::int) → core::int
+  mixin-super-stub method m((core::int) → core::int x) → (core::int) → core::int
     return super.{mix2::B::m}(x);
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -70,11 +70,11 @@
   synthetic constructor •() → self::_DwBq0&C0&Bq
     : super mix::C0::•()
     ;
-  mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int?) → core::int?>
+  mixin-super-stub get a() → core::List<(core::int?) → core::int?>
     return super.{mix2::Bq::a};
-  mixin-super-stub set /*isLegacy*/ a(core::List<(core::int?) → core::int?> _) → void
+  mixin-super-stub set a(core::List<(core::int?) → core::int?> _) → void
     return super.{mix2::Bq::a} = _;
-  mixin-super-stub method /*isLegacy*/ m((core::int?) → core::int? x) → (core::int?) → core::int?
+  mixin-super-stub method m((core::int?) → core::int? x) → (core::int?) → core::int?
     return super.{mix2::Bq::m}(x);
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -129,11 +129,11 @@
   synthetic constructor •() → self::_DwB3&C3&B
     : super mix::C3::•()
     ;
-  mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int) → core::int>
+  mixin-super-stub get a() → core::List<(core::int) → core::int>
     return super.{mix2::B::a};
-  mixin-super-stub set /*isLegacy*/ a(core::List<(core::int) → core::int> _) → void
+  mixin-super-stub set a(core::List<(core::int) → core::int> _) → void
     return super.{mix2::B::a} = _;
-  mixin-super-stub method /*isLegacy*/ m((core::int) → core::int x) → (core::int) → core::int
+  mixin-super-stub method m((core::int) → core::int x) → (core::int) → core::int
     return super.{mix2::B::m}(x);
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -154,11 +154,11 @@
   synthetic constructor •() → self::_DwBq3&C3&Bq
     : super mix::C3::•()
     ;
-  mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int?) → core::int?>
+  mixin-super-stub get a() → core::List<(core::int?) → core::int?>
     return super.{mix2::Bq::a};
-  mixin-super-stub set /*isLegacy*/ a(core::List<(core::int?) → core::int?> _) → void
+  mixin-super-stub set a(core::List<(core::int?) → core::int?> _) → void
     return super.{mix2::Bq::a} = _;
-  mixin-super-stub method /*isLegacy*/ m((core::int?) → core::int? x) → (core::int?) → core::int?
+  mixin-super-stub method m((core::int?) → core::int? x) → (core::int?) → core::int?
     return super.{mix2::Bq::m}(x);
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
index a59d64d..ca14755 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
@@ -26,10 +26,10 @@
   synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
     : super self::_Class&Object&Mixin1::•()
     ;
-  mixin-super-stub set field((dynamic) →* core::Type* value) → void
-    return super.{mai::Mixin2::field} = value;
   mixin-super-stub get field() → (dynamic) →* core::Type*
     return super.{mai::Mixin2::field};
+  mixin-super-stub set field((dynamic) →* core::Type* value) → void
+    return super.{mai::Mixin2::field} = value;
   mixin-super-stub method method1() → (dynamic) →* core::Type*
     return super.{mai::Mixin2::method1}();
   mixin-super-stub method method2((dynamic) →* core::Type* t) → void
@@ -59,8 +59,10 @@
   synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
     : super core::Object::•()
     ;
-  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -71,8 +73,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
-  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
 }
 abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
   field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
index 0d55698..a0b7a6c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
@@ -21,8 +21,8 @@
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
 }
@@ -69,8 +69,10 @@
   synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
     : super core::Object::•()
     ;
-  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -81,8 +83,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
-  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
 }
 abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
   field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
index a59d64d..ca14755 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
@@ -26,10 +26,10 @@
   synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
     : super self::_Class&Object&Mixin1::•()
     ;
-  mixin-super-stub set field((dynamic) →* core::Type* value) → void
-    return super.{mai::Mixin2::field} = value;
   mixin-super-stub get field() → (dynamic) →* core::Type*
     return super.{mai::Mixin2::field};
+  mixin-super-stub set field((dynamic) →* core::Type* value) → void
+    return super.{mai::Mixin2::field} = value;
   mixin-super-stub method method1() → (dynamic) →* core::Type*
     return super.{mai::Mixin2::method1}();
   mixin-super-stub method method2((dynamic) →* core::Type* t) → void
@@ -59,8 +59,10 @@
   synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
     : super core::Object::•()
     ;
-  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -71,8 +73,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
-  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
 }
 abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
   field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
index 0d55698..a0b7a6c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
@@ -21,8 +21,8 @@
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
   abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
 }
@@ -69,8 +69,10 @@
   synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
     : super core::Object::•()
     ;
-  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
   abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -81,8 +83,6 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
-  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
 }
 abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
   field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect
index 25c58bb..c317528 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect
@@ -9,8 +9,8 @@
   synthetic constructor •() → self::Class*
     : super sup::SuperClass::•()
     ;
-  abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
   abstract member-signature get property() → core::Object*; -> sup::SuperClass::property
+  abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect
index 25c58bb..c317528 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect
@@ -9,8 +9,8 @@
   synthetic constructor •() → self::Class*
     : super sup::SuperClass::•()
     ;
-  abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
   abstract member-signature get property() → core::Object*; -> sup::SuperClass::property
+  abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
index 29f7048..ac147ed 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
@@ -21,6 +21,7 @@
   synthetic constructor •() → self::I*
     ;
   abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -29,7 +30,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
index cf46444..2182bea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
@@ -24,6 +24,7 @@
     : super core::Object::•()
     ;
   abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
index cf46444..2182bea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
@@ -24,6 +24,7 @@
     : super core::Object::•()
     ;
   abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
index fd257f0..5a2927f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
@@ -56,6 +56,7 @@
   synthetic constructor •() → self::HungryCat*
     ;
   abstract method eatFood(core::String* food, {core::double* amount, core::double* yetAnother}) → core::bool*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -64,7 +65,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect
index 3979bfc..b32f8e5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect
@@ -64,6 +64,7 @@
     : super core::Object::•()
     ;
   abstract method eatFood(core::String* food, {core::double* amount = #C5, core::double* yetAnother = #C5}) → core::bool*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,7 +73,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect
index 675ecfb..d5a49ee 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect
@@ -64,6 +64,7 @@
     : super core::Object::•()
     ;
   abstract method eatFood(core::String* food, {core::double* amount = #C5, core::double* yetAnother = #C5}) → core::bool*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,7 +73,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
index 513d138..6986170 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
@@ -22,6 +22,7 @@
     ;
   method foo() → void
     ;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -30,7 +31,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
index 4351d37..acee4b7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
@@ -24,6 +24,7 @@
     : super core::Object::•()
     ;
   method foo() → void {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
index 4351d37..acee4b7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
@@ -24,6 +24,7 @@
     : super core::Object::•()
     ;
   method foo() → void {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 6b1da0c..2d1038e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
@@ -45,6 +45,7 @@
   synthetic constructor •() → pri::Fisk*
     ;
   abstract method _hest() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -53,7 +54,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
index 6a52850..735122a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
@@ -48,6 +48,7 @@
     : super core::Object::•()
     ;
   abstract method _hest() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -56,7 +57,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
index 6a52850..735122a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
@@ -48,6 +48,7 @@
     : super core::Object::•()
     ;
   abstract method _hest() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -56,7 +57,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index 9fc1e31..80e949b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -6,6 +6,7 @@
   synthetic constructor •() → self::I<self::I::T*>*
     ;
   abstract method foo() → self::I::T*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -14,7 +15,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class M extends core::Object {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
index 8920c01..3676843 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
@@ -7,6 +7,7 @@
     : super core::Object::•()
     ;
   abstract method foo() → self::I::T*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -15,7 +16,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class M extends core::Object {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
index 4e46a55..84fdbfc 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
@@ -7,6 +7,7 @@
     : super core::Object::•()
     ;
   abstract method foo() → self::I::T*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -15,7 +16,6 @@
   abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class M extends core::Object {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
index d8dedc2..d858827 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
@@ -32,11 +32,11 @@
     ;
   mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+  mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+  forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
@@ -34,11 +34,11 @@
     ;
   mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+  mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+  forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
   self::Superclass s = c;
   self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
   self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
@@ -34,11 +34,11 @@
     ;
   mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+  mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+  forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
   self::Superclass s = c;
   self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
   self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
@@ -34,11 +34,11 @@
     ;
   mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+  mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+  forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
   self::Superclass s = c;
   self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
   self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
@@ -34,11 +34,11 @@
     ;
   mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
     return super.{self::Mixin::method1}(argument1, argument2);
-  forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+  mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
     return super.{self::Mixin::method2}(argument1, argument2);
   forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
     return super.{self::Mixin::method3}(argument1, argument2);
-  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+  forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
     return super.{self::Mixin::method4}(argument1, argument2);
 }
 class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
   self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
-  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
   self::Superclass s = c;
   self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
   self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 71a0dbf..add20b0 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -19,6 +19,8 @@
 general/infer_field_from_multiple: TypeCheckError
 general/invalid_operator: TypeCheckError
 general/invalid_operator_override: TypeCheckError
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
 general/mixin_application_override: TypeCheckError
 general/override_check_accessor_after_inference: TypeCheckError
 general/override_check_accessor_basic: TypeCheckError
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
index ad6b170..d282494 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -2,16 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
-// class E extends D {
-//       ^
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
-//   foo(int x) => x;
-//   ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
-//   foo(int x, {int y});
-//   ^
-//
 // pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
 // class C extends A implements B {
 //       ^
@@ -22,6 +12,16 @@
 //   foo(int x, {int y}) => y;
 //   ^
 //
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y});
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index 32e4786..3493cad 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -2,16 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
-// class E extends D {
-//       ^
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
-//   foo(int x) => x;
-//   ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
-//   foo(int x, {int y});
-//   ^
-//
 // pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
 // class C extends A implements B {
 //       ^
@@ -22,6 +12,16 @@
 //   foo(int x, {int y}) => y;
 //   ^
 //
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y});
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
index 32e4786..3493cad 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -2,16 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
-// class E extends D {
-//       ^
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
-//   foo(int x) => x;
-//   ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
-//   foo(int x, {int y});
-//   ^
-//
 // pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
 // class C extends A implements B {
 //       ^
@@ -22,6 +12,16 @@
 //   foo(int x, {int y}) => y;
 //   ^
 //
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y});
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
index 9c97b6c..4b93548 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
@@ -1,4 +1,17 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+//   int x;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
index 92c4e15..ef3d7b6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
@@ -1,4 +1,17 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+//   int x;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
index 92c4e15..ef3d7b6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
@@ -1,4 +1,17 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+//   int x;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index 10bc3ee..b6f1dad 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -82,7 +82,7 @@
     return super.{self::M::x} = value;
   mixin-super-stub get y() → core::int*
     return super.{self::M::y};
-  forwarding-stub set y(covariant core::Object* value) → void
+  forwarding-stub set y(covariant core::int* value) → void
     return super.{self::M::y} = value;
 }
 static method expectTypeError(() →* void callback) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index a084cac..2f222f6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -89,7 +89,7 @@
     return super.{self::M::x} = value;
   mixin-super-stub get y() → core::int*
     return super.{self::M::y};
-  forwarding-stub set y(covariant core::Object* value) → void
+  forwarding-stub set y(covariant core::int* value) → void
     return super.{self::M::y} = value;
 }
 static method expectTypeError(() →* void callback) → void {
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
index 48cf848..3582fa0 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
@@ -89,7 +89,7 @@
     return super.{self::M::x} = value;
   mixin-super-stub get y() → core::int*
     return super.{self::M::y};
-  forwarding-stub set y(covariant core::Object* value) → void
+  forwarding-stub set y(covariant core::int* value) → void
     return super.{self::M::y} = value;
 }
 static method expectTypeError(() →* void callback) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index 3f56a5f..743d696 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -98,7 +98,7 @@
     return super.{self::M::x} = value;
   mixin-super-stub get y() → core::int*
     return super.{self::M::y};
-  forwarding-stub set y(covariant core::Object* value) → void
+  forwarding-stub set y(covariant core::int* value) → void
     return super.{self::M::y} = value;
 }
 static method expectTypeError(() →* void callback) → void {
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index eea0f81..b2c9538 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -72,6 +72,8 @@
 general/issue38938: RuntimeError # no main and compile time errors.
 general/issue38944: RuntimeError # no main and compile time errors.
 general/issue38961: RuntimeError # no main and compile time errors.
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
 general/micro: RuntimeError
 general/mixin_application_override: ExpectationFileMismatch # Too many errors.
 general/mixin_application_override: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index d84d3b9..a59dfcd 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -74,6 +74,8 @@
 general/issue38938: RuntimeError
 general/issue38944: RuntimeError
 general/issue38961: RuntimeError
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
 general/micro: RuntimeError
 general/mixin_application_override: TypeCheckError
 general/mixin_constructors_with_default_values: RuntimeError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 901929c..add6cbb 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -100,6 +100,7 @@
 late_lowering/late_lowering_bitmasks: FormatterCrash
 late_lowering/late_nullable_field_with_initializer: FormatterCrash
 late_lowering/late_nullable_field_without_initializer: FormatterCrash
+late_lowering/late_override: FormatterCrash
 late_lowering/later: FormatterCrash
 late_lowering/override: FormatterCrash
 late_lowering/override_getter_setter: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index a382980..56c47dc 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -78,6 +78,8 @@
 nnbd_mixed/hierarchy/mix_in_override: TypeCheckError
 nnbd_mixed/hierarchy/override: TypeCheckError
 nnbd_mixed/inheritance_from_opt_in: TypeCheckError
+nnbd_mixed/issue40512/issue40512: TypeCheckError
+nnbd_mixed/issue41210a/issue41210: TypeCheckError
 nnbd_mixed/issue41567: TypeCheckError
 nnbd_mixed/messages_with_types_opt_in: TypeCheckError
 nnbd_mixed/messages_with_types_opt_out: TypeCheckError
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 50bd29e..edd1e75 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -485,6 +485,7 @@
     "exclude": [
       "^pkg/analysis_server/lib/src/analysis_server\\.dart",
       "test/analyser_ignored/",
+      "test/class_hierarchy/data/",
       "test/enable_non_nullable/data/",
       "test/extensions/data/",
       "test/id_testing/data/",
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index c31e80b..3a386bd 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -71,3 +71,47 @@
   @override
   DartType visitNeverType(NeverType node) => const NullType();
 }
+
+/// Returns `true` if a member declared in [declaringClass] inherited or
+/// mixed into [enclosingClass] needs legacy erasure to compute its inherited
+/// type.
+///
+/// For instance:
+///
+///    // Opt in:
+///    class Super {
+///      int extendedMethod(int i, {required int j}) => i;
+///    }
+///    class Mixin {
+///      int mixedInMethod(int i, {required int j}) => i;
+///    }
+///    // Opt out:
+///    class Legacy extends Super with Mixin {}
+///    // Opt in:
+///    class Class extends Legacy {
+///      test() {
+///        // Ok to call `Legacy.extendedMethod` since its type is
+///        // `int* Function(int*, {int* j})`.
+///        super.extendedMethod(null);
+///        // Ok to call `Legacy.mixedInMethod` since its type is
+///        // `int* Function(int*, {int* j})`.
+///        super.mixedInMethod(null);
+///      }
+///    }
+///
+bool needsLegacyErasure(Class enclosingClass, Class declaringClass) {
+  Class cls = enclosingClass;
+  while (cls != null) {
+    if (!cls.enclosingLibrary.isNonNullableByDefault) {
+      return true;
+    }
+    if (cls == declaringClass) {
+      return false;
+    }
+    if (cls.mixedInClass == declaringClass) {
+      return false;
+    }
+    cls = cls.superclass;
+  }
+  return false;
+}
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 0ca1b4a..a7faeea 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1157,17 +1157,25 @@
     if (features.isNotEmpty) {
       writeWord("/*${features.join(',')}*/");
     }
-    if (node.isMemberSignature) {
-      writeFunction(node.function,
-          name: getMemberName(node), terminateLine: false);
-      if (node.function.body is ReturnStatement) {
-        writeSymbol(';');
-      }
-      writeSymbol(' -> ');
-      writeMemberReferenceFromReference(node.stubTargetReference);
-      endLine();
-    } else {
-      writeFunction(node.function, name: getMemberName(node));
+    switch (node.stubKind) {
+      case ProcedureStubKind.Regular:
+      case ProcedureStubKind.AbstractForwardingStub:
+      case ProcedureStubKind.ConcreteForwardingStub:
+      case ProcedureStubKind.NoSuchMethodForwarder:
+      case ProcedureStubKind.ConcreteMixinStub:
+        writeFunction(node.function, name: getMemberName(node));
+        break;
+      case ProcedureStubKind.MemberSignature:
+      case ProcedureStubKind.AbstractMixinStub:
+        writeFunction(node.function,
+            name: getMemberName(node), terminateLine: false);
+        if (node.function.body is ReturnStatement) {
+          writeSymbol(';');
+        }
+        writeSymbol(' -> ');
+        writeMemberReferenceFromReference(node.stubTargetReference);
+        endLine();
+        break;
     }
   }
 
diff --git a/tests/language/mixin/invalid_override_in_mixin_test.dart b/tests/language/mixin/invalid_override_in_mixin_test.dart
index bd79f66..de7b18c 100644
--- a/tests/language/mixin/invalid_override_in_mixin_test.dart
+++ b/tests/language/mixin/invalid_override_in_mixin_test.dart
@@ -14,8 +14,6 @@
 class C extends Object with A {
 //    ^
 // [cfe] Applying the mixin 'A' to 'Object' introduces an erroneous override of 'noSuchMethod'.
-//    ^
-// [cfe] Class 'Object with A' inherits multiple members named 'noSuchMethod' with incompatible signatures.
 //                          ^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
   test() {
diff --git a/tests/language/mixin/method_override_test.dart b/tests/language/mixin/method_override_test.dart
index 166599e..e50464d 100644
--- a/tests/language/mixin/method_override_test.dart
+++ b/tests/language/mixin/method_override_test.dart
@@ -21,34 +21,26 @@
 
 // Wrong return type.
 abstract class C1 = CII with CIS;
-//             ^^
-// [cfe] Class 'C1' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'C1' introduces an erroneous override of 'id'.
 //                           ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class C2 extends CII with CIS {}
-//             ^^
-// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'CII with CIS' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
 //                                 ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
 
 // Wrong argument type.
 abstract class C3 = CII with CSI;
-//             ^^
-// [cfe] Class 'C3' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'C3' introduces an erroneous override of 'id'.
 //                           ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class C4 extends CII with CSI {}
-//             ^^
-// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'CII with CSI' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
 //                                 ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -56,17 +48,13 @@
 abstract class C5 = CII with CTT<int>;
 abstract class C6 extends CII with CTT<int> {}
 abstract class C7  = CII with CTT<String>;
-//             ^^
-// [cfe] Class 'C7' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'C7' introduces an erroneous override of 'id'.
 //                            ^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class C8 extends CII with CTT<String> {}
-//             ^^
-// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'CII with CTT<String>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
 //                                 ^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -92,34 +80,26 @@
 abstract class N2 extends NIIx with NIIxy {}
 // It's NOT OK to rename named parameters.
 abstract class N3 = NIIx with NIIy;
-//             ^^
-// [cfe] Class 'N3' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N3' introduces an erroneous override of 'id'.
 //                            ^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N4 extends NIIx with NIIy {}
-//             ^^
-// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NIIy' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
 //                                  ^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
 
 // It's NOT OK to drop named parameters.
 abstract class N5 = NIIx with NII;
-//             ^^
-// [cfe] Class 'N5' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N5' introduces an erroneous override of 'id'.
 //                            ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N6 extends NIIx with NII {}
-//             ^^
-// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NII' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
 //                                  ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -139,45 +119,33 @@
 abstract class N7 = NIIx with NBABxy<int, int>;
 abstract class N8 extends NIIx with NBABxy<int, int> {}
 abstract class N9 = NIIx with NBABxy<String, int>;
-//             ^^
-// [cfe] Class 'N9' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N9' introduces an erroneous override of 'id'.
 //                            ^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N10 extends NIIx with NBABxy<String, int> {}
-//             ^^^
-// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NBABxy<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
 //                                   ^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N11 = NIIx with NTTy<int>;
-//             ^^^
-// [cfe] Class 'N11' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N11' introduces an erroneous override of 'id'.
 //                             ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N12 extends NIIx with NTTy<int> {}
-//             ^^^
-// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NTTy<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
 //                                   ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N13 = NIIx with NTTx<int>;
-//             ^^^
-// [cfe] Class 'N13' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N13' introduces an erroneous override of 'id'.
 //                             ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N14 extends NIIx with NTTx<int> {}
-//             ^^^
-// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NTTx<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
 //                                   ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -232,17 +200,13 @@
 abstract class O7 = OII with OBAB<int, int>;
 abstract class O8 extends OII with OBAB<int, int> {}
 abstract class O9 = OII with OBAB<String, int>;
-//             ^^
-// [cfe] Class 'O9' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'O9' introduces an erroneous override of 'id'.
 //                           ^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class O10 extends OII with OBAB<String, int> {}
-//             ^^^
-// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'OII with OBAB<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
 //                                  ^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class O11 = OII with OTTy<int>;
@@ -280,22 +244,16 @@
 }
 class G1 = GTTnum with MTTnum;
 class G2 = GTTnum with MTTint;
-//    ^^
-// [cfe] Class 'G2' inherits multiple members named 'id' with incompatible signatures.
 //    ^
 // [cfe] The mixin application class 'G2' introduces an erroneous override of 'id'.
 //                     ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 class G3 = GTTnum with MTT;
-//    ^^
-// [cfe] Class 'G3' inherits multiple members named 'id' with incompatible signatures.
 //    ^
 // [cfe] The mixin application class 'G3' introduces an erroneous override of 'id'.
 //                     ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 class G4 = GTTnum with MTTnumR;
-//    ^^
-// [cfe] Class 'G4' inherits multiple members named 'id' with incompatible signatures.
 //    ^
 // [cfe] The mixin application class 'G4' introduces an erroneous override of 'id'.
 //                     ^^^^^^^
diff --git a/tests/language/regress/regress33235_11_test.dart b/tests/language/regress/regress33235_11_test.dart
index 74710f4..74ccf45 100644
--- a/tests/language/regress/regress33235_11_test.dart
+++ b/tests/language/regress/regress33235_11_test.dart
@@ -14,6 +14,8 @@
   static int n() => 42;
   //         ^
   // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+  // [cfe] 'n' is already declared in this scope.
+  //         ^
   // [cfe] Conflicts with setter 'n'.
 }
 
diff --git a/tests/language_2/mixin/invalid_override_in_mixin_test.dart b/tests/language_2/mixin/invalid_override_in_mixin_test.dart
index bd79f66..de7b18c 100644
--- a/tests/language_2/mixin/invalid_override_in_mixin_test.dart
+++ b/tests/language_2/mixin/invalid_override_in_mixin_test.dart
@@ -14,8 +14,6 @@
 class C extends Object with A {
 //    ^
 // [cfe] Applying the mixin 'A' to 'Object' introduces an erroneous override of 'noSuchMethod'.
-//    ^
-// [cfe] Class 'Object with A' inherits multiple members named 'noSuchMethod' with incompatible signatures.
 //                          ^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
   test() {
diff --git a/tests/language_2/mixin/method_override_test.dart b/tests/language_2/mixin/method_override_test.dart
index 137156e..54844a9 100644
--- a/tests/language_2/mixin/method_override_test.dart
+++ b/tests/language_2/mixin/method_override_test.dart
@@ -21,34 +21,26 @@
 
 // Wrong return type.
 abstract class C1 = CII with CIS;
-//             ^^
-// [cfe] Class 'C1' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'C1' introduces an erroneous override of 'id'.
 //                           ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class C2 extends CII with CIS {}
-//             ^^
-// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'CII with CIS' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
 //                                 ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
 
 // Wrong argument type.
 abstract class C3 = CII with CSI;
-//             ^^
-// [cfe] Class 'C3' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'C3' introduces an erroneous override of 'id'.
 //                           ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class C4 extends CII with CSI {}
-//             ^^
-// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'CII with CSI' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
 //                                 ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -56,17 +48,13 @@
 abstract class C5 = CII with CTT<int>;
 abstract class C6 extends CII with CTT<int> {}
 abstract class C7  = CII with CTT<String>;
-//             ^^
-// [cfe] Class 'C7' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'C7' introduces an erroneous override of 'id'.
 //                            ^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class C8 extends CII with CTT<String> {}
-//             ^^
-// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'CII with CTT<String>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
 //                                 ^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -92,34 +80,26 @@
 abstract class N2 extends NIIx with NIIxy {}
 // It's NOT OK to rename named parameters.
 abstract class N3 = NIIx with NIIy;
-//             ^^
-// [cfe] Class 'N3' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N3' introduces an erroneous override of 'id'.
 //                            ^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N4 extends NIIx with NIIy {}
-//             ^^
-// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NIIy' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
 //                                  ^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
 
 // It's NOT OK to drop named parameters.
 abstract class N5 = NIIx with NII;
-//             ^^
-// [cfe] Class 'N5' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N5' introduces an erroneous override of 'id'.
 //                            ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N6 extends NIIx with NII {}
-//             ^^
-// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NII' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
 //                                  ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -139,45 +119,33 @@
 abstract class N7 = NIIx with NBABxy<int, int>;
 abstract class N8 extends NIIx with NBABxy<int, int> {}
 abstract class N9 = NIIx with NBABxy<String, int>;
-//             ^^
-// [cfe] Class 'N9' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N9' introduces an erroneous override of 'id'.
 //                            ^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N10 extends NIIx with NBABxy<String, int> {}
-//             ^^^
-// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NBABxy<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
 //                                   ^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N11 = NIIx with NTTy<int>;
-//             ^^^
-// [cfe] Class 'N11' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N11' introduces an erroneous override of 'id'.
 //                             ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N12 extends NIIx with NTTy<int> {}
-//             ^^^
-// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NTTy<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
 //                                   ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N13 = NIIx with NTTx<int>;
-//             ^^^
-// [cfe] Class 'N13' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'N13' introduces an erroneous override of 'id'.
 //                             ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class N14 extends NIIx with NTTx<int> {}
-//             ^^^
-// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'NIIx with NTTx<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
 //                                   ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 
@@ -232,17 +200,13 @@
 abstract class O7 = OII with OBAB<int, int>;
 abstract class O8 extends OII with OBAB<int, int> {}
 abstract class O9 = OII with OBAB<String, int>;
-//             ^^
-// [cfe] Class 'O9' inherits multiple members named 'id' with incompatible signatures.
 //             ^
 // [cfe] The mixin application class 'O9' introduces an erroneous override of 'id'.
 //                           ^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class O10 extends OII with OBAB<String, int> {}
-//             ^^^
-// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
 //             ^
-// [cfe] Class 'OII with OBAB<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
 //                                  ^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 abstract class O11 = OII with OTTy<int>;
@@ -280,22 +244,16 @@
 }
 class G1 = GTTnum with MTTnum;
 class G2 = GTTnum with MTTint;
-//    ^^
-// [cfe] Class 'G2' inherits multiple members named 'id' with incompatible signatures.
 //    ^
 // [cfe] The mixin application class 'G2' introduces an erroneous override of 'id'.
 //                     ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 class G3 = GTTnum with MTT;
-//    ^^
-// [cfe] Class 'G3' inherits multiple members named 'id' with incompatible signatures.
 //    ^
 // [cfe] The mixin application class 'G3' introduces an erroneous override of 'id'.
 //                     ^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
 class G4 = GTTnum with MTTnumR;
-//    ^^
-// [cfe] Class 'G4' inherits multiple members named 'id' with incompatible signatures.
 //    ^
 // [cfe] The mixin application class 'G4' introduces an erroneous override of 'id'.
 //                     ^^^^^^^
diff --git a/tests/language_2/regress/regress33235_11_test.dart b/tests/language_2/regress/regress33235_11_test.dart
index 74710f4..74ccf45 100644
--- a/tests/language_2/regress/regress33235_11_test.dart
+++ b/tests/language_2/regress/regress33235_11_test.dart
@@ -14,6 +14,8 @@
   static int n() => 42;
   //         ^
   // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+  // [cfe] 'n' is already declared in this scope.
+  //         ^
   // [cfe] Conflicts with setter 'n'.
 }