[cfe] Anonymous mixins -- propagate class modifiers and fix with base on clause

Implements the proposed spec for dart-lang/language#2830 and along the way, fixes another change with anonymous mixins erroring in on-clauses.

Change-Id: I15ed7370f9099d9de89d80f5844db76f58fbd216
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/284481
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
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 bc4b42c..f08ad33 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
@@ -293,6 +293,29 @@
     cls.isBase = isBase;
     cls.isInterface = isInterface;
     cls.isFinal = isFinal;
+
+    // Anonymous mixins have to propagate certain class modifiers.
+    if (cls.isAnonymousMixin) {
+      Class? superclass = cls.superclass;
+      Class? mixedInClass = cls.mixedInClass;
+      // If either [superclass] or [mixedInClass] is sealed, the current
+      // anonymous mixin is sealed.
+      if (superclass != null && superclass.isSealed ||
+          mixedInClass != null && mixedInClass.isSealed) {
+        cls.isSealed = true;
+      } else {
+        // Otherwise, if either [superclass] or [mixedInClass] is base or final,
+        // then the current anonymous mixin is final.
+        bool superclassIsBaseOrFinal =
+            superclass != null && (superclass.isBase || superclass.isFinal);
+        bool mixedInClassIsBaseOrFinal = mixedInClass != null &&
+            (mixedInClass.isBase || mixedInClass.isFinal);
+        if (superclassIsBaseOrFinal || mixedInClassIsBaseOrFinal) {
+          cls.isFinal = true;
+        }
+      }
+    }
+
     if (interfaceBuilders != null) {
       for (int i = 0; i < interfaceBuilders!.length; ++i) {
         interfaceBuilders![i] = _checkSupertype(interfaceBuilders![i]);
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index c99837d..2aa2507 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -2187,10 +2187,8 @@
                     .withArguments(supertypeDeclaration.fullNameForErrors),
                 supertypeBuilder.charOffset ?? TreeNode.noOffset,
                 noLength);
-          } else if (supertypeDeclaration.isFinal &&
-              // TODO(kallentu): Error case where the class has a singular on
-              // clause. Change with the new spec changes.
-              !cls.isMixinDeclaration) {
+          } else if (supertypeDeclaration.isFinal && !cls.isMixinDeclaration) {
+            // Error case where the class has a singular on-clause.
             cls.addProblem(
                 templateFinalClassExtendedOutsideOfLibrary
                     .withArguments(supertypeDeclaration.fullNameForErrors),
@@ -2202,8 +2200,7 @@
         // Report error for extending a sealed class outside of its library.
         if (isSealedClassEnabled(supertypeDeclaration) &&
             supertypeDeclaration.isSealed &&
-            // TODO(kallentu): Error case where the class has a singular on
-            // clause. Remove with the new spec changes.
+            // Error case where the class has a singular on-clause.
             !cls.isMixinDeclaration) {
           cls.addProblem(
               templateSealedClassSubtypeOutsideOfLibrary
@@ -2276,7 +2273,7 @@
           if (isClassModifiersEnabled(interfaceDeclaration)) {
             // Report an error for a class implementing a base class outside of
             // its library.
-            if (interfaceDeclaration.isBase) {
+            if (interfaceDeclaration.isBase && !cls.cls.isAnonymousMixin) {
               if (interfaceDeclaration.isMixinDeclaration) {
                 cls.addProblem(
                     templateBaseMixinImplementedOutsideOfLibrary
@@ -2291,8 +2288,6 @@
                     noLength);
               }
             } else if (interfaceDeclaration.isFinal &&
-                // TODO(kallentu): Error case where the class has multiple on
-                // clauses. Change with the new spec changes.
                 !cls.cls.isAnonymousMixin) {
               if (interfaceDeclaration.isMixinDeclaration) {
                 cls.addProblem(
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart
new file mode 100644
index 0000000..58a3ab0
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2023, 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.
+
+final mixin M1 {}
+sealed mixin M2 {}
+base class S {}
+
+final class C extends S with M1, M2 {}
+final class D = S with M1, M2;
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.strong.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.strong.expect
new file mode 100644
index 0000000..ea0aaef
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.strong.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract final class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract sealed class M2 extends core::Object /*isMixinDeclaration*/  {
+}
+base class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+}
+abstract final class _C&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1
+    : super self::S::•()
+    ;
+}
+abstract sealed class _C&S&M1&M2 = self::_C&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1&M2
+    : super self::_C&S&M1::•()
+    ;
+}
+final class C extends self::_C&S&M1&M2 {
+  synthetic constructor •() → self::C
+    : super self::_C&S&M1&M2::•()
+    ;
+}
+abstract final class _D&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&S&M1
+    : super self::S::•()
+    ;
+}
+final class D = self::_D&S&M1 with self::M2 {
+  synthetic constructor •() → self::D
+    : super self::_D&S&M1::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.strong.transformed.expect
new file mode 100644
index 0000000..1051437
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract final class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract sealed class M2 extends core::Object /*isMixinDeclaration*/  {
+}
+base class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+}
+abstract final class _C&S&M1 extends self::S implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&S&M1
+    : super self::S::•()
+    ;
+}
+abstract sealed class _C&S&M1&M2 extends self::_C&S&M1 implements self::M2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&S&M1&M2
+    : super self::_C&S&M1::•()
+    ;
+}
+final class C extends self::_C&S&M1&M2 {
+  synthetic constructor •() → self::C
+    : super self::_C&S&M1&M2::•()
+    ;
+}
+abstract final class _D&S&M1 extends self::S implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_D&S&M1
+    : super self::S::•()
+    ;
+}
+final class D extends self::_D&S&M1 implements self::M2 /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::D
+    : super self::_D&S&M1::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.textual_outline.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.textual_outline.expect
new file mode 100644
index 0000000..e2c8423
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+final
+mixin M1 {}
+sealed
+mixin M2 {}
+base class S {}
+final class C extends S with M1, M2 {}
+final class D = S with M1, M2;
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.expect
new file mode 100644
index 0000000..ea0aaef
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract final class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract sealed class M2 extends core::Object /*isMixinDeclaration*/  {
+}
+base class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+}
+abstract final class _C&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1
+    : super self::S::•()
+    ;
+}
+abstract sealed class _C&S&M1&M2 = self::_C&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1&M2
+    : super self::_C&S&M1::•()
+    ;
+}
+final class C extends self::_C&S&M1&M2 {
+  synthetic constructor •() → self::C
+    : super self::_C&S&M1&M2::•()
+    ;
+}
+abstract final class _D&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&S&M1
+    : super self::S::•()
+    ;
+}
+final class D = self::_D&S&M1 with self::M2 {
+  synthetic constructor •() → self::D
+    : super self::_D&S&M1::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..ea0aaef
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract final class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract sealed class M2 extends core::Object /*isMixinDeclaration*/  {
+}
+base class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+}
+abstract final class _C&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1
+    : super self::S::•()
+    ;
+}
+abstract sealed class _C&S&M1&M2 = self::_C&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1&M2
+    : super self::_C&S&M1::•()
+    ;
+}
+final class C extends self::_C&S&M1&M2 {
+  synthetic constructor •() → self::C
+    : super self::_C&S&M1&M2::•()
+    ;
+}
+abstract final class _D&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&S&M1
+    : super self::S::•()
+    ;
+}
+final class D = self::_D&S&M1 with self::M2 {
+  synthetic constructor •() → self::D
+    : super self::_D&S&M1::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.outline.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.outline.expect
new file mode 100644
index 0000000..b398883
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.outline.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract final class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract sealed class M2 extends core::Object /*isMixinDeclaration*/  {
+}
+base class S extends core::Object {
+  synthetic constructor •() → self::S
+    ;
+}
+abstract final class _C&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1
+    : super self::S::•()
+    ;
+}
+abstract sealed class _C&S&M1&M2 = self::_C&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&S&M1&M2
+    : super self::_C&S&M1::•()
+    ;
+}
+final class C extends self::_C&S&M1&M2 {
+  synthetic constructor •() → self::C
+    ;
+}
+abstract final class _D&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&S&M1
+    : super self::S::•()
+    ;
+}
+final class D = self::_D&S&M1 with self::M2 {
+  synthetic constructor •() → self::D
+    : super self::_D&S&M1::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.transformed.expect
new file mode 100644
index 0000000..1051437
--- /dev/null
+++ b/pkg/front_end/testcases/class_modifiers/anonymous_mixin.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract final class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract sealed class M2 extends core::Object /*isMixinDeclaration*/  {
+}
+base class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+}
+abstract final class _C&S&M1 extends self::S implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&S&M1
+    : super self::S::•()
+    ;
+}
+abstract sealed class _C&S&M1&M2 extends self::_C&S&M1 implements self::M2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&S&M1&M2
+    : super self::_C&S&M1::•()
+    ;
+}
+final class C extends self::_C&S&M1&M2 {
+  synthetic constructor •() → self::C
+    : super self::_C&S&M1&M2::•()
+    ;
+}
+abstract final class _D&S&M1 extends self::S implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_D&S&M1
+    : super self::S::•()
+    ;
+}
+final class D extends self::_D&S&M1 implements self::M2 /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::D
+    : super self::_D&S&M1::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart
index 8e002e8..dcadef6 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart
@@ -4,6 +4,14 @@
 
 import 'main_lib.dart';
 
-class ImplementsBaseClass implements A {}
+class ImplementsBaseClass implements A {} /* Error */
 
-class ImplementsBaseMixin implements M {}
+class ImplementsBaseMixin implements M {} /* Error */
+
+enum EnumImplementsBaseMixin implements M { x } /* Error */
+
+mixin MixinOnA on A {} /* Ok */
+
+mixin MixinOnM on M {} /* Ok */
+
+mixin MixinOnAM on A, M {} /* Ok */
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.expect
index 5299a30..f6d6674 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.expect
@@ -3,13 +3,17 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:7:38: Error: The class 'A' can't be implemented outside of its library because it's a base class.
-// class ImplementsBaseClass implements A {}
+// class ImplementsBaseClass implements A {} /* Error */
 //                                      ^
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:9:38: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
-// class ImplementsBaseMixin implements M {}
+// class ImplementsBaseMixin implements M {} /* Error */
 //                                      ^
 //
+// pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:11:41: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
+// enum EnumImplementsBaseMixin implements M { x } /* Error */
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 import "main_lib.dart" as mai;
@@ -26,6 +30,26 @@
     : super core::Object::•()
     ;
 }
+class EnumImplementsBaseMixin extends core::_Enum implements mai::M /*isEnum*/  {
+  static const field core::List<self::EnumImplementsBaseMixin> values = #C4;
+  enum-element static const field self::EnumImplementsBaseMixin x = #C3;
+  const constructor •(core::int #index, core::String #name) → self::EnumImplementsBaseMixin
+    : super core::_Enum::•(#index, #name)
+    ;
+  method _enumToString() → core::String
+    return "EnumImplementsBaseMixin.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnA extends mai::A /*isMixinDeclaration*/  {
+}
+abstract class MixinOnM extends mai::M /*isMixinDeclaration*/  {
+}
+abstract class _MixinOnAM&A&M extends core::Object implements mai::A, mai::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_MixinOnAM&A&M
+    : super core::Object::•()
+    ;
+}
+abstract class MixinOnAM extends self::_MixinOnAM&A&M /*isMixinDeclaration*/  {
+}
 
 library /*isNonNullableByDefault*/;
 import self as mai;
@@ -38,3 +62,17 @@
 }
 abstract base class M extends core::Object /*isMixinDeclaration*/  {
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "x"
+  #C3 = self::EnumImplementsBaseMixin {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsBaseMixin>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- EnumImplementsBaseMixin. (from org-dartlang-testcase:///main.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.transformed.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.transformed.expect
index 5299a30..f6d6674 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.strong.transformed.expect
@@ -3,13 +3,17 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:7:38: Error: The class 'A' can't be implemented outside of its library because it's a base class.
-// class ImplementsBaseClass implements A {}
+// class ImplementsBaseClass implements A {} /* Error */
 //                                      ^
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:9:38: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
-// class ImplementsBaseMixin implements M {}
+// class ImplementsBaseMixin implements M {} /* Error */
 //                                      ^
 //
+// pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:11:41: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
+// enum EnumImplementsBaseMixin implements M { x } /* Error */
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 import "main_lib.dart" as mai;
@@ -26,6 +30,26 @@
     : super core::Object::•()
     ;
 }
+class EnumImplementsBaseMixin extends core::_Enum implements mai::M /*isEnum*/  {
+  static const field core::List<self::EnumImplementsBaseMixin> values = #C4;
+  enum-element static const field self::EnumImplementsBaseMixin x = #C3;
+  const constructor •(core::int #index, core::String #name) → self::EnumImplementsBaseMixin
+    : super core::_Enum::•(#index, #name)
+    ;
+  method _enumToString() → core::String
+    return "EnumImplementsBaseMixin.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnA extends mai::A /*isMixinDeclaration*/  {
+}
+abstract class MixinOnM extends mai::M /*isMixinDeclaration*/  {
+}
+abstract class _MixinOnAM&A&M extends core::Object implements mai::A, mai::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_MixinOnAM&A&M
+    : super core::Object::•()
+    ;
+}
+abstract class MixinOnAM extends self::_MixinOnAM&A&M /*isMixinDeclaration*/  {
+}
 
 library /*isNonNullableByDefault*/;
 import self as mai;
@@ -38,3 +62,17 @@
 }
 abstract base class M extends core::Object /*isMixinDeclaration*/  {
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "x"
+  #C3 = self::EnumImplementsBaseMixin {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsBaseMixin>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- EnumImplementsBaseMixin. (from org-dartlang-testcase:///main.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline.expect
index bab98b9..322e35e 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline.expect
@@ -3,3 +3,9 @@
 class ImplementsBaseClass implements A {}
 
 class ImplementsBaseMixin implements M {}
+
+enum EnumImplementsBaseMixin implements M { x }
+
+mixin MixinOnA on A {}
+mixin MixinOnM on M {}
+mixin MixinOnAM on A, M {}
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline_modelled.expect
index bab98b9..cba6b4e 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.textual_outline_modelled.expect
@@ -3,3 +3,9 @@
 class ImplementsBaseClass implements A {}
 
 class ImplementsBaseMixin implements M {}
+
+enum EnumImplementsBaseMixin implements M { x }
+
+mixin MixinOnA on A {}
+mixin MixinOnAM on A, M {}
+mixin MixinOnM on M {}
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.expect
index 5299a30..3093c50 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.expect
@@ -3,13 +3,17 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:7:38: Error: The class 'A' can't be implemented outside of its library because it's a base class.
-// class ImplementsBaseClass implements A {}
+// class ImplementsBaseClass implements A {} /* Error */
 //                                      ^
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:9:38: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
-// class ImplementsBaseMixin implements M {}
+// class ImplementsBaseMixin implements M {} /* Error */
 //                                      ^
 //
+// pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:11:41: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
+// enum EnumImplementsBaseMixin implements M { x } /* Error */
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 import "main_lib.dart" as mai;
@@ -26,6 +30,26 @@
     : super core::Object::•()
     ;
 }
+class EnumImplementsBaseMixin extends core::_Enum implements mai::M /*isEnum*/  {
+  static const field core::List<self::EnumImplementsBaseMixin> values = #C4;
+  enum-element static const field self::EnumImplementsBaseMixin x = #C3;
+  const constructor •(core::int #index, core::String #name) → self::EnumImplementsBaseMixin
+    : super core::_Enum::•(#index, #name)
+    ;
+  method _enumToString() → core::String
+    return "EnumImplementsBaseMixin.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnA extends mai::A /*isMixinDeclaration*/  {
+}
+abstract class MixinOnM extends mai::M /*isMixinDeclaration*/  {
+}
+abstract class _MixinOnAM&A&M extends core::Object implements mai::A, mai::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_MixinOnAM&A&M
+    : super core::Object::•()
+    ;
+}
+abstract class MixinOnAM extends self::_MixinOnAM&A&M /*isMixinDeclaration*/  {
+}
 
 library /*isNonNullableByDefault*/;
 import self as mai;
@@ -38,3 +62,17 @@
 }
 abstract base class M extends core::Object /*isMixinDeclaration*/  {
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "x"
+  #C3 = self::EnumImplementsBaseMixin {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsBaseMixin*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- EnumImplementsBaseMixin. (from org-dartlang-testcase:///main.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.modular.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.modular.expect
index 1016bbf..14fc88b 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.modular.expect
@@ -3,13 +3,17 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:7:38: Error: The class 'A' can't be implemented outside of its library because it's a base class.
-// class ImplementsBaseClass implements A {}
+// class ImplementsBaseClass implements A {} /* Error */
 //                                      ^
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:9:38: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
-// class ImplementsBaseMixin implements M {}
+// class ImplementsBaseMixin implements M {} /* Error */
 //                                      ^
 //
+// pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:11:41: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
+// enum EnumImplementsBaseMixin implements M { x } /* Error */
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 import "main_lib.dart" as mai;
@@ -26,3 +30,37 @@
     : super core::Object::•()
     ;
 }
+class EnumImplementsBaseMixin extends core::_Enum implements mai::M /*isEnum*/  {
+  static const field core::List<self::EnumImplementsBaseMixin> values = #C4;
+  enum-element static const field self::EnumImplementsBaseMixin x = #C3;
+  const constructor •(core::int #index, core::String #name) → self::EnumImplementsBaseMixin
+    : super core::_Enum::•(#index, #name)
+    ;
+  method _enumToString() → core::String
+    return "EnumImplementsBaseMixin.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnA extends mai::A /*isMixinDeclaration*/  {
+}
+abstract class MixinOnM extends mai::M /*isMixinDeclaration*/  {
+}
+abstract class _MixinOnAM&A&M extends core::Object implements mai::A, mai::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_MixinOnAM&A&M
+    : super core::Object::•()
+    ;
+}
+abstract class MixinOnAM extends self::_MixinOnAM&A&M /*isMixinDeclaration*/  {
+}
+
+constants  {
+  #C1 = 0
+  #C2 = "x"
+  #C3 = self::EnumImplementsBaseMixin {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsBaseMixin*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- EnumImplementsBaseMixin. (from org-dartlang-testcase:///main.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.outline.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.outline.expect
index 3406058..f0460aa 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.outline.expect
@@ -3,13 +3,17 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:7:38: Error: The class 'A' can't be implemented outside of its library because it's a base class.
-// class ImplementsBaseClass implements A {}
+// class ImplementsBaseClass implements A {} /* Error */
 //                                      ^
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:9:38: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
-// class ImplementsBaseMixin implements M {}
+// class ImplementsBaseMixin implements M {} /* Error */
 //                                      ^
 //
+// pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:11:41: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
+// enum EnumImplementsBaseMixin implements M { x } /* Error */
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 import "main_lib.dart" as mai;
@@ -24,6 +28,25 @@
   synthetic constructor •() → self::ImplementsBaseMixin
     ;
 }
+class EnumImplementsBaseMixin extends core::_Enum implements mai::M /*isEnum*/  {
+  static const field core::List<self::EnumImplementsBaseMixin> values = const <self::EnumImplementsBaseMixin>[self::EnumImplementsBaseMixin::x];
+  enum-element static const field self::EnumImplementsBaseMixin x = const self::EnumImplementsBaseMixin::•(0, "x");
+  const constructor •(core::int #index, core::String #name) → self::EnumImplementsBaseMixin
+    : super core::_Enum::•(#index, #name)
+    ;
+  method _enumToString() → core::String
+    return "EnumImplementsBaseMixin.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnA extends mai::A /*isMixinDeclaration*/  {
+}
+abstract class MixinOnM extends mai::M /*isMixinDeclaration*/  {
+}
+abstract class _MixinOnAM&A&M extends core::Object implements mai::A, mai::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_MixinOnAM&A&M
+    ;
+}
+abstract class MixinOnAM extends self::_MixinOnAM&A&M /*isMixinDeclaration*/  {
+}
 
 library /*isNonNullableByDefault*/;
 import self as mai;
@@ -35,3 +58,9 @@
 }
 abstract base class M extends core::Object /*isMixinDeclaration*/  {
 }
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///main.dart:11:6 -> ListConstant(const <EnumImplementsBaseMixin*>[const EnumImplementsBaseMixin{_Enum.index: 0, _Enum._name: "x"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:11:45 -> InstanceConstant(const EnumImplementsBaseMixin{_Enum.index: 0, _Enum._name: "x"})
+Extra constant evaluation: evaluated: 7, effectively constant: 2
diff --git a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.transformed.expect b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.transformed.expect
index 5299a30..3093c50 100644
--- a/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart.weak.transformed.expect
@@ -3,13 +3,17 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:7:38: Error: The class 'A' can't be implemented outside of its library because it's a base class.
-// class ImplementsBaseClass implements A {}
+// class ImplementsBaseClass implements A {} /* Error */
 //                                      ^
 //
 // pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:9:38: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
-// class ImplementsBaseMixin implements M {}
+// class ImplementsBaseMixin implements M {} /* Error */
 //                                      ^
 //
+// pkg/front_end/testcases/class_modifiers/base/outside_library/main.dart:11:41: Error: The mixin 'M' can't be implemented outside of its library because it's a base mixin.
+// enum EnumImplementsBaseMixin implements M { x } /* Error */
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 import "main_lib.dart" as mai;
@@ -26,6 +30,26 @@
     : super core::Object::•()
     ;
 }
+class EnumImplementsBaseMixin extends core::_Enum implements mai::M /*isEnum*/  {
+  static const field core::List<self::EnumImplementsBaseMixin> values = #C4;
+  enum-element static const field self::EnumImplementsBaseMixin x = #C3;
+  const constructor •(core::int #index, core::String #name) → self::EnumImplementsBaseMixin
+    : super core::_Enum::•(#index, #name)
+    ;
+  method _enumToString() → core::String
+    return "EnumImplementsBaseMixin.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnA extends mai::A /*isMixinDeclaration*/  {
+}
+abstract class MixinOnM extends mai::M /*isMixinDeclaration*/  {
+}
+abstract class _MixinOnAM&A&M extends core::Object implements mai::A, mai::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_MixinOnAM&A&M
+    : super core::Object::•()
+    ;
+}
+abstract class MixinOnAM extends self::_MixinOnAM&A&M /*isMixinDeclaration*/  {
+}
 
 library /*isNonNullableByDefault*/;
 import self as mai;
@@ -38,3 +62,17 @@
 }
 abstract base class M extends core::Object /*isMixinDeclaration*/  {
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "x"
+  #C3 = self::EnumImplementsBaseMixin {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsBaseMixin*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- EnumImplementsBaseMixin. (from org-dartlang-testcase:///main.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.expect b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.expect
index 977d7aa..0eeec25 100644
--- a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.expect
@@ -47,7 +47,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixin&Object&M
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixin.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixin&_Enum&M
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.transformed.expect b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.transformed.expect
index bdcd274..66fce1d 100644
--- a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.strong.transformed.expect
@@ -47,7 +47,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _MixInFinalMixin&Object&M extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixin&Object&M extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixin&Object&M
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixin.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixin&_Enum&M extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixin&_Enum&M extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixin&_Enum&M
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.expect b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.expect
index b0a5a3d..74f5866 100644
--- a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.expect
@@ -47,7 +47,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixin&Object&M
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixin.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixin&_Enum&M
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.modular.expect b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.modular.expect
index bbb9362..a0a00aa 100644
--- a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.modular.expect
@@ -47,7 +47,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixin&Object&M
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixin.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixin&_Enum&M
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.outline.expect b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.outline.expect
index 89048c5..c83661d 100644
--- a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.outline.expect
@@ -44,7 +44,7 @@
   synthetic constructor •() → self::ImplementsFinalMixin
     ;
 }
-abstract class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixin&Object&M = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixin&Object&M
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixin.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixin&_Enum&M = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixin&_Enum&M
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.transformed.expect b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.transformed.expect
index 18057ff..a68c5e8 100644
--- a/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/outside_library/main.dart.weak.transformed.expect
@@ -47,7 +47,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _MixInFinalMixin&Object&M extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixin&Object&M extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixin&Object&M
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixin.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixin&_Enum&M extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixin&_Enum&M extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixin&_Enum&M
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.expect b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.expect
index 099eb7d..6af7956 100644
--- a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.expect
@@ -160,7 +160,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDef2.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef&Object&MTypeDef
     : super core::Object::•()
     ;
@@ -170,7 +170,7 @@
     : super self::_MixInFinalMixinTypeDef&Object&MTypeDef::•()
     ;
 }
-abstract class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef2&Object&MTypeDef2
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
     : super self::_MixInFinalMixinTypeDef2&Object&MTypeDef2::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef&_Enum&MTypeDef
     : super core::_Enum::•(index, _name)
     ;
@@ -194,7 +194,7 @@
   method _enumToString() → core::String
     return "EnumMixInFinalMixinTypeDef.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2
     : super core::_Enum::•(index, _name)
     ;
@@ -241,7 +241,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDefOutside.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef
     : super core::Object::•()
     ;
@@ -251,7 +251,7 @@
     : super self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.transformed.expect b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.transformed.expect
index 79a3fa4..0bed03c 100644
--- a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.strong.transformed.expect
@@ -160,7 +160,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDef2.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDef&Object&MTypeDef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef&Object&MTypeDef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef&Object&MTypeDef
     : super core::Object::•()
     ;
@@ -170,7 +170,7 @@
     : super self::_MixInFinalMixinTypeDef&Object&MTypeDef::•()
     ;
 }
-abstract class _MixInFinalMixinTypeDef2&Object&MTypeDef2 extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef2&Object&MTypeDef2 extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef2&Object&MTypeDef2
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
     : super self::_MixInFinalMixinTypeDef2&Object&MTypeDef2::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef&_Enum&MTypeDef
     : super core::_Enum::•(index, _name)
     ;
@@ -194,7 +194,7 @@
   method _enumToString() → core::String
     return "EnumMixInFinalMixinTypeDef.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2
     : super core::_Enum::•(index, _name)
     ;
@@ -241,7 +241,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDefOutside.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef
     : super core::Object::•()
     ;
@@ -251,7 +251,7 @@
     : super self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.expect b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.expect
index 10e52de..e49cc53 100644
--- a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.expect
@@ -160,7 +160,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDef2.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef&Object&MTypeDef
     : super core::Object::•()
     ;
@@ -170,7 +170,7 @@
     : super self::_MixInFinalMixinTypeDef&Object&MTypeDef::•()
     ;
 }
-abstract class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef2&Object&MTypeDef2
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
     : super self::_MixInFinalMixinTypeDef2&Object&MTypeDef2::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef&_Enum&MTypeDef
     : super core::_Enum::•(index, _name)
     ;
@@ -194,7 +194,7 @@
   method _enumToString() → core::String
     return "EnumMixInFinalMixinTypeDef.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2
     : super core::_Enum::•(index, _name)
     ;
@@ -241,7 +241,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDefOutside.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef
     : super core::Object::•()
     ;
@@ -251,7 +251,7 @@
     : super self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.modular.expect b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.modular.expect
index 2e7c78f..2361f95 100644
--- a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.modular.expect
@@ -160,7 +160,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDef2.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef&Object&MTypeDef
     : super core::Object::•()
     ;
@@ -170,7 +170,7 @@
     : super self::_MixInFinalMixinTypeDef&Object&MTypeDef::•()
     ;
 }
-abstract class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef2&Object&MTypeDef2
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
     : super self::_MixInFinalMixinTypeDef2&Object&MTypeDef2::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef&_Enum&MTypeDef
     : super core::_Enum::•(index, _name)
     ;
@@ -194,7 +194,7 @@
   method _enumToString() → core::String
     return "EnumMixInFinalMixinTypeDef.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2
     : super core::_Enum::•(index, _name)
     ;
@@ -241,7 +241,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDefOutside.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef
     : super core::Object::•()
     ;
@@ -251,7 +251,7 @@
     : super self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.outline.expect b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.outline.expect
index ea80aa9..c4ec191 100644
--- a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.outline.expect
@@ -154,7 +154,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDef2.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef&Object&MTypeDef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef&Object&MTypeDef
     : super core::Object::•()
     ;
@@ -163,7 +163,7 @@
   synthetic constructor •() → self::MixInFinalMixinTypeDef
     ;
 }
-abstract class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef2&Object&MTypeDef2 = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef2&Object&MTypeDef2
     : super core::Object::•()
     ;
@@ -172,7 +172,7 @@
   synthetic constructor •() → self::MixInFinalMixinTypeDef2
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef&_Enum&MTypeDef
     : super core::_Enum::•(index, _name)
     ;
@@ -185,7 +185,7 @@
   method _enumToString() → core::String
     return "EnumMixInFinalMixinTypeDef.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2
     : super core::_Enum::•(index, _name)
     ;
@@ -228,7 +228,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDefOutside.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef = core::Object with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef
     : super core::Object::•()
     ;
@@ -237,7 +237,7 @@
   synthetic constructor •() → self::MixInFinalMixinTypeDefOutside
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef = core::_Enum with mai::M /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.transformed.expect b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.transformed.expect
index 7bd5e60..4fb59ee 100644
--- a/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/final/typedef/main.dart.weak.transformed.expect
@@ -160,7 +160,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDef2.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDef&Object&MTypeDef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef&Object&MTypeDef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef&Object&MTypeDef
     : super core::Object::•()
     ;
@@ -170,7 +170,7 @@
     : super self::_MixInFinalMixinTypeDef&Object&MTypeDef::•()
     ;
 }
-abstract class _MixInFinalMixinTypeDef2&Object&MTypeDef2 extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDef2&Object&MTypeDef2 extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDef2&Object&MTypeDef2
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
     : super self::_MixInFinalMixinTypeDef2&Object&MTypeDef2::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef&_Enum&MTypeDef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef&_Enum&MTypeDef
     : super core::_Enum::•(index, _name)
     ;
@@ -194,7 +194,7 @@
   method _enumToString() → core::String
     return "EnumMixInFinalMixinTypeDef.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2 extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDef2&_Enum&MTypeDef2
     : super core::_Enum::•(index, _name)
     ;
@@ -241,7 +241,7 @@
   method _enumToString() → core::String
     return "EnumImplementsFinalMixinTypeDefOutside.${this.{core::_Enum::_name}{core::String}}";
 }
-abstract class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef extends core::Object implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef
     : super core::Object::•()
     ;
@@ -251,7 +251,7 @@
     : super self::_MixInFinalMixinTypeDefOutside&Object&MOutsideTypedef::•()
     ;
 }
-abstract class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract final class _EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef extends core::_Enum implements mai::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_EnumMixInFinalMixinTypeDefOutside&_Enum&MOutsideTypedef
     : super core::_Enum::•(index, _name)
     ;
diff --git a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.expect b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.expect
index c43e40c..e24e68b 100644
--- a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.expect
+++ b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class3&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.transformed.expect b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.transformed.expect
index 5b322e2..80f0a3d 100644
--- a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.strong.transformed.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _Class3&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract sealed class _Class3&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class3&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.expect b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.expect
index c43e40c..e24e68b 100644
--- a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.expect
+++ b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class3&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.modular.expect b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.modular.expect
index 714fd7d..aa1c279 100644
--- a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.modular.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class3&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.outline.expect b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.outline.expect
index 0ae730f..00a0399 100644
--- a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.outline.expect
@@ -32,7 +32,7 @@
   synthetic constructor •() → self::Class2
     ;
 }
-abstract class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class3&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class3&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.transformed.expect b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.transformed.expect
index 5b322e2..80f0a3d 100644
--- a/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class _Class3&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract sealed class _Class3&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class3&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.expect b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.expect
index 2083929..90103ef 100644
--- a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.expect
+++ b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.expect
@@ -12,7 +12,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class1&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.transformed.expect b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.transformed.expect
index 571fd01..b7ef75a0 100644
--- a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class _Class1&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract sealed class _Class1&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class1&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.expect b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.expect
index 2083929..90103ef 100644
--- a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.expect
+++ b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.expect
@@ -12,7 +12,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class1&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.modular.expect b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.modular.expect
index 07a1813..6b5c11f 100644
--- a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.modular.expect
@@ -12,7 +12,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class1&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.outline.expect b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.outline.expect
index cb4589e..34829b4 100644
--- a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.outline.expect
@@ -12,7 +12,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
+abstract sealed class _Class1&Object&Sealed = core::Object with mai::Sealed /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class1&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.transformed.expect b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.transformed.expect
index 571fd01..b7ef75a0 100644
--- a/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/sealed_class/mixin_with/main.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class _Class1&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+abstract sealed class _Class1&Object&Sealed extends core::Object implements mai::Sealed /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_Class1&Object&Sealed
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 70e2929..1c17474 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -21,6 +21,7 @@
 regress/issue_39091_2: EmptyOutput
 regress/utf_16_le_content.crash: EmptyOutput
 
+class_modifiers/anonymous_mixin: FormatterCrash
 class_modifiers/base/base_class_declaration: FormatterCrash
 class_modifiers/final/final_class_declaration: FormatterCrash
 class_modifiers/interface/interface_class_declaration: FormatterCrash