Version 2.11.0-251.0.dev

Merge commit '51f8304b71303565dc8ff75f6c558e2a18aba171' into 'dev'
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 2d9449c..b1684fb 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -762,9 +762,11 @@
 
       result = checkExpectFile(data, worldNum, "", context, actualSerialized);
       if (result != null) return result;
-      result =
-          checkClassHierarchy(compiler, component, data, worldNum, context);
-      if (result != null) return result;
+      if (world["skipClassHierarchyTest"] != true) {
+        result =
+            checkClassHierarchy(compiler, component, data, worldNum, context);
+        if (result != null) return result;
+      }
 
       int nonSyntheticLibraries = countNonSyntheticLibraries(component);
       int nonSyntheticPlatformLibraries =
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
index f65ae73..21b9bcb 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
@@ -45,7 +45,7 @@
   return new self::Class::•();
 }
 static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
-  if(self::test2::T*.{core::Object::==}(self::SubClass*)) {
+  if(self::test2::T*.{core::Type::==}(self::SubClass*)) {
     self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
   }
 }
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
index 84f76d4..abe6de964 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
@@ -45,7 +45,7 @@
   return new self::Class::•();
 }
 static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
-  if(self::test2::T*.{core::Object::==}(self::SubClass*)) {
+  if(self::test2::T*.{core::Type::==}(self::SubClass*)) {
     self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
   }
 }
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
index 0f1b8dd..5e97b8a 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
@@ -87,24 +87,24 @@
     core::print("hello ${x.{core::int::^}(y)}");
   }
   get a() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   get b() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   get c() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   }
   get d() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   }
   get e() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   get f() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   get g() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   }
   get h() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   }
   method i(core::int* x, core::int* y) → core::int*
     return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
index 0f1b8dd..5e97b8a 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
@@ -87,24 +87,24 @@
     core::print("hello ${x.{core::int::^}(y)}");
   }
   get a() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   get b() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   get c() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   }
   get d() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
   }
   get e() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   get f() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   get g() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   }
   get h() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
   }
   method i(core::int* x, core::int* y) → core::int*
     return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.expect b/pkg/front_end/testcases/general/expressions.dart.strong.expect
index bc2f8d2..9325380 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.expect
@@ -72,10 +72,10 @@
   self::caller(({dynamic x = #C1}) → core::Null? {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index 04c23db..4aced3e 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -72,10 +72,10 @@
   self::caller(({dynamic x = #C1}) → core::Null? {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
index 5c1a339..b408161 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
@@ -72,10 +72,10 @@
   self::caller(({dynamic x = #C1}) → core::Null? {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index 4796426..3e91f0c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -72,10 +72,10 @@
   self::caller(({dynamic x = #C1}) → core::Null? {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml
new file mode 100644
index 0000000..60fdac4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml
@@ -0,0 +1,64 @@
+# 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 weirdness with abstract member-signatures and forwarding stubs from
+# https://github.com/flutter/flutter/issues/66122
+
+type: newworld
+target: DDC
+trackWidgetCreation: true
+worlds:
+  - entry: main.dart
+    skipClassHierarchyTest: true
+    sources:
+      main.dart: |
+        import 'package:flutter/framework.dart';
+        import 'after_layout.dart';
+        class _HotReloadIssueState extends State<HotReloadIssue>
+            with AfterLayoutMixin<HotReloadIssue> {
+          Widget build(BuildContext context) {}
+          void afterFirstLayout(BuildContext context) {}
+        }
+        class HotReloadIssue extends StatefulWidget {}
+
+      after_layout.dart:
+        import 'package:flutter/framework.dart';
+        mixin AfterLayoutMixin<T extends StatefulWidget> on State<T> {}
+
+      flutter/lib/framework.dart: |
+        mixin Diagnosticable {
+          String toString() {
+            return "foo";
+          }
+        }
+        abstract class State<T extends StatefulWidget> with Diagnosticable {
+          T? _widget;
+        }
+        class State2 extends State {}
+        class StatefulWidget {}
+        class Widget {}
+        class BuildContext {}
+        final State<StatefulWidget> state = new State2();
+        void foo() {
+          state._widget = null;
+        }
+      .dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "flutter",
+              "rootUri": "../flutter",
+              "packageUri": "lib/"
+            }
+          ]
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    skipClassHierarchyTest: true
+    worldType: updated
+    invalidate:
+      - main.dart
+    expectInitializeFromDill: false
+    expectedLibraryCount: 3
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
new file mode 100644
index 0000000..bdece83
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -0,0 +1,91 @@
+main = <No Member>;
+library from "org-dartlang-test:///after_layout.dart" as aft {
+
+  import "package:flutter/framework.dart";
+
+  abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
+    abstract member-signature get /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
+    abstract member-signature set /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget(aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
+library from "package:flutter/framework.dart" as fra {
+
+  abstract class Diagnosticable extends dart.core::Object /*isMixinDeclaration*/  {
+    method toString() → dart.core::String {
+      return "foo";
+    }
+  }
+  abstract class _State&Object&Diagnosticable = dart.core::Object with fra::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+    const synthetic constructor •() → fra::_State&Object&Diagnosticable
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+    generic-covariant-impl field fra::State::T? _widget = null;
+    synthetic constructor •() → fra::State<fra::State::T>
+      : super fra::_State&Object&Diagnosticable::•()
+      ;
+  }
+  class State2 extends fra::State<fra::StatefulWidget> {
+    synthetic constructor •() → fra::State2
+      : super fra::State::•()
+      ;
+  }
+  class StatefulWidget extends dart.core::Object {
+    synthetic constructor •() → fra::StatefulWidget
+      : super dart.core::Object::•()
+      ;
+  }
+  class Widget extends dart.core::Object {
+    synthetic constructor •() → fra::Widget
+      : super dart.core::Object::•()
+      ;
+  }
+  class BuildContext extends dart.core::Object {
+    synthetic constructor •() → fra::BuildContext
+      : super dart.core::Object::•()
+      ;
+  }
+  static final field fra::State<fra::StatefulWidget> state = new fra::State2::•();
+  static method foo() → void {
+    fra::state.{fra::State::_widget} = null;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/framework.dart";
+  import "org-dartlang-test:///after_layout.dart";
+
+  abstract class __HotReloadIssueState&State&AfterLayoutMixin = fra::State<main::HotReloadIssue*> with aft::AfterLayoutMixin<main::HotReloadIssue*> /*isAnonymousMixin*/  {
+    synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
+      : super fra::State::•()
+      ;
+    abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
+    abstract member-signature set _widget(main::HotReloadIssue* _) → void; -> fra::State::_widget
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
+    synthetic constructor •() → main::_HotReloadIssueState*
+      : super main::__HotReloadIssueState&State&AfterLayoutMixin::•()
+      ;
+    method build(fra::BuildContext* context) → fra::Widget* {}
+    method afterFirstLayout(fra::BuildContext* context) → void {}
+  }
+  class HotReloadIssue extends fra::StatefulWidget {
+    synthetic constructor •() → main::HotReloadIssue*
+      : super fra::StatefulWidget::•()
+      ;
+    abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
new file mode 100644
index 0000000..6924048
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -0,0 +1,89 @@
+main = <No Member>;
+library from "org-dartlang-test:///after_layout.dart" as aft {
+
+  import "package:flutter/framework.dart";
+
+  abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
+    abstract member-signature get /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
+    abstract member-signature set /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget(aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
+library from "package:flutter/framework.dart" as fra {
+
+  abstract class Diagnosticable extends dart.core::Object /*isMixinDeclaration*/  {
+    method toString() → dart.core::String {
+      return "foo";
+    }
+  }
+  abstract class _State&Object&Diagnosticable = dart.core::Object with fra::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+    const synthetic constructor •() → fra::_State&Object&Diagnosticable
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+    generic-covariant-impl field fra::State::T? _widget = null;
+    synthetic constructor •() → fra::State<fra::State::T>
+      : super fra::_State&Object&Diagnosticable::•()
+      ;
+  }
+  class State2 extends fra::State<fra::StatefulWidget> {
+    synthetic constructor •() → fra::State2
+      : super fra::State::•()
+      ;
+  }
+  class StatefulWidget extends dart.core::Object {
+    synthetic constructor •() → fra::StatefulWidget
+      : super dart.core::Object::•()
+      ;
+  }
+  class Widget extends dart.core::Object {
+    synthetic constructor •() → fra::Widget
+      : super dart.core::Object::•()
+      ;
+  }
+  class BuildContext extends dart.core::Object {
+    synthetic constructor •() → fra::BuildContext
+      : super dart.core::Object::•()
+      ;
+  }
+  static final field fra::State<fra::StatefulWidget> state = new fra::State2::•();
+  static method foo() → void {
+    fra::state.{fra::State::_widget} = null;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/framework.dart";
+  import "org-dartlang-test:///after_layout.dart";
+
+  abstract class __HotReloadIssueState&State&AfterLayoutMixin = fra::State<main::HotReloadIssue*> with aft::AfterLayoutMixin<main::HotReloadIssue*> /*isAnonymousMixin*/  {
+    synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
+      : super fra::State::•()
+      ;
+    forwarding-stub set _widget(main::HotReloadIssue* value) → void
+      return super.{fra::State::_widget} = value;
+  }
+  class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
+    synthetic constructor •() → main::_HotReloadIssueState*
+      : super main::__HotReloadIssueState&State&AfterLayoutMixin::•()
+      ;
+    method build(fra::BuildContext* context) → fra::Widget* {}
+    method afterFirstLayout(fra::BuildContext* context) → void {}
+    forwarding-stub set _widget(main::HotReloadIssue* value) → void
+      return super.{fra::State::_widget} = value;
+  }
+  class HotReloadIssue extends fra::StatefulWidget {
+    synthetic constructor •() → main::HotReloadIssue*
+      : super fra::StatefulWidget::•()
+      ;
+    abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
index acf0683..a948972 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
@@ -57,7 +57,7 @@
   return new self::Class::•();
 }
 static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
-  if(self::test2::T.{core::Object::==}(self::SubClass)) {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
     self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
     SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
index 17743ab..e6c4be4 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
@@ -57,7 +57,7 @@
   return new self::Class::•();
 }
 static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
-  if(self::test2::T.{core::Object::==}(self::SubClass)) {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
     self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
     SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
index acf0683..a948972 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
@@ -57,7 +57,7 @@
   return new self::Class::•();
 }
 static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
-  if(self::test2::T.{core::Object::==}(self::SubClass)) {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
     self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
     SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
index 17743ab..e6c4be4 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
@@ -57,7 +57,7 @@
   return new self::Class::•();
 }
 static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
-  if(self::test2::T.{core::Object::==}(self::SubClass)) {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
     self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
     SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
index ee9eb9c..a93539c 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
@@ -439,28 +439,28 @@
     self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
     use(--Func);
           ^^^^");
-    self::C<dynamic>*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+    self::C<dynamic>*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
     C ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
     use(C ??= 42);
         ^" : #t1);
-    dynamic.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+    dynamic.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
     dynamic ??= 42;
     ^^^^^^^" : null;
-    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
     use(dynamic ??= 42);
         ^^^^^^^" : #t2);
-    self::C::T*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+    self::C::T*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
     T ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
     use(T ??= 42);
         ^" : #t3);
-    () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+    () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
     Func ??= 42;
     ^^^^" : null;
-    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
     use(Func ??= 42);
         ^^^^" : #t4);
     invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
index 0099095..16c04e9 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
@@ -439,28 +439,28 @@
     self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
     use(--Func);
           ^^^^");
-    self::C<dynamic>*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+    self::C<dynamic>*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
     C ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
     use(C ??= 42);
         ^" : #t1);
-    dynamic.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+    dynamic.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
     dynamic ??= 42;
     ^^^^^^^" : null;
-    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
     use(dynamic ??= 42);
         ^^^^^^^" : #t2);
-    self::C::T*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+    self::C::T*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
     T ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
     use(T ??= 42);
         ^" : #t3);
-    () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+    () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
     Func ??= 42;
     ^^^^" : null;
-    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
     use(Func ??= 42);
         ^^^^" : #t4);
     invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
index 36ac25e..777322c 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
@@ -23,7 +23,7 @@
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
   Foo = null;
   ^^^";
-  () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+  () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
   Foo ??= null;
   ^^^" : null;
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
index 2fda16d..625cf29 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
   Foo = null;
   ^^^";
-  () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+  () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
   Foo ??= null;
   ^^^" : null;
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/sdk/lib/core/type.dart b/sdk/lib/core/type.dart
index d2e107b..65cef39 100644
--- a/sdk/lib/core/type.dart
+++ b/sdk/lib/core/type.dart
@@ -6,5 +6,53 @@
 
 /**
  * Runtime representation of a type.
+ *
+ * Type objects represent types.
+ * A type object can be created in several ways:
+ * * By a *type literal*, a type name occurring as an expression,
+ *   like `Type type = int;`,
+ *   or a type variable occurring as an expression, like `Type type = T;`.
+ * * By reading the run-time type of an object,
+ *   like `Type type = o.runtimeType;`.
+ * * Through `dart:mirrors`.
+ *
+ * A type object is intended as an entry point for using `dart:mirrors`.
+ * The only operations supported are comparing to other type objects
+ * for equality, and converting it to a string for debugging.
  */
-abstract class Type {}
+abstract class Type {
+  /**
+   * A hash code for the type which is compatible with [operator==].
+   */
+  int get hashCode;
+
+  /**
+   * Whether [other] is a [Type] instance representing an equivalent type.
+   *
+   * The language specification dictates which types are considered
+   * to be the equivalent.
+   * If two types are equivalent, it's guaranteed that they are subtypes
+   * of each other,
+   * but there are also types which are subtypes of each other,
+   * and which are not equivalent (for example `dynamic` and `void`,
+   * or `FutureOr<Object>` and `Object`).
+   */
+  bool operator ==(Object other);
+
+  /**
+   * Returns a string which represents the underlying type.
+   *
+   * The string is only intended for providing information to a reader
+   * while debugging.
+   * There is no guaranteed format,
+   * the string value returned for a [Type] instances is entirely
+   * implementation dependent.
+   *
+   * The string should be consistent, so a `Type` object for the *same* type
+   * returns the same string throughout a program execution.
+   * The string may or may not contain parts corresponding to the
+   * source name of declaration of the type, if the type has a source name
+   * at all (some types reachable through `dart:mirrors` may not).
+   */
+  String toString();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 09a704e..8b1debf 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 250
+PRERELEASE 251
 PRERELEASE_PATCH 0
\ No newline at end of file