[vm] Fix tree-shaking of mixin applications when mixin has a member with entry point pragma

Cloned static members of mixins are not used (dead code) and usually
tree shaken in AOT mode. However, if static member is annotated with
@pragma('vm:entry-point'), its clone in the mixin application is
also retained. If such mixin application is not used, tree shaker
drops its supertypes which removes the link from mixin application to
the original mixin. As a result, gen_snapshot crashes when trying
to access original mixin in order to print qualified name of the member.

The first part of the fix is to avoid cloning static members into
mixin applications, which would allow tree shaker to remove unused
mixin applications entirely. This change also reduces size of
the non-AOT kernel binaries.

However, instance members of mixins are cloned
and they could be annotated with entry point pragmas too.

The second part of the fix is to clear isEliminatedMixin flag
in tree shaker when dropping supertypes.

TEST=pkg/front_end/testcases/general/mixin_with_static_member.dart
TEST=pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart

Fixes https://github.com/flutter/flutter/issues/160030

Change-Id: I1b36c4a7f64a4530c8b4799ec785f1077ce65de6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403963
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries.dart.strong.transformed.expect b/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries.dart.strong.transformed.expect
index 9207be4..5cbaf29 100644
--- a/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries.dart.strong.transformed.expect
@@ -20,15 +20,12 @@
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
-import "dart:convert" as con;
 
 abstract class _A&Object&Comparable extends core::Object implements core::Comparable<core::int> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_A&Object&Comparable
     : super core::Object::•()
     ;
   abstract method /* from org-dartlang-sdk:///sdk/lib/core/comparable.dart */ compareTo(covariant-by-class core::int other) → core::int;
-  static method /* from org-dartlang-sdk:///sdk/lib/core/comparable.dart */ compare(core::Comparable<dynamic> a, core::Comparable<dynamic> b) → core::int
-    return a.{core::Comparable::compareTo}(b){(dynamic) → core::int};
 }
 class A extends self::_A&Object&Comparable {
   synthetic constructor •() → self::A
@@ -46,33 +43,6 @@
   @#C4
   get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ stackTrace() → core::StackTrace?
     return this.{core::Error::_stackTrace}{core::StackTrace?};
-  static method /* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ safeToString(core::Object? object) → core::String {
-    if(object is core::num || object is core::bool || object == null) {
-      return object.{core::Object::toString}{<object>}.(){() → core::String};
-    }
-    if(object{core::Object} is core::String) {
-      return core::Error::_stringToSafeString(object{core::String});
-    }
-    return core::Error::_objectToString(object{core::Object});
-  }
-  @#C4
-  static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _stringToSafeString(core::String string) → core::String {
-    return #C5.{con::JsonCodec::encode}(string){(core::Object?, {toEncodable: (dynamic) →? core::Object?}) → core::String};
-  }
-  @#C4
-  static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _objectToString(core::Object object) → core::String {
-    return core::Object::_toString(object);
-  }
-  @#C7
-  static method /* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ throwWithStackTrace(core::Object error, core::StackTrace stackTrace) → Never {
-    _in::checkNotNullable<core::Object>(error, "error");
-    _in::checkNotNullable<core::StackTrace>(stackTrace, "stackTrace");
-    core::Error::_throw(error, stackTrace);
-  }
-  @#C4
-  @#C10
-  @/* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ #C12
-  external static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _throw(core::Object error, core::StackTrace stackTrace) → Never;
 }
 class B extends self::_B&Object&Error {
   synthetic constructor •() → self::B
@@ -85,12 +55,4 @@
   #C2 = null
   #C3 = core::pragma {name:#C1, options:#C2}
   #C4 = _in::_Patch {}
-  #C5 = con::JsonCodec {_reviver:#C2, _toEncodable:#C2}
-  #C6 = "2.16"
-  #C7 = _in::Since {version:#C6}
-  #C8 = "vm:external-name"
-  #C9 = "Error_throwWithStackTrace"
-  #C10 = core::pragma {name:#C8, options:#C9}
-  #C11 = "wasm:entry-point"
-  #C12 = core::pragma {name:#C11, options:#C2}
 }
diff --git a/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries_legacy.dart.strong.transformed.expect b/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries_legacy.dart.strong.transformed.expect
index 0b98e4b..c7f5daf 100644
--- a/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries_legacy.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/class_modifiers/mixin/mixin_class_core_libraries_legacy.dart.strong.transformed.expect
@@ -12,15 +12,12 @@
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
-import "dart:convert" as con;
 
 abstract class _A&Object&Comparable extends core::Object implements core::Comparable<core::int> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_A&Object&Comparable
     : super core::Object::•()
     ;
   abstract method /* from org-dartlang-sdk:///sdk/lib/core/comparable.dart */ compareTo(covariant-by-class core::int other) → core::int;
-  static method /* from org-dartlang-sdk:///sdk/lib/core/comparable.dart */ compare(core::Comparable<dynamic> a, core::Comparable<dynamic> b) → core::int
-    return a.{core::Comparable::compareTo}(b){(dynamic) → core::int};
 }
 class A extends self::_A&Object&Comparable {
   synthetic constructor •() → self::A
@@ -38,33 +35,6 @@
   @#C4
   get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ stackTrace() → core::StackTrace?
     return this.{core::Error::_stackTrace}{core::StackTrace?};
-  static method /* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ safeToString(core::Object? object) → core::String {
-    if(object is core::num || object is core::bool || object == null) {
-      return object.{core::Object::toString}{<object>}.(){() → core::String};
-    }
-    if(object{core::Object} is core::String) {
-      return core::Error::_stringToSafeString(object{core::String});
-    }
-    return core::Error::_objectToString(object{core::Object});
-  }
-  @#C4
-  static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _stringToSafeString(core::String string) → core::String {
-    return #C5.{con::JsonCodec::encode}(string){(core::Object?, {toEncodable: (dynamic) →? core::Object?}) → core::String};
-  }
-  @#C4
-  static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _objectToString(core::Object object) → core::String {
-    return core::Object::_toString(object);
-  }
-  @#C7
-  static method /* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ throwWithStackTrace(core::Object error, core::StackTrace stackTrace) → Never {
-    _in::checkNotNullable<core::Object>(error, "error");
-    _in::checkNotNullable<core::StackTrace>(stackTrace, "stackTrace");
-    core::Error::_throw(error, stackTrace);
-  }
-  @#C4
-  @#C10
-  @/* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ #C12
-  external static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _throw(core::Object error, core::StackTrace stackTrace) → Never;
 }
 class B extends self::_B&Object&Error {
   synthetic constructor •() → self::B
@@ -77,12 +47,4 @@
   #C2 = null
   #C3 = core::pragma {name:#C1, options:#C2}
   #C4 = _in::_Patch {}
-  #C5 = con::JsonCodec {_reviver:#C2, _toEncodable:#C2}
-  #C6 = "2.16"
-  #C7 = _in::Since {version:#C6}
-  #C8 = "vm:external-name"
-  #C9 = "Error_throwWithStackTrace"
-  #C10 = core::pragma {name:#C8, options:#C9}
-  #C11 = "wasm:entry-point"
-  #C12 = core::pragma {name:#C11, options:#C2}
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect
index b86ef6f..4d467bd 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.strong.transformed.expect
@@ -48,8 +48,6 @@
     (core::int) → core::int f3 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
     core::String f3TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
   }
-  static method mstat<T extends core::Object? = dynamic>(self::_D&C&M::mstat::T% value) → self::_D&C&M::mstat::T%
-    return value;
 }
 class D extends self::_D&C&M {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/general/hierarchy/static.dart.strong.transformed.expect b/pkg/front_end/testcases/general/hierarchy/static.dart.strong.transformed.expect
index 9ef6ff7..76e8d68 100644
--- a/pkg/front_end/testcases/general/hierarchy/static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/hierarchy/static.dart.strong.transformed.expect
@@ -121,9 +121,6 @@
   method mixedInInstanceDeclaredStaticMethod() → void {}
   method mixedInInstanceImplementedStaticMethod() → void {}
   method extendedStaticMixedInInstanceMethod() → void {}
-  static method mixedInStaticDeclaredInstanceMethod() → void {}
-  static method mixedInStaticImplementedInstanceMethod() → void {}
-  static method extendedInstanceMixedInStaticMethod() → void {}
 }
 abstract class Class extends self::_Class&Super&Mixin implements self::Interface {
   synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/general/issue40982.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40982.dart.strong.transformed.expect
index b0e5807..05002fd 100644
--- a/pkg/front_end/testcases/general/issue40982.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40982.dart.strong.transformed.expect
@@ -22,7 +22,6 @@
   static const field core::int value = #C1;
 }
 abstract class _C1&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
-  static const field core::int value = #C1;
   const synthetic constructor •() → self::_C1&A&B
     : super self::A::•()
     ;
@@ -33,7 +32,6 @@
     ;
 }
 class C2 extends self::A implements self::B /*isEliminatedMixin,hasConstConstructor*/  {
-  static const field core::int value = #C1;
   const synthetic constructor •() → self::C2
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue52302.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue52302.dart.strong.transformed.expect
index 1e5d3a5..c4aa16c 100644
--- a/pkg/front_end/testcases/general/issue52302.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue52302.dart.strong.transformed.expect
@@ -242,45 +242,6 @@
   }
   method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ toString() → core::String
     return core::Iterable::iterableToShortString(this, "(", ")");
-  static method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ castFrom<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::castFrom::S%> source) → core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::castFrom::T%>
-    return _in::CastIterable::•<self::_MixesInMixesInMixin&Object&MixesInMixin::castFrom::S%, self::_MixesInMixesInMixin&Object&MixesInMixin::castFrom::T%>(source);
-  static method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ iterableToShortString(core::Iterable<dynamic> iterable, [core::String leftDelimiter = #C4, core::String rightDelimiter = #C5]) → core::String {
-    if(_in::isToStringVisiting(iterable)) {
-      if(leftDelimiter =={core::String::==}{(core::Object) → core::bool} "(" && rightDelimiter =={core::String::==}{(core::Object) → core::bool} ")") {
-        return "(...)";
-      }
-      return "${leftDelimiter}...${rightDelimiter}";
-    }
-    core::List<core::String> parts = core::_GrowableList::•<core::String>(0);
-    _in::toStringVisiting.{core::List::add}(iterable){(core::Object) → void};
-    try {
-      core::_iterablePartsToStrings(iterable, parts);
-    }
-    finally {
-      assert(core::identical(_in::toStringVisiting.{core::Iterable::last}{core::Object}, iterable));
-      _in::toStringVisiting.{core::List::removeLast}(){() → core::Object};
-    }
-    return (let final core::StringBuffer #t2 = new core::StringBuffer::•(leftDelimiter) in block {
-      #t2.{core::StringBuffer::writeAll}(parts, ", "){(core::Iterable<dynamic>, [core::String]) → void};
-      #t2.{core::StringBuffer::write}(rightDelimiter){(core::Object?) → void};
-    } =>#t2).{core::StringBuffer::toString}(){() → core::String};
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ iterableToFullString(core::Iterable<dynamic> iterable, [core::String leftDelimiter = #C4, core::String rightDelimiter = #C5]) → core::String {
-    if(_in::isToStringVisiting(iterable)) {
-      return "${leftDelimiter}...${rightDelimiter}";
-    }
-    core::StringBuffer buffer = new core::StringBuffer::•(leftDelimiter);
-    _in::toStringVisiting.{core::List::add}(iterable){(core::Object) → void};
-    try {
-      buffer.{core::StringBuffer::writeAll}(iterable, ", "){(core::Iterable<dynamic>, [core::String]) → void};
-    }
-    finally {
-      assert(core::identical(_in::toStringVisiting.{core::Iterable::last}{core::Object}, iterable));
-      _in::toStringVisiting.{core::List::removeLast}(){() → core::Object};
-    }
-    buffer.{core::StringBuffer::write}(rightDelimiter){(core::Object?) → void};
-    return buffer.{core::StringBuffer::toString}(){() → core::String};
-  }
 }
 abstract base class MixesInMixesInMixin extends self::_MixesInMixesInMixin&Object&MixesInMixin {
   synthetic constructor •() → self::MixesInMixesInMixin
@@ -390,10 +351,10 @@
     }
     else {
       do {
-        let final core::StringBuffer #t3 = buffer in block {
-          #t3.{core::StringBuffer::write}(separator){(core::Object?) → void};
-          #t3.{core::StringBuffer::write}(iterator.{core::Iterator::current}{core::int}.{core::Object::toString}{<object>}.(){() → core::String}){(core::Object?) → void};
-        } =>#t3;
+        let final core::StringBuffer #t2 = buffer in block {
+          #t2.{core::StringBuffer::write}(separator){(core::Object?) → void};
+          #t2.{core::StringBuffer::write}(iterator.{core::Iterator::current}{core::int}.{core::Object::toString}{<object>}.(){() → core::String}){(core::Object?) → void};
+        } =>#t2;
       }
       while (iterator.{core::Iterator::moveNext}(){() → core::bool})
     }
@@ -530,51 +491,10 @@
   }
   method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ toString() → core::String
     return core::Iterable::iterableToShortString(this, "(", ")");
-  static method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ castFrom<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(core::Iterable<iss::MixesInMixin::castFrom::S%> source) → core::Iterable<iss::MixesInMixin::castFrom::T%>
-    return _in::CastIterable::•<iss::MixesInMixin::castFrom::S%, iss::MixesInMixin::castFrom::T%>(source);
-  static method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ iterableToShortString(core::Iterable<dynamic> iterable, [core::String leftDelimiter = #C4, core::String rightDelimiter = #C5]) → core::String {
-    if(_in::isToStringVisiting(iterable)) {
-      if(leftDelimiter =={core::String::==}{(core::Object) → core::bool} "(" && rightDelimiter =={core::String::==}{(core::Object) → core::bool} ")") {
-        return "(...)";
-      }
-      return "${leftDelimiter}...${rightDelimiter}";
-    }
-    core::List<core::String> parts = core::_GrowableList::•<core::String>(0);
-    _in::toStringVisiting.{core::List::add}(iterable){(core::Object) → void};
-    try {
-      core::_iterablePartsToStrings(iterable, parts);
-    }
-    finally {
-      assert(core::identical(_in::toStringVisiting.{core::Iterable::last}{core::Object}, iterable));
-      _in::toStringVisiting.{core::List::removeLast}(){() → core::Object};
-    }
-    return (let final core::StringBuffer #t4 = new core::StringBuffer::•(leftDelimiter) in block {
-      #t4.{core::StringBuffer::writeAll}(parts, ", "){(core::Iterable<dynamic>, [core::String]) → void};
-      #t4.{core::StringBuffer::write}(rightDelimiter){(core::Object?) → void};
-    } =>#t4).{core::StringBuffer::toString}(){() → core::String};
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/core/iterable.dart */ iterableToFullString(core::Iterable<dynamic> iterable, [core::String leftDelimiter = #C4, core::String rightDelimiter = #C5]) → core::String {
-    if(_in::isToStringVisiting(iterable)) {
-      return "${leftDelimiter}...${rightDelimiter}";
-    }
-    core::StringBuffer buffer = new core::StringBuffer::•(leftDelimiter);
-    _in::toStringVisiting.{core::List::add}(iterable){(core::Object) → void};
-    try {
-      buffer.{core::StringBuffer::writeAll}(iterable, ", "){(core::Iterable<dynamic>, [core::String]) → void};
-    }
-    finally {
-      assert(core::identical(_in::toStringVisiting.{core::Iterable::last}{core::Object}, iterable));
-      _in::toStringVisiting.{core::List::removeLast}(){() → core::Object};
-    }
-    buffer.{core::StringBuffer::write}(rightDelimiter){(core::Object?) → void};
-    return buffer.{core::StringBuffer::toString}(){() → core::String};
-  }
 }
 
 constants  {
   #C1 = ""
   #C2 = true
   #C3 = null
-  #C4 = "("
-  #C5 = ")"
 }
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect
index 619b760..6fc9964 100644
--- a/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect
@@ -6,8 +6,6 @@
   synthetic constructor •() → self::_A&B&M
     : super self::B::•()
     ;
-  static method m() → core::Object
-    return new core::Object::•();
 }
 class A extends self::_A&B&M {
   synthetic constructor •() → self::A
diff --git a/pkg/front_end/testcases/general/type_scopes.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_scopes.dart.strong.transformed.expect
index f3bdb6b..0101b02 100644
--- a/pkg/front_end/testcases/general/type_scopes.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_scopes.dart.strong.transformed.expect
@@ -56,12 +56,10 @@
 }
 class NamedMixinApplication<T9 extends dynamic> extends self::Class<self::NamedMixinApplication::T9%> implements self::Mixin<self::NamedMixinApplication::T9%> /*isEliminatedMixin*/  {
   field dynamic instanceField = null;
-  static field dynamic staticField = null;
   synthetic constructor •(self::NamedMixinApplication::T9% t3) → self::NamedMixinApplication<self::NamedMixinApplication::T9%>
     : super self::Class::•(t3)
     ;
   method instanceMethod<T7 extends dynamic>(covariant-by-class self::NamedMixinApplication::T9% t6, self::NamedMixinApplication::instanceMethod::T7% t7) → void {}
-  static method staticMethod<T8 extends dynamic>(self::NamedMixinApplication::staticMethod::T8% t8) → void {}
 }
 abstract class _Enum&_Enum&M<T10 extends dynamic> extends core::_Enum implements self::M<self::_Enum&_Enum&M::T10%> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
   const synthetic constructor •(core::int index, core::String _name) → self::_Enum&_Enum&M<self::_Enum&_Enum&M::T10%>
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.1.expect
index 7326ea5..c389fe8 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.1.expect
@@ -502,11 +502,6 @@
       return new dart._internal::ReversedListIterable::•<dart.core::int>(this);
     method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → dart.core::String
       return dart.collection::ListBase::listToString(this);
-    static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ _compareAny(dynamic a, dynamic b) → dart.core::int {
-      return dart.core::Comparable::compare(a as dart.core::Comparable<dynamic>, b as dart.core::Comparable<dynamic>);
-    }
-    static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ listToString(dart.core::List<dart.core::Object?> list) → dart.core::String
-      return dart.core::Iterable::iterableToFullString(list, "[", "]");
   }
   class WithListMixin extends main::_WithListMixin&Object&ListMixin {
     field dart.core::int length = 2;
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.2.expect
index 7326ea5..c389fe8 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_22.yaml.world.2.expect
@@ -502,11 +502,6 @@
       return new dart._internal::ReversedListIterable::•<dart.core::int>(this);
     method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → dart.core::String
       return dart.collection::ListBase::listToString(this);
-    static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ _compareAny(dynamic a, dynamic b) → dart.core::int {
-      return dart.core::Comparable::compare(a as dart.core::Comparable<dynamic>, b as dart.core::Comparable<dynamic>);
-    }
-    static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ listToString(dart.core::List<dart.core::Object?> list) → dart.core::String
-      return dart.core::Iterable::iterableToFullString(list, "[", "]");
   }
   class WithListMixin extends main::_WithListMixin&Object&ListMixin {
     field dart.core::int length = 2;
diff --git a/pkg/front_end/testcases/patterns/access_order.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/access_order.dart.strong.transformed.expect
index 10f49c0..f1a3725 100644
--- a/pkg/front_end/testcases/patterns/access_order.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/access_order.dart.strong.transformed.expect
@@ -507,11 +507,6 @@
     return new _in::ReversedListIterable::•<self::_MyList&Object&ListMixin::E%>(this);
   method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → core::String
     return col::ListBase::listToString(this);
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ _compareAny(dynamic a, dynamic b) → core::int {
-    return core::Comparable::compare(a as core::Comparable<dynamic>, b as core::Comparable<dynamic>);
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ listToString(core::List<core::Object?> list) → core::String
-    return core::Iterable::iterableToFullString(list, "[", "]");
 }
 class MyList<E extends core::Object? = dynamic> extends self::_MyList&Object&ListMixin<self::MyList::E%> {
   final field core::List<self::MyList::E%> list;
@@ -654,4 +649,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:462:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:471:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:480:12 -> IntConstant(-1)
-Extra constant evaluation: evaluated: 1239, effectively constant: 4
+Extra constant evaluation: evaluated: 1232, effectively constant: 4
diff --git a/pkg/front_end/testcases/patterns/cache_lookups.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/cache_lookups.dart.strong.transformed.expect
index 79237dc..d454194 100644
--- a/pkg/front_end/testcases/patterns/cache_lookups.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/cache_lookups.dart.strong.transformed.expect
@@ -574,11 +574,6 @@
     return new _in::ReversedListIterable::•<cac::_CustomList&Object&ListMixin::E%>(this);
   method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → core::String
     return col::ListBase::listToString(this);
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ _compareAny(dynamic a, dynamic b) → core::int {
-    return core::Comparable::compare(a as core::Comparable<dynamic>, b as core::Comparable<dynamic>);
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ listToString(core::List<core::Object?> list) → core::String
-    return core::Iterable::iterableToFullString(list, "[", "]");
 }
 class CustomList<E extends core::Object? = dynamic> extends cac::_CustomList&Object&ListMixin<cac::CustomList::E%> {
   final field core::List<cac::CustomList::E%> list;
@@ -616,4 +611,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:462:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:471:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:480:12 -> IntConstant(-1)
-Extra constant evaluation: evaluated: 1215, effectively constant: 4
+Extra constant evaluation: evaluated: 1208, effectively constant: 4
diff --git a/pkg/front_end/testcases/patterns/caching_constants.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/caching_constants.dart.strong.transformed.expect
index 8e3f3e7..55b7e38 100644
--- a/pkg/front_end/testcases/patterns/caching_constants.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/caching_constants.dart.strong.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
-import "dart:_internal" as _in;
 
 import "dart:collection";
 
@@ -134,61 +133,6 @@
     return new col::_MapBaseValueIterable::•<self::_MyMap&Object&MapMixin::K%, self::_MyMap&Object&MapMixin::V%>(this);
   method /* from org-dartlang-sdk:///sdk/lib/collection/maps.dart */ toString() → core::String
     return col::MapBase::mapToString(this);
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/maps.dart */ mapToString(core::Map<core::Object?, core::Object?> m) → core::String {
-    if(_in::isToStringVisiting(m)) {
-      return "{...}";
-    }
-    core::StringBuffer result = new core::StringBuffer::•();
-    try {
-      _in::toStringVisiting.{core::List::add}(m){(core::Object) → void};
-      result.{core::StringBuffer::write}("{"){(core::Object?) → void};
-      core::bool first = true;
-      m.{core::Map::forEach}((core::Object? k, core::Object? v) → void {
-        if(!first) {
-          result.{core::StringBuffer::write}(", "){(core::Object?) → void};
-        }
-        first = false;
-        result.{core::StringBuffer::write}(k){(core::Object?) → void};
-        result.{core::StringBuffer::write}(": "){(core::Object?) → void};
-        result.{core::StringBuffer::write}(v){(core::Object?) → void};
-      }){((core::Object?, core::Object?) → void) → void};
-      result.{core::StringBuffer::write}("}"){(core::Object?) → void};
-    }
-    finally {
-      assert(core::identical(_in::toStringVisiting.{core::Iterable::last}{core::Object}, m));
-      _in::toStringVisiting.{core::List::removeLast}(){() → core::Object};
-    }
-    return result.{core::StringBuffer::toString}(){() → core::String};
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/maps.dart */ _fillMapWithMappedIterable(core::Map<core::Object?, core::Object?> map, core::Iterable<core::Object?> iterable, (core::Object?) →? core::Object? key, (core::Object?) →? core::Object? value) → void {
-    key == null ?{(core::Object?) →? core::Object?} key = #C2 : null;
-    value == null ?{(core::Object?) →? core::Object?} value = #C2 : null;
-    {
-      synthesized core::Iterator<core::Object?> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<core::Object?>};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-        core::Object? element = :sync-for-iterator.{core::Iterator::current}{core::Object?};
-        {
-          map.{core::Map::[]=}(key{(core::Object?) → core::Object?}(element){(core::Object?) → core::Object?}, value{(core::Object?) → core::Object?}(element){(core::Object?) → core::Object?}){(core::Object?, core::Object?) → void};
-        }
-      }
-    }
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/maps.dart */ _id(core::Object? x) → core::Object?
-    return x;
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/maps.dart */ _fillMapWithIterables(core::Map<core::Object?, core::Object?> map, core::Iterable<core::Object?> keys, core::Iterable<core::Object?> values) → void {
-    core::Iterator<core::Object?> keyIterator = keys.{core::Iterable::iterator}{core::Iterator<core::Object?>};
-    core::Iterator<core::Object?> valueIterator = values.{core::Iterable::iterator}{core::Iterator<core::Object?>};
-    core::bool hasNextKey = keyIterator.{core::Iterator::moveNext}(){() → core::bool};
-    core::bool hasNextValue = valueIterator.{core::Iterator::moveNext}(){() → core::bool};
-    while (hasNextKey && hasNextValue) {
-      map.{core::Map::[]=}(keyIterator.{core::Iterator::current}{core::Object?}, valueIterator.{core::Iterator::current}{core::Object?}){(core::Object?, core::Object?) → void};
-      hasNextKey = keyIterator.{core::Iterator::moveNext}(){() → core::bool};
-      hasNextValue = valueIterator.{core::Iterator::moveNext}(){() → core::bool};
-    }
-    if(hasNextKey || hasNextValue) {
-      throw new core::ArgumentError::•("Iterables do not have same length.");
-    }
-  }
 }
 class MyMap<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends self::_MyMap&Object&MapMixin<self::MyMap::K%, self::MyMap::V%> {
   field core::int containsKeyCount = 0;
@@ -215,7 +159,7 @@
     return this.{self::MyMap::_map}{core::Map<self::MyMap::K%, self::MyMap::V%>}.{core::Map::remove}(key){(core::Object?) → self::MyMap::V?};
 }
 static get hasUnsoundNullSafety() → core::bool
-  return #C3 is core::List<core::Object>;
+  return #C2 is core::List<core::Object>;
 static method method(core::Map<core::int, core::String?> m) → core::int {
   #L1:
   {
@@ -225,14 +169,14 @@
     synthesized core::bool #0#2;
     synthesized core::bool #0#2#isSet = false;
     {
-      if((!((#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t28 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C4){(core::Object?) → core::String?}) == null) || null is core::String? && (#0#2#isSet ?{core::bool} #0#2{core::bool} : let final core::bool #t29 = #0#2#isSet = true in #0#2 = #0#0.{core::Map::containsKey}(#C4){(core::Object?) → core::bool})) && #C5 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t30 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C4){(core::Object?) → core::String?})) {
+      if((!((#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t28 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C3){(core::Object?) → core::String?}) == null) || null is core::String? && (#0#2#isSet ?{core::bool} #0#2{core::bool} : let final core::bool #t29 = #0#2#isSet = true in #0#2 = #0#0.{core::Map::containsKey}(#C3){(core::Object?) → core::bool})) && #C4 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t30 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C3){(core::Object?) → core::String?})) {
         {
           return 0;
         }
       }
     }
     {
-      if((!((#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t31 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C4){(core::Object?) → core::String?}) == null) || null is core::String? && (#0#2#isSet ?{core::bool} #0#2{core::bool} : let final core::bool #t32 = #0#2#isSet = true in #0#2 = #0#0.{core::Map::containsKey}(#C4){(core::Object?) → core::bool})) && #C6 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t33 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C4){(core::Object?) → core::String?})) {
+      if((!((#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t31 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C3){(core::Object?) → core::String?}) == null) || null is core::String? && (#0#2#isSet ?{core::bool} #0#2{core::bool} : let final core::bool #t32 = #0#2#isSet = true in #0#2 = #0#0.{core::Map::containsKey}(#C3){(core::Object?) → core::bool})) && #C5 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::String?} #0#3{core::String?} : let final core::bool #t33 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C3){(core::Object?) → core::String?})) {
         {
           return 1;
         }
@@ -260,15 +204,14 @@
 
 constants  {
   #C1 = null
-  #C2 = static-tearoff col::MapBase::_id
-  #C3 = <Null>[]
-  #C4 = 1
-  #C5 = "foo"
-  #C6 = "bar"
+  #C2 = <Null>[]
+  #C3 = 1
+  #C4 = "foo"
+  #C5 = "bar"
 }
 
 Extra constant evaluation status:
 Evaluated: IsExpression @ org-dartlang-testcase:///caching_constants.dart:7:49 -> BoolConstant(false)
 Evaluated: IsExpression @ org-dartlang-testcase:///caching_constants.dart:38:12 -> BoolConstant(true)
 Evaluated: IsExpression @ org-dartlang-testcase:///caching_constants.dart:40:12 -> BoolConstant(true)
-Extra constant evaluation: evaluated: 513, effectively constant: 3
+Extra constant evaluation: evaluated: 428, effectively constant: 3
diff --git a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect
index d76b007..0b1ed84 100644
--- a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect
@@ -507,11 +507,6 @@
     return new _in::ReversedListIterable::•<core::int>(this);
   method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → core::String
     return col::ListBase::listToString(this);
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ _compareAny(dynamic a, dynamic b) → core::int {
-    return core::Comparable::compare(a as core::Comparable<dynamic>, b as core::Comparable<dynamic>);
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ listToString(core::List<core::Object?> list) → core::String
-    return core::Iterable::iterableToFullString(list, "[", "]");
 }
 class A extends self::_A&Object&ListMixin {
   field core::int count = 0;
@@ -571,4 +566,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:462:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:471:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:480:12 -> IntConstant(-1)
-Extra constant evaluation: evaluated: 1108, effectively constant: 4
+Extra constant evaluation: evaluated: 1101, effectively constant: 4
diff --git a/pkg/front_end/testcases/patterns/negative_length.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/negative_length.dart.strong.transformed.expect
index 447ba39..5959418 100644
--- a/pkg/front_end/testcases/patterns/negative_length.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/negative_length.dart.strong.transformed.expect
@@ -507,11 +507,6 @@
     return new _in::ReversedListIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this);
   method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → core::String
     return col::ListBase::listToString(this);
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ _compareAny(dynamic a, dynamic b) → core::int {
-    return core::Comparable::compare(a as core::Comparable<dynamic>, b as core::Comparable<dynamic>);
-  }
-  static method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ listToString(core::List<core::Object?> list) → core::String
-    return core::Iterable::iterableToFullString(list, "[", "]");
 }
 class NegativeLengthList<E extends core::Object? = dynamic> extends self::_NegativeLengthList&Object&ListMixin<self::NegativeLengthList::E%> {
   final field core::List<self::NegativeLengthList::E%> _list;
@@ -588,4 +583,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:471:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:480:12 -> IntConstant(-1)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///negative_length.dart:12:41 -> IntConstant(-1)
-Extra constant evaluation: evaluated: 1128, effectively constant: 5
+Extra constant evaluation: evaluated: 1121, effectively constant: 5
diff --git a/pkg/vm/lib/modular/transformations/mixin_full_resolution.dart b/pkg/vm/lib/modular/transformations/mixin_full_resolution.dart
index cb00ec9..b9d8490 100644
--- a/pkg/vm/lib/modular/transformations/mixin_full_resolution.dart
+++ b/pkg/vm/lib/modular/transformations/mixin_full_resolution.dart
@@ -122,6 +122,9 @@
       }
 
       for (var field in class_.mixin.fields) {
+        if (field.isStatic) {
+          continue;
+        }
         Reference? fieldReference =
             indexedClass?.lookupFieldReference(field.name);
         Reference? getterReference =
@@ -161,6 +164,7 @@
     int originalLength = class_.procedures.length;
     outer:
     for (var procedure in class_.mixin.procedures) {
+      if (procedure.isStatic) continue;
       if (procedure.isSynthetic) continue;
       // Forwarding stubs in the mixin class are used when calling through the
       // mixin class's interface, not when calling through the mixin
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 18d1031..05ffb3d 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -1983,17 +1983,18 @@
 
     if (!shaker.isClassUsedInType(node)) {
       debugPrint('Dropped supers from class ${node.name}');
-      // The class is only a namespace for static members.  Remove its
-      // hierarchy information.   This is mandatory, since these references
-      // might otherwise become dangling.
+      // The class is only a namespace for static members or
+      // unreachable members annotated with entry point pragmas.
+      // Remove its hierarchy information. This is mandatory,
+      // since these references might otherwise become dangling.
       node.supertype = shaker
           .typeFlowAnalysis.environment.coreTypes.objectClass.asRawSupertype;
       node.implementedTypes.clear();
       node.typeParameters.clear();
       node.isAbstract = true;
       node.isEnum = false;
-      // Mixin applications cannot have static members.
-      assert(node.mixedInType == null);
+      node.isEliminatedMixin = false;
+      node.mixedInType = null;
       node.annotations = const <Expression>[];
     }
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart
new file mode 100644
index 0000000..dbbc638
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2025, 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.
+
+// Regression test for https://github.com/flutter/flutter/issues/160030.
+// Verifies the result of tree shaking of mixin application when mixin
+// has members with entry-point pragma.
+
+mixin M {
+  @pragma('vm:entry-point')
+  static void foo() {
+    print('hi');
+  }
+}
+
+class Y with M {}
+
+mixin M2 {
+  @pragma('vm:entry-point')
+  void bar() {
+    print('hi');
+  }
+}
+
+class Z with M2 {}
+
+void main() {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart.expect
new file mode 100644
index 0000000..6a4387b
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter160030.dart.expect
@@ -0,0 +1,33 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+
+  [@vm.inferred-return-type.metadata=dart.core::Null? (value: null)]
+  [@vm.unboxing-info.metadata=[!regcc]]
+  @#C3
+  static method foo() → void {
+    core::print("hi");
+  }
+}
+abstract class M2 extends core::Object /*isMixinDeclaration*/  {
+
+  [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]
+  @#C3
+  abstract method bar() → void;
+}
+abstract class _Z&Object&M2 extends core::Object /*isAnonymousMixin,hasConstConstructor*/  {
+
+  [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]
+  @#C3
+  abstract method bar() → void;
+}
+
+[@vm.inferred-return-type.metadata=dart.core::Null? (value: null)]
+static method main() → void {}
+constants  {
+  #C1 = "vm:entry-point"
+  #C2 = null
+  #C3 = core::pragma {name:#C1, options:#C2}
+}
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 50e6d7f..34b16ac 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1310,6 +1310,7 @@
     klass->set_is_abstract();
   }
   if (class_helper->is_transformed_mixin_application()) {
+    ASSERT(interface_count > 0);
     klass->set_is_transformed_mixin_application();
   }
   if (class_helper->has_const_constructor()) {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 28fd800..fd57986 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3126,6 +3126,7 @@
 ClassPtr Class::Mixin() const {
   if (is_transformed_mixin_application()) {
     const Array& interfaces = Array::Handle(this->interfaces());
+    ASSERT(interfaces.Length() > 0);
     const Type& mixin_type =
         Type::Handle(Type::RawCast(interfaces.At(interfaces.Length() - 1)));
     return mixin_type.type_class();