Version 2.12.0-201.0.dev

Merge commit 'dd5b455a0c1e282a28b2a4005059676c0f3a1847' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d045819..0a97fcd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -158,7 +158,14 @@
 * The `--server` option to `dart pub publish` and `dart pub uploader` have been
   deprecated. Use `publish_to` in your `pubspec.yaml` or set the
   `$PUB_HOSTED_URL` environment variable.
+* `pub global activate no longer re-precompiles if current global installed was
+   same version.
+* The Flutter SDK constraint upper bound is now ignored in pubspecs and
+  deprecated when publishing.
 
+  See: [flutter-upper-bound-deprecation][].
+
+[flutter-upper-bound-deprecation]: https://dart.dev/go/flutter-upper-bound-deprecation
 [#44072]: https://github.com/dart-lang/sdk/issues/44072
 [dart tool]: https://dart.dev/tools/dart-tool
 
diff --git a/DEPS b/DEPS
index 5b388d3..b61db7e 100644
--- a/DEPS
+++ b/DEPS
@@ -133,7 +133,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "protobuf_rev": "0d03fd588df69e9863e2a2efc0059dee8f18d5b2",
-  "pub_rev": "8ea96121dbb3f762f63e641d49141927dc30aac1",
+  "pub_rev": "392a3cb455af48f7ce8807a96174691945f97f0a",
   "pub_semver_rev": "10569a1e867e909cf5db201f73118020453e5db8",
   "resource_rev": "6b79867d0becf5395e5819a75720963b8298e9a7",
   "root_certificates_rev": "7e5ec82c99677a2e5b95ce296c4d68b0d3378ed8",
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index bbad224..49c87e2 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -419,12 +419,15 @@
           ir.Procedure existingSetter = existingSetters[field.name];
           cls.addField(cloneVisitor.cloneField(
               field, existingGetter?.reference, existingSetter?.reference));
+          // TODO(johnniwinther): We need to unbind the canonical names before
+          // serializing these references since the canonical names refer to
+          // @getters and @setters instead of @fields and @fields=. This will
+          // not be needed if stop using @fields/@fields= in favor of
+          // @getters/@setters in general.
           if (existingGetter != null) {
-            existingGetter.reference.canonicalName?.unbind();
             cls.procedures.remove(existingGetter);
           }
           if (existingSetter != null) {
-            existingSetter.reference.canonicalName?.unbind();
             cls.procedures.remove(existingSetter);
           }
           continue;
@@ -444,7 +447,6 @@
                   ? existingSetters[procedure.name]
                   : existingNonSetters[procedure.name];
           if (existingProcedure != null) {
-            existingProcedure.reference.canonicalName?.unbind();
             cls.procedures.remove(existingProcedure);
           }
           cls.addProcedure(cloneVisitor.cloneProcedure(
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 22df841..6920c7b 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -17,6 +17,7 @@
         IntLiteral,
         InterfaceType,
         ListLiteral,
+        Name,
         ProcedureKind,
         PropertyGet,
         Reference,
@@ -181,21 +182,24 @@
     Reference valuesGetterReference;
     Reference valuesSetterReference;
     if (referencesFrom != null) {
-      constructorReference = referencesFromIndexed.lookupConstructor("");
+      constructorReference =
+          referencesFromIndexed.lookupConstructor(new Name(""));
       toStringReference =
-          referencesFromIndexed.lookupGetterReference("toString");
+          referencesFromIndexed.lookupGetterReference(new Name("toString"));
+      Name indexName = new Name("index");
       indexGetterReference =
-          referencesFromIndexed.lookupGetterReference("index");
+          referencesFromIndexed.lookupGetterReference(indexName);
       indexSetterReference =
-          referencesFromIndexed.lookupSetterReference("index");
-      _nameGetterReference =
-          referencesFromIndexed.lookupGetterReference("_name");
-      _nameSetterReference =
-          referencesFromIndexed.lookupSetterReference("_name");
+          referencesFromIndexed.lookupSetterReference(indexName);
+      _nameGetterReference = referencesFromIndexed.lookupGetterReference(
+          new Name("_name", referencesFromIndexed.library));
+      _nameSetterReference = referencesFromIndexed.lookupSetterReference(
+          new Name("_name", referencesFromIndexed.library));
+      Name valuesName = new Name("values");
       valuesGetterReference =
-          referencesFromIndexed.lookupGetterReference("values");
+          referencesFromIndexed.lookupGetterReference(valuesName);
       valuesSetterReference =
-          referencesFromIndexed.lookupSetterReference("values");
+          referencesFromIndexed.lookupSetterReference(valuesName);
     }
 
     members["index"] = new SourceFieldBuilder(
@@ -309,10 +313,15 @@
               name.length,
               parent.fileUri);
         }
-        Reference getterReference =
-            referencesFromIndexed?.lookupGetterReference(name);
-        Reference setterReference =
-            referencesFromIndexed?.lookupSetterReference(name);
+        Reference getterReference;
+        Reference setterReference;
+        if (referencesFromIndexed != null) {
+          Name nameName = new Name(name, referencesFromIndexed.library);
+          getterReference =
+              referencesFromIndexed.lookupGetterReference(nameName);
+          setterReference =
+              referencesFromIndexed.lookupSetterReference(nameName);
+        }
         FieldBuilder fieldBuilder = new SourceFieldBuilder(
             metadata,
             selfType,
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index fa09a80..6dfd603 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -510,8 +510,8 @@
     Class enclosingClass = classBuilder.cls;
     Reference reference;
     if (classBuilder.referencesFromIndexed != null) {
-      reference = classBuilder.referencesFromIndexed
-          .lookupGetterReference(member.name.text);
+      reference =
+          classBuilder.referencesFromIndexed.lookupGetterReference(member.name);
     }
     Uri fileUri;
     int startFileOffset;
@@ -556,8 +556,8 @@
     Class enclosingClass = classBuilder.cls;
     Reference reference;
     if (classBuilder.referencesFromIndexed != null) {
-      reference = classBuilder.referencesFromIndexed
-          .lookupSetterReference(member.name.text);
+      reference =
+          classBuilder.referencesFromIndexed.lookupSetterReference(member.name);
     }
     Uri fileUri;
     int startFileOffset;
@@ -599,7 +599,7 @@
     assert(copyLocation != null);
     Class enclosingClass = classBuilder.cls;
     Reference reference = classBuilder.referencesFromIndexed
-        ?.lookupGetterReference(procedure.name.text);
+        ?.lookupGetterReference(procedure.name);
     Uri fileUri;
     int startFileOffset;
     int fileOffset;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 9d3f663..6ca84c6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -640,7 +640,7 @@
     IndexedClass indexedClass = builder.referencesFromIndexed;
     Constructor referenceFrom;
     if (indexedClass != null) {
-      referenceFrom = indexedClass.lookupConstructor("");
+      referenceFrom = indexedClass.lookupConstructor(new Name(""));
     }
 
     /// From [Dart Programming Language Specification, 4th Edition](
@@ -691,7 +691,7 @@
     IndexedClass indexedClass = builder.referencesFromIndexed;
     Constructor referenceFrom;
     if (indexedClass != null) {
-      referenceFrom = indexedClass.lookupConstructor("");
+      referenceFrom = indexedClass.lookupConstructor(new Name(""));
     }
 
     if (supertype is ClassBuilder) {
@@ -702,7 +702,8 @@
       void addSyntheticConstructor(String name, MemberBuilder memberBuilder) {
         if (memberBuilder.member is Constructor) {
           substitutionMap ??= builder.getSubstitutionMap(superclassBuilder.cls);
-          Constructor referenceFrom = indexedClass?.lookupConstructor(name);
+          Constructor referenceFrom = indexedClass
+              ?.lookupConstructor(new Name(name, indexedClass.library));
           builder.addSyntheticConstructor(_makeMixinApplicationConstructor(
               builder,
               builder.cls.mixin,
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 88c5a6d..81ea7a7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -52,7 +52,7 @@
     String prefix = expression.import.name;
     Name name = new Name('_#loadLibrary_$prefix', parent.library);
     Reference reference =
-        parent.referencesFromIndexed?.lookupGetterReference(name.text);
+        parent.referencesFromIndexed?.lookupGetterReference(name);
     tearoff = new Procedure(
         name,
         ProcedureKind.Method,
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 a222357..6484fa9d 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
@@ -908,8 +908,9 @@
                 // is actually in the kernel tree. This call creates a StaticGet
                 // to [declaration.target] in a field `_redirecting#` which is
                 // only legal to do to things in the kernel tree.
-                Reference getterReference = referencesFromIndexed
-                    ?.lookupGetterReference("_redirecting#");
+                Reference getterReference =
+                    referencesFromIndexed?.lookupGetterReference(new Name(
+                        "_redirecting#", referencesFromIndexed.library));
                 _addRedirectingConstructor(
                     declaration, library, getterReference);
               }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0440125..9e90a19 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -979,9 +979,10 @@
     library.procedures.sort(compareProcedures);
 
     if (unserializableExports != null) {
+      Name fieldName = new Name("_exports#", library);
       Reference getterReference =
-          referencesFromIndexed?.lookupGetterReference("_exports#");
-      library.addField(new Field.immutable(new Name("_exports#", library),
+          referencesFromIndexed?.lookupGetterReference(fieldName);
+      library.addField(new Field.immutable(fieldName,
           initializer: new StringLiteral(jsonEncode(unserializableExports)),
           isStatic: true,
           isConst: true,
@@ -2170,10 +2171,11 @@
           isSynthesized: fieldIsLateWithLowering);
       IndexedContainer indexedContainer =
           _currentClassReferencesFromIndexed ?? referencesFromIndexed;
+      Name nameToLookupName = new Name(nameToLookup, indexedContainer.library);
       fieldGetterReference =
-          indexedContainer.lookupGetterReference(nameToLookup);
+          indexedContainer.lookupGetterReference(nameToLookupName);
       fieldSetterReference =
-          indexedContainer.lookupSetterReference(nameToLookup);
+          indexedContainer.lookupSetterReference(nameToLookupName);
       if (fieldIsLateWithLowering) {
         String lateIsSetName = SourceFieldBuilder.createFieldName(
             FieldNameType.IsSetField, name,
@@ -2182,24 +2184,28 @@
             isExtensionMethod: isExtension,
             extensionName: extensionName,
             isSynthesized: fieldIsLateWithLowering);
+        Name lateIsSetNameName =
+            new Name(lateIsSetName, indexedContainer.library);
         lateIsSetGetterReference =
-            indexedContainer.lookupGetterReference(lateIsSetName);
+            indexedContainer.lookupGetterReference(lateIsSetNameName);
         lateIsSetSetterReference =
-            indexedContainer.lookupSetterReference(lateIsSetName);
-        getterReference = indexedContainer.lookupGetterReference(
+            indexedContainer.lookupSetterReference(lateIsSetNameName);
+        getterReference = indexedContainer.lookupGetterReference(new Name(
             SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
                 isInstanceMember: isInstanceMember,
                 className: className,
                 isExtensionMethod: isExtension,
                 extensionName: extensionName,
-                isSynthesized: fieldIsLateWithLowering));
-        setterReference = indexedContainer.lookupSetterReference(
+                isSynthesized: fieldIsLateWithLowering),
+            indexedContainer.library));
+        setterReference = indexedContainer.lookupSetterReference(new Name(
             SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
                 isInstanceMember: isInstanceMember,
                 className: className,
                 isExtensionMethod: isExtension,
                 extensionName: extensionName,
-                isSynthesized: fieldIsLateWithLowering));
+                isSynthesized: fieldIsLateWithLowering),
+            indexedContainer.library));
       }
     }
 
@@ -2252,8 +2258,9 @@
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     Constructor referenceFrom;
     if (_currentClassReferencesFromIndexed != null) {
-      referenceFrom =
-          _currentClassReferencesFromIndexed.lookupConstructor(constructorName);
+      referenceFrom = _currentClassReferencesFromIndexed.lookupConstructor(
+          new Name(
+              constructorName, _currentClassReferencesFromIndexed.library));
     }
     ConstructorBuilder constructorBuilder = new ConstructorBuilderImpl(
         metadata,
@@ -2323,10 +2330,12 @@
       if (_currentClassReferencesFromIndexed != null) {
         if (kind == ProcedureKind.Setter) {
           procedureReference =
-              _currentClassReferencesFromIndexed.lookupSetterReference(name);
+              _currentClassReferencesFromIndexed.lookupSetterReference(
+                  new Name(name, _currentClassReferencesFromIndexed.library));
         } else {
           procedureReference =
-              _currentClassReferencesFromIndexed.lookupGetterReference(name);
+              _currentClassReferencesFromIndexed.lookupGetterReference(
+                  new Name(name, _currentClassReferencesFromIndexed.library));
         }
       } else {
         if (currentTypeParameterScopeBuilder.kind ==
@@ -2339,11 +2348,11 @@
               currentTypeParameterScopeBuilder.name,
               name);
           if (extensionIsStatic && kind == ProcedureKind.Setter) {
-            procedureReference =
-                referencesFromIndexed.lookupSetterReference(nameToLookup);
+            procedureReference = referencesFromIndexed.lookupSetterReference(
+                new Name(nameToLookup, referencesFromIndexed.library));
           } else {
-            procedureReference =
-                referencesFromIndexed.lookupGetterReference(nameToLookup);
+            procedureReference = referencesFromIndexed.lookupGetterReference(
+                new Name(nameToLookup, referencesFromIndexed.library));
           }
           if (kind == ProcedureKind.Method) {
             String tearOffNameToLookup =
@@ -2353,16 +2362,16 @@
                     ProcedureKind.Getter,
                     currentTypeParameterScopeBuilder.name,
                     name);
-            tearOffReference = referencesFromIndexed
-                .lookupGetterReference(tearOffNameToLookup);
+            tearOffReference = referencesFromIndexed.lookupGetterReference(
+                new Name(tearOffNameToLookup, referencesFromIndexed.library));
           }
         } else {
           if (kind == ProcedureKind.Setter) {
-            procedureReference =
-                referencesFromIndexed.lookupSetterReference(name);
+            procedureReference = referencesFromIndexed.lookupSetterReference(
+                new Name(name, referencesFromIndexed.library));
           } else {
-            procedureReference =
-                referencesFromIndexed.lookupGetterReference(name);
+            procedureReference = referencesFromIndexed.lookupGetterReference(
+                new Name(name, referencesFromIndexed.library));
           }
         }
       }
@@ -2427,8 +2436,9 @@
       procedureName = name;
     }
 
-    Reference reference = _currentClassReferencesFromIndexed
-        ?.lookupGetterReference(procedureName);
+    Reference reference =
+        _currentClassReferencesFromIndexed?.lookupGetterReference(new Name(
+            procedureName, _currentClassReferencesFromIndexed.library));
 
     ProcedureBuilder procedureBuilder;
     if (redirectionTarget != null) {
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index 328e3a7..22ffcf8 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -701,20 +701,20 @@
 
     // TODO(jensj): don't use full uris.
     print("""
-        # Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-        # for details. All rights reserved. Use of this source code is governed by a
-        # BSD-style license that can be found in the LICENSE.md file.
-        
-        # Reproduce a crash.
-        
-        type: newworld""");
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Reproduce a crash.
+
+type: newworld""");
     if (_settings.widgetTransformation) {
       print("trackWidgetCreation: true");
       print("target: DDC # basically needed for widget creation to be run");
     }
     print("""
-        worlds:
-          - entry: $_mainUri""");
+worlds:
+  - entry: $_mainUri""");
     if (_settings.experimentalInvalidation) {
       print("    experiments: alternative-invalidation-strategy");
     }
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 74205c3..c2db70b 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -606,6 +606,7 @@
 scheduler
 screen
 scripts
+scroll
 sdkroot
 sdks
 secondary
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml
new file mode 100644
index 0000000..63f5ae4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml
@@ -0,0 +1,44 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Reproduce a crash.
+
+type: newworld
+worlds:
+  - entry: app/main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      app/.dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "flutter",
+              "rootUri": "../../flutter",
+              "languageVersion": "2.12"
+            }
+          ]
+        }
+      app/main.dart: |
+        import "package:flutter/lib1.dart";
+        class _Bar extends RestorableProperty {}
+      flutter/lib1.dart: |
+        import "lib2.dart";
+        abstract class RestorableProperty extends ChangeNotifier {
+          bool _debugAssertNotDisposed() { return true; }
+        }
+      flutter/lib2.dart: |
+        class ChangeNotifier {
+          bool _debugAssertNotDisposed() { return true; }
+        }
+    expectedLibraryCount: 3
+
+  - entry: app/main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - app/main.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.1.expect
new file mode 100644
index 0000000..fab130fd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.1.expect
@@ -0,0 +1,47 @@
+main = <No Member>;
+library from "org-dartlang-test:///app/main.dart" as main {
+
+  import "package:flutter/lib1.dart";
+
+  class _Bar extends lib1::RestorableProperty {
+    synthetic constructor •() → main::_Bar*
+      : super lib1::RestorableProperty::•()
+      ;
+    abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib1::RestorableProperty::_debugAssertNotDisposed
+    abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib2::ChangeNotifier::_debugAssertNotDisposed
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
+library from "package:flutter/lib1.dart" as lib1 {
+
+  import "package:flutter/lib2.dart";
+
+  abstract class RestorableProperty extends lib2::ChangeNotifier {
+    synthetic constructor •() → lib1::RestorableProperty
+      : super lib2::ChangeNotifier::•()
+      ;
+    method _debugAssertNotDisposed() → dart.core::bool {
+      return true;
+    }
+  }
+}
+library from "package:flutter/lib2.dart" as lib2 {
+
+  class ChangeNotifier extends dart.core::Object {
+    synthetic constructor •() → lib2::ChangeNotifier
+      : super dart.core::Object::•()
+      ;
+    method _debugAssertNotDisposed() → dart.core::bool {
+      return true;
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.2.expect
new file mode 100644
index 0000000..fab130fd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.2.expect
@@ -0,0 +1,47 @@
+main = <No Member>;
+library from "org-dartlang-test:///app/main.dart" as main {
+
+  import "package:flutter/lib1.dart";
+
+  class _Bar extends lib1::RestorableProperty {
+    synthetic constructor •() → main::_Bar*
+      : super lib1::RestorableProperty::•()
+      ;
+    abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib1::RestorableProperty::_debugAssertNotDisposed
+    abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib2::ChangeNotifier::_debugAssertNotDisposed
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
+library from "package:flutter/lib1.dart" as lib1 {
+
+  import "package:flutter/lib2.dart";
+
+  abstract class RestorableProperty extends lib2::ChangeNotifier {
+    synthetic constructor •() → lib1::RestorableProperty
+      : super lib2::ChangeNotifier::•()
+      ;
+    method _debugAssertNotDisposed() → dart.core::bool {
+      return true;
+    }
+  }
+}
+library from "package:flutter/lib2.dart" as lib2 {
+
+  class ChangeNotifier extends dart.core::Object {
+    synthetic constructor •() → lib2::ChangeNotifier
+      : super dart.core::Object::•()
+      ;
+    method _debugAssertNotDisposed() → dart.core::bool {
+      return true;
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart b/pkg/front_end/testcases/none/mixin_super.dart
new file mode 100644
index 0000000..5b90234
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+
+main() {
+  new PointerScrollEvent()
+      .debugFillProperties(new DiagnosticPropertiesBuilder());
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect
new file mode 100644
index 0000000..6e052ce
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    ;
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @core::override
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    ;
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    ;
+  @core::override
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    ;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:16:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:25:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect
new file mode 100644
index 0000000..dd59658
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e011475
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+class DiagnosticPropertiesBuilder {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+main() {}
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 2d00cd0..d84d3b9 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -181,6 +181,7 @@
 none/operator: TypeCheckError
 none/property_get: TypeCheckError
 none/property_set: TypeCheckError
+none/mixin_super: TextSerializationFailure
 none/tearoff_opt_out: TextSerializationFailure
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
diff --git a/pkg/kernel/lib/reference_from_index.dart b/pkg/kernel/lib/reference_from_index.dart
index 6257e3d..fd99974 100644
--- a/pkg/kernel/lib/reference_from_index.dart
+++ b/pkg/kernel/lib/reference_from_index.dart
@@ -9,6 +9,7 @@
         Extension,
         Field,
         Library,
+        Name,
         Reference,
         Procedure,
         Typedef;
@@ -28,19 +29,23 @@
 }
 
 abstract class IndexedContainer {
-  final Map<String, Reference> _getterReferences = new Map<String, Reference>();
-  final Map<String, Reference> _setterReferences = new Map<String, Reference>();
+  final Map<Name, Reference> _getterReferences = new Map<Name, Reference>();
+  final Map<Name, Reference> _setterReferences = new Map<Name, Reference>();
 
-  Reference lookupGetterReference(String name) => _getterReferences[name];
-  Reference lookupSetterReference(String name) => _setterReferences[name];
+  Reference lookupGetterReference(Name name) => _getterReferences[name];
+  Reference lookupSetterReference(Name name) => _setterReferences[name];
+
+  Library get library;
 
   void _addProcedures(List<Procedure> procedures) {
     for (int i = 0; i < procedures.length; i++) {
       Procedure procedure = procedures[i];
-      String name = procedure.name.text;
+      Name name = procedure.name;
       if (procedure.isSetter) {
+        assert(_setterReferences[name] == null);
         _setterReferences[name] = procedure.reference;
       } else {
+        assert(_getterReferences[name] == null);
         _getterReferences[name] = procedure.reference;
       }
     }
@@ -49,9 +54,11 @@
   void _addFields(List<Field> fields) {
     for (int i = 0; i < fields.length; i++) {
       Field field = fields[i];
-      String name = field.name.text;
+      Name name = field.name;
+      assert(_getterReferences[name] == null);
       _getterReferences[name] = field.getterReference;
       if (field.hasSetter) {
+        assert(_setterReferences[name] == null);
         _setterReferences[name] = field.setterReference;
       }
     }
@@ -64,19 +71,24 @@
   final Map<String, IndexedClass> _indexedClasses =
       new Map<String, IndexedClass>();
   final Map<String, Extension> _extensions = new Map<String, Extension>();
+  final Library library;
 
-  IndexedLibrary(Library library) {
+  IndexedLibrary(this.library) {
     for (int i = 0; i < library.typedefs.length; i++) {
       Typedef typedef = library.typedefs[i];
+      assert(_typedefs[typedef.name] == null);
       _typedefs[typedef.name] = typedef;
     }
     for (int i = 0; i < library.classes.length; i++) {
       Class c = library.classes[i];
+      assert(_classes[c.name] == null);
       _classes[c.name] = c;
-      _indexedClasses[c.name] = new IndexedClass._(c);
+      assert(_indexedClasses[c.name] == null);
+      _indexedClasses[c.name] = new IndexedClass._(c, library);
     }
     for (int i = 0; i < library.extensions.length; i++) {
       Extension extension = library.extensions[i];
+      assert(_extensions[extension.name] == null);
       _extensions[extension.name] = extension;
     }
     _addProcedures(library.procedures);
@@ -90,16 +102,17 @@
 }
 
 class IndexedClass extends IndexedContainer {
-  final Map<String, Constructor> _constructors = new Map<String, Constructor>();
+  final Map<Name, Constructor> _constructors = new Map<Name, Constructor>();
+  final Library library;
 
-  IndexedClass._(Class c) {
+  IndexedClass._(Class c, this.library) {
     for (int i = 0; i < c.constructors.length; i++) {
       Constructor constructor = c.constructors[i];
-      _constructors[constructor.name.text] = constructor;
+      _constructors[constructor.name] = constructor;
     }
     _addProcedures(c.procedures);
     _addFields(c.fields);
   }
 
-  Constructor lookupConstructor(String name) => _constructors[name];
+  Constructor lookupConstructor(Name name) => _constructors[name];
 }
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 92b0b16..6a9a8b8 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -119,9 +119,9 @@
 
       for (var field in class_.mixin.fields) {
         Reference getterReference =
-            indexedClass?.lookupGetterReference(field.name.text);
+            indexedClass?.lookupGetterReference(field.name);
         Reference setterReference =
-            indexedClass?.lookupSetterReference(field.name.text);
+            indexedClass?.lookupSetterReference(field.name);
         if (getterReference == null) {
           getterReference = nonSetters[field.name]?.reference;
           getterReference?.canonicalName?.unbind();
@@ -166,9 +166,9 @@
 
       Reference reference;
       if (procedure.isSetter) {
-        reference = indexedClass?.lookupSetterReference(procedure.name.text);
+        reference = indexedClass?.lookupSetterReference(procedure.name);
       } else {
-        reference = indexedClass?.lookupGetterReference(procedure.name.text);
+        reference = indexedClass?.lookupGetterReference(procedure.name);
       }
 
       // Linear search for a forwarding stub with the same name.
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index fdaede1..6970c22 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -343,7 +343,7 @@
     // C.#fromTypedDataBase(Object address) : super.fromPointer(address);
     final VariableDeclaration pointer = new VariableDeclaration("#pointer");
     final name = Name("#fromTypedDataBase");
-    final referenceFrom = indexedClass?.lookupConstructor(name.text);
+    final referenceFrom = indexedClass?.lookupConstructor(name);
     final Constructor ctor = Constructor(
         FunctionNode(EmptyStatement(), positionalParameters: [pointer]),
         name: name,
@@ -676,7 +676,7 @@
     final Procedure getter = Procedure(field.name, ProcedureKind.Getter,
         FunctionNode(getterStatement, returnType: field.type),
         fileUri: field.fileUri,
-        reference: indexedClass?.lookupGetterReference(field.name.text))
+        reference: indexedClass?.lookupGetterReference(field.name))
       ..fileOffset = field.fileOffset
       ..isNonNullableByDefault = field.isNonNullableByDefault;
 
@@ -693,7 +693,7 @@
           FunctionNode(setterStatement,
               returnType: VoidType(), positionalParameters: [argument]),
           fileUri: field.fileUri,
-          reference: indexedClass?.lookupSetterReference(field.name.text))
+          reference: indexedClass?.lookupSetterReference(field.name))
         ..fileOffset = field.fileOffset
         ..isNonNullableByDefault = field.isNonNullableByDefault;
     }
@@ -709,7 +709,7 @@
   void _replaceSizeOfMethod(
       Class struct, Map<Abi, int> sizes, IndexedClass indexedClass) {
     var name = Name("#sizeOf");
-    var getterReference = indexedClass?.lookupGetterReference(name.text);
+    var getterReference = indexedClass?.lookupGetterReference(name);
     final Field sizeOf = Field.immutable(name,
         isStatic: true,
         isFinal: true,
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index ae57831..3260c0a 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -337,7 +337,7 @@
     final nativeFunctionType = InterfaceType(
         nativeFunctionClass, Nullability.legacy, node.arguments.types);
     var name = Name("_#ffiCallback${callbackCount++}", currentLibrary);
-    var getterReference = currentLibraryIndex?.lookupGetterReference(name.text);
+    var getterReference = currentLibraryIndex?.lookupGetterReference(name);
     final Field field = Field.immutable(name,
         type: InterfaceType(
             pointerClass, Nullability.legacy, [nativeFunctionType]),
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 4af9266..6e3de37 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1252,10 +1252,14 @@
   const Field& sentinel = Field::Handle(
       zone, enum_cls.LookupStaticField(Symbols::_DeletedEnumSentinel()));
   ASSERT(!sentinel.IsNull());
-  sentinel.SetStaticValue(enum_value, true);
+
+  // The static const field contains `Object::null()` instead of
+  // `Object::sentinel()` - so it's not considered an initializing store.
+  sentinel.SetStaticConstFieldValue(enum_value,
+                                    /*assert_initializing_store*/ false);
 
   ASSERT(enum_cls.kernel_offset() > 0);
-  Error& error = Error::Handle(zone);
+  Object& error = Error::Handle(zone);
   for (intptr_t i = 0; i < fields.Length(); i++) {
     field = Field::RawCast(fields.At(i));
     if (!field.is_static() || !field.is_const() ||
@@ -1265,11 +1269,9 @@
     // Hot-reload expects the static const fields to be evaluated when
     // performing a reload.
     if (!FLAG_precompiled_mode) {
-      if (field.IsUninitialized()) {
-        error = field.InitializeStatic();
-        if (!error.IsNull()) {
-          ReportError(error);
-        }
+      error = field.StaticConstFieldValue();
+      if (error.IsError()) {
+        ReportError(Error::Cast(error));
       }
     }
   }
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 6b778d7..70b1efa 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1831,8 +1831,9 @@
 
           // This cleans up references to field current and initial values.
           if (field.is_static()) {
-            field.SetStaticValue(Object::null_instance(),
-                                 /*save_initial_value=*/true);
+            field.SetStaticValue(Object::null_instance());
+            field.SetStaticConstFieldValue(Object::null_instance(),
+                                           /*assert_initializing_store=*/false);
           }
         }
       }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index eb94c92..fd5cc1d 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -2582,7 +2582,8 @@
       ASSERT(Class::Handle(field.Owner()).library() ==
                  Library::InternalLibrary() &&
              Class::Handle(field.Owner()).Name() == Symbols::ClassID().raw());
-      return Constant(Instance::ZoneHandle(Z, field.StaticValue()));
+      return Constant(Instance::ZoneHandle(
+          Z, Instance::RawCast(field.StaticConstFieldValue())));
     } else {
       const Class& owner = Class::Handle(Z, field.Owner());
       const String& getter_name = H.DartGetterName(target);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5983ca2..7c0fab3 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -3433,8 +3433,11 @@
 #endif
     }
   } else if (field.is_const()) {
-    ASSERT(!field.IsUninitialized());
-    body += Constant(Instance::ZoneHandle(Z, field.StaticValue()));
+    const auto& value = Object::Handle(Z, field.StaticConstFieldValue());
+    if (value.IsError()) {
+      Report::LongJump(Error::Cast(value));
+    }
+    body += Constant(Instance::ZoneHandle(Z, Instance::RawCast(value.raw())));
   } else {
     // Static fields
     //  - with trivial initializer
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e862b759..3d52bb5 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -10571,9 +10571,8 @@
       }
     }
     ASSERT(value.IsNull() || value.IsInstance());
-    SetStaticValue(
-        value.IsNull() ? Instance::null_instance() : Instance::Cast(value),
-        is_const());
+    SetStaticValue(value.IsNull() ? Instance::null_instance()
+                                  : Instance::Cast(value));
     return Error::null();
   } else if (StaticValue() == Object::transition_sentinel().raw()) {
     ASSERT(!is_late());
@@ -10586,6 +10585,42 @@
   return Error::null();
 }
 
+ObjectPtr Field::StaticConstFieldValue() const {
+  ASSERT(is_static() && is_const());
+
+  auto thread = Thread::Current();
+  auto zone = thread->zone();
+  auto initial_field_table = thread->isolate_group()->initial_field_table();
+
+  // We can safely cache the value of the static const field in the initial
+  // field table.
+  auto& value = Object::Handle(zone, initial_field_table->At(field_id()));
+  if (value.raw() == Object::sentinel().raw()) {
+    ASSERT(has_initializer());
+    value = EvaluateInitializer();
+    if (!value.IsError()) {
+      ASSERT(value.IsNull() || value.IsInstance());
+      SetStaticConstFieldValue(value.IsNull() ? Instance::null_instance()
+                                              : Instance::Cast(value));
+    }
+  }
+  return value.raw();
+}
+
+void Field::SetStaticConstFieldValue(const Instance& value,
+                                     bool assert_initializing_store) const {
+  auto thread = Thread::Current();
+  auto initial_field_table = thread->isolate_group()->initial_field_table();
+
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+  ASSERT(initial_field_table->At(field_id()) == Object::sentinel().raw() ||
+         initial_field_table->At(field_id()) == value.raw() ||
+         !assert_initializing_store);
+  initial_field_table->SetAt(field_id(), value.IsNull()
+                                             ? Instance::null_instance().raw()
+                                             : Instance::Cast(value).raw());
+}
+
 ObjectPtr Field::EvaluateInitializer() const {
   Thread* const thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
@@ -10788,8 +10823,7 @@
   return false;  // Not found.
 }
 
-void Field::SetStaticValue(const Instance& value,
-                           bool save_initial_value) const {
+void Field::SetStaticValue(const Instance& value) const {
   auto thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
 
@@ -10799,16 +10833,6 @@
 
   SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
   thread->isolate()->field_table()->SetAt(id, value.raw());
-  if (save_initial_value) {
-    // TODO(https://dartbug.com/36097): We should re-visit call-sites where
-    // `save_initial_value == true` and try to have a different path. This
-    // method should only modify the isolate-local field state and not modify
-    // the initial field table.
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    thread->isolate_group()->initial_field_table()->SetAt(field_id(),
-                                                          value.raw());
-#endif
-  }
 }
 
 static StaticTypeExactnessState TrivialTypeExactnessFor(const Class& cls) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7cf19f6..67df8c9 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4072,9 +4072,12 @@
   inline intptr_t TargetOffset() const;
   static inline intptr_t TargetOffsetOf(FieldPtr field);
 
+  ObjectPtr StaticConstFieldValue() const;
+  void SetStaticConstFieldValue(const Instance& value,
+                                bool assert_initializing_store = true) const;
+
   inline InstancePtr StaticValue() const;
-  void SetStaticValue(const Instance& value,
-                      bool save_initial_value = false) const;
+  void SetStaticValue(const Instance& value) const;
 
   inline intptr_t field_id() const;
   inline void set_field_id(intptr_t field_id) const;
@@ -11171,8 +11174,7 @@
 
 InstancePtr Field::StaticValue() const {
   ASSERT(is_static());  // Valid only for static dart fields.
-  return Isolate::Current()->field_table()->At(
-      Smi::Value(raw_ptr()->host_offset_or_field_id()));
+  return Isolate::Current()->field_table()->At(field_id());
 }
 
 inline intptr_t Field::field_id() const {
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 1620dcc..03f743b 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -344,17 +344,20 @@
         // Enum instances are only held in static fields.
         continue;
       }
+      ASSERT(field.is_const());
       if (enum_ident.Equals(Symbols::Values())) {
-        old_enum_values = field.StaticValue();
+        old_enum_values = Instance::RawCast(field.StaticConstFieldValue());
         // Non-enum instance.
         continue;
       }
       if (enum_ident.Equals(Symbols::_DeletedEnumSentinel())) {
-        old_deleted_enum_sentinel = field.StaticValue();
+        old_deleted_enum_sentinel =
+            Instance::RawCast(field.StaticConstFieldValue());
         // Non-enum instance.
         continue;
       }
-      old_enum_value = field.StaticValue();
+      old_enum_value = Instance::RawCast(field.StaticConstFieldValue());
+
       ASSERT(!old_enum_value.IsNull());
       VTIR_Print("Element %s being added to mapping\n", enum_ident.ToCString());
       bool update = enum_map.UpdateOrInsert(enum_ident, old_enum_value);
@@ -378,17 +381,20 @@
         // Enum instances are only held in static fields.
         continue;
       }
+      ASSERT(field.is_const());
       if (enum_ident.Equals(Symbols::Values())) {
-        enum_values = field.StaticValue();
+        enum_values = Instance::RawCast(field.StaticConstFieldValue());
         // Non-enum instance.
         continue;
       }
       if (enum_ident.Equals(Symbols::_DeletedEnumSentinel())) {
-        deleted_enum_sentinel = field.StaticValue();
+        deleted_enum_sentinel =
+            Instance::RawCast(field.StaticConstFieldValue());
         // Non-enum instance.
         continue;
       }
-      enum_value = field.StaticValue();
+      enum_value = Instance::RawCast(field.StaticConstFieldValue());
+
       ASSERT(!enum_value.IsNull());
       old_enum_value ^= enum_map.GetOrNull(enum_ident);
       if (old_enum_value.IsNull()) {
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 8de3437..f01b655 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -376,18 +376,14 @@
   ASSERT(!word_character_field.IsNull());
 
   DEBUG_ASSERT(Thread::Current()->TopErrorHandlerIsSetJump());
-  if (word_character_field.IsUninitialized()) {
-    ASSERT(!Compiler::IsBackgroundCompilation());
-    const Error& error =
-        Error::Handle(Z, word_character_field.InitializeStatic());
-    if (!error.IsNull()) {
-      Report::LongJump(error);
-    }
-  }
-  ASSERT(!word_character_field.IsUninitialized());
 
-  return new (Z) ConstantInstr(
-      Instance::ZoneHandle(Z, word_character_field.StaticValue()));
+  const auto& value =
+      Object::Handle(Z, word_character_field.StaticConstFieldValue());
+  if (value.IsError()) {
+    Report::LongJump(Error::Cast(value));
+  }
+  return new (Z)
+      ConstantInstr(Instance::ZoneHandle(Z, Instance::RawCast(value.raw())));
 }
 
 ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind,
diff --git a/tests/modular/mixin_super/main.dart b/tests/modular/mixin_super/main.dart
new file mode 100644
index 0000000..5b90234
--- /dev/null
+++ b/tests/modular/mixin_super/main.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+
+main() {
+  new PointerScrollEvent()
+      .debugFillProperties(new DiagnosticPropertiesBuilder());
+}
diff --git a/tests/modular/mixin_super/modules.yaml b/tests/modular/mixin_super/modules.yaml
new file mode 100644
index 0000000..7313554
--- /dev/null
+++ b/tests/modular/mixin_super/modules.yaml
@@ -0,0 +1,6 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+dependencies:
+  main: []
diff --git a/tools/VERSION b/tools/VERSION
index 09493fa..58124d3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 200
+PRERELEASE 201
 PRERELEASE_PATCH 0
\ No newline at end of file