Version 2.10.0-102.0.dev

Merge commit '0c1b39bac6aeea4e87d62d4d91c7298fae01d07c' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 011e3ca..9b56ce5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -75,6 +75,13 @@
 * Fix: Avoid exponential behaviour of error reporting from the solver.
 * Fix: Refresh binstubs after recompile in global run.
 
+## 2.9.3 - 2020-09-08
+
+This is a patch release that fixes DDC to handle a breaking change in Chrome
+(issue [#43193][]).
+
+[#43193]: https://github.com/dart-lang/sdk/issues/43193
+
 ## 2.9.2 - 2020-08-26
 
 This is a patch release that fixes transient StackOverflow exceptions when
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 cd62848..da4182e 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -191,6 +191,7 @@
         intType,
         "index",
         finalMask | hasInitializerMask,
+        /* isTopLevel = */ false,
         parent,
         charOffset,
         charOffset,
@@ -203,6 +204,7 @@
         stringType,
         "_name",
         finalMask | hasInitializerMask,
+        /* isTopLevel = */ false,
         parent,
         charOffset,
         charOffset,
@@ -234,6 +236,7 @@
         listType,
         "values",
         constMask | staticMask | hasInitializerMask,
+        /* isTopLevel = */ false,
         parent,
         charOffset,
         charOffset,
@@ -308,6 +311,7 @@
             selfType,
             name,
             constMask | staticMask | hasInitializerMask,
+            /* isTopLevel = */ false,
             parent,
             enumConstantInfo.charOffset,
             enumConstantInfo.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 156f55c..9f0a936 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -101,11 +101,18 @@
 
   bool hasBodyBeenBuilt = false;
 
+  // TODO(johnniwinther): [parent] is not trust-worthy for determining
+  //  properties since it is changed after the creation of the builder. For now
+  //  we require it has an argument here. A follow-up should clean up the
+  //  misuse of parent.
+  final bool isTopLevel;
+
   SourceFieldBuilder(
       this.metadata,
       this.type,
       this.name,
       this.modifiers,
+      this.isTopLevel,
       SourceLibraryBuilder libraryBuilder,
       int charOffset,
       int charEndOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index f8b81ce..6a9bacf 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1742,7 +1742,12 @@
     if (fieldInfos == null) return;
     String documentationComment = getDocumentationComment(beginToken);
     libraryBuilder.addFields(
-        documentationComment, metadata, modifiers, type, fieldInfos);
+        documentationComment,
+        metadata,
+        modifiers,
+        /* isTopLevel = */ true,
+        type,
+        fieldInfos);
   }
 
   @override
@@ -1804,7 +1809,12 @@
     if (fieldInfos == null) return;
     String documentationComment = getDocumentationComment(beginToken);
     libraryBuilder.addFields(
-        documentationComment, metadata, modifiers, type, fieldInfos);
+        documentationComment,
+        metadata,
+        modifiers,
+        /* isTopLevel = */ false,
+        type,
+        fieldInfos);
   }
 
   List<FieldInfo> popFieldInfos(int count) {
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 066cf2b..6df5e4c 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
@@ -747,8 +747,13 @@
     }
   }
 
-  void addFields(String documentationComment, List<MetadataBuilder> metadata,
-      int modifiers, TypeBuilder type, List<FieldInfo> fieldInfos) {
+  void addFields(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      bool isTopLevel,
+      TypeBuilder type,
+      List<FieldInfo> fieldInfos) {
     for (FieldInfo info in fieldInfos) {
       bool isConst = modifiers & constMask != 0;
       bool isFinal = modifiers & finalMask != 0;
@@ -765,8 +770,17 @@
         new Token.eof(startToken.previous.offset).setNext(startToken);
       }
       bool hasInitializer = info.initializerToken != null;
-      addField(documentationComment, metadata, modifiers, type, info.name,
-          info.charOffset, info.charEndOffset, startToken, hasInitializer,
+      addField(
+          documentationComment,
+          metadata,
+          modifiers,
+          isTopLevel,
+          type,
+          info.name,
+          info.charOffset,
+          info.charEndOffset,
+          startToken,
+          hasInitializer,
           constInitializerToken:
               potentiallyNeedInitializerInOutline ? startToken : null);
     }
@@ -1955,6 +1969,7 @@
       String documentationComment,
       List<MetadataBuilder> metadata,
       int modifiers,
+      bool isTopLevel,
       TypeBuilder type,
       String name,
       int charOffset,
@@ -2054,6 +2069,7 @@
         type,
         name,
         modifiers,
+        isTopLevel,
         this,
         charOffset,
         charEndOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index 369a202..2e1cf37 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -2,7 +2,7 @@
 // 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.
 
-library fasta.function_type_alias_builder;
+library fasta.source_type_alias_builder;
 
 import 'package:kernel/ast.dart'
     show
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 9c03dae..a0e7fca 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -663,6 +663,7 @@
 migration
 mime
 min
+misuse
 mixers
 mk
 mm
@@ -1250,6 +1251,7 @@
 with1
 wn
 worthwhile
+worthy
 writeln
 wrt
 wtf
diff --git a/pkg/front_end/testcases/static_field_lowering/enum.dart b/pkg/front_end/testcases/static_field_lowering/enum.dart
new file mode 100644
index 0000000..b55e257
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/enum.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum A {
+  a,
+  b,
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/static_field_lowering/enum.dart.textual_outline.expect b/pkg/front_end/testcases/static_field_lowering/enum.dart.textual_outline.expect
new file mode 100644
index 0000000..b42a46f
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/enum.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+enum A {
+  a,
+  b,
+}
+main() {}
diff --git a/pkg/front_end/testcases/static_field_lowering/enum.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/static_field_lowering/enum.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b42a46f
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/enum.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+enum A {
+  a,
+  b,
+}
+main() {}
diff --git a/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.expect b/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.expect
new file mode 100644
index 0000000..1fcfe08
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::A> values = #C7;
+  static const field self::A a = #C3;
+  static const field self::A b = #C6;
+  const constructor •(core::int index, core::String _name) → self::A
+    : self::A::index = index, self::A::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::A::_name};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "A.a"
+  #C3 = self::A {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "A.b"
+  #C6 = self::A {index:#C4, _name:#C5}
+  #C7 = <self::A*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.transformed.expect b/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.transformed.expect
new file mode 100644
index 0000000..1fcfe08
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::A> values = #C7;
+  static const field self::A a = #C3;
+  static const field self::A b = #C6;
+  const constructor •(core::int index, core::String _name) → self::A
+    : self::A::index = index, self::A::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::A::_name};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "A.a"
+  #C3 = self::A {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "A.b"
+  #C6 = self::A {index:#C4, _name:#C5}
+  #C7 = <self::A*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart b/pkg/front_end/testcases/static_field_lowering/opt_in.dart
index 2b45286..c549cad 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart
@@ -38,6 +38,9 @@
 
   static int? staticFieldWithoutInitializer;
 
+  int nonNullableInstanceFieldWithInitializer = init(55);
+  int? nullableInstanceFieldWithInitializer = init(17);
+
   static int nonNullableStaticFieldWithInitializer1 = init(55);
   static int? nullableStaticFieldWithInitializer1 = init(17);
 
@@ -121,6 +124,11 @@
 
   throws(() => Class.nullableStaticFinalFieldWithInitializer2,
       'Read nullableStaticFinalFieldWithInitializer2');
+
+  var c = new Class();
+  expect(17, lastInit);
+  expect(55, c.nonNullableInstanceFieldWithInitializer);
+  expect(17, c.nullableInstanceFieldWithInitializer);
 }
 
 expect(expected, actual) {
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline.expect
index f578832..c20a2c2 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline.expect
@@ -22,6 +22,8 @@
 class Class {
   static const int staticConstField = 123;
   static int? staticFieldWithoutInitializer;
+  int nonNullableInstanceFieldWithInitializer = init(55);
+  int? nullableInstanceFieldWithInitializer = init(17);
   static int nonNullableStaticFieldWithInitializer1 = init(55);
   static int? nullableStaticFieldWithInitializer1 = init(17);
   static int nonNullableStaticFieldWithInitializer2 = init(55);
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline_modelled.expect
index d41b0be..c292f45 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.textual_outline_modelled.expect
@@ -1,6 +1,8 @@
 T init<T>(T value) {}
 
 class Class {
+  int? nullableInstanceFieldWithInitializer = init(17);
+  int nonNullableInstanceFieldWithInitializer = init(55);
   static const int staticConstField = 123;
   static final int? nullableStaticFinalFieldWithInitializer1 = init(19);
   static final int? nullableStaticFinalFieldWithInitializer2 =
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect
index 39e6731..d53be31 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect
@@ -6,6 +6,8 @@
 class Class extends core::Object {
   static const field core::int staticConstField = #C1;
   static field core::int? staticFieldWithoutInitializer = null;
+  field core::int nonNullableInstanceFieldWithInitializer = self::init<core::int>(55);
+  field core::int? nullableInstanceFieldWithInitializer = self::init<core::int?>(17);
   static field core::int? _#nonNullableStaticFieldWithInitializer1 = null;
   static field core::int? _#nullableStaticFieldWithInitializer1 = null;
   static field core::bool _#nullableStaticFieldWithInitializer1#isSet = false;
@@ -211,6 +213,10 @@
   self::expect(19, self::lastInit);
   self::throws(() → core::int => self::Class::nonNullableStaticFinalFieldWithInitializer2, "Read nonNullableStaticFinalFieldWithInitializer2");
   self::throws(() → core::int? => self::Class::nullableStaticFinalFieldWithInitializer2, "Read nullableStaticFinalFieldWithInitializer2");
+  self::Class c = new self::Class::•();
+  self::expect(17, self::lastInit);
+  self::expect(55, c.{self::Class::nonNullableInstanceFieldWithInitializer});
+  self::expect(17, c.{self::Class::nullableInstanceFieldWithInitializer});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect
index 39e6731..d53be31 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect
@@ -6,6 +6,8 @@
 class Class extends core::Object {
   static const field core::int staticConstField = #C1;
   static field core::int? staticFieldWithoutInitializer = null;
+  field core::int nonNullableInstanceFieldWithInitializer = self::init<core::int>(55);
+  field core::int? nullableInstanceFieldWithInitializer = self::init<core::int?>(17);
   static field core::int? _#nonNullableStaticFieldWithInitializer1 = null;
   static field core::int? _#nullableStaticFieldWithInitializer1 = null;
   static field core::bool _#nullableStaticFieldWithInitializer1#isSet = false;
@@ -211,6 +213,10 @@
   self::expect(19, self::lastInit);
   self::throws(() → core::int => self::Class::nonNullableStaticFinalFieldWithInitializer2, "Read nonNullableStaticFinalFieldWithInitializer2");
   self::throws(() → core::int? => self::Class::nullableStaticFinalFieldWithInitializer2, "Read nullableStaticFinalFieldWithInitializer2");
+  self::Class c = new self::Class::•();
+  self::expect(17, self::lastInit);
+  self::expect(55, c.{self::Class::nonNullableInstanceFieldWithInitializer});
+  self::expect(17, c.{self::Class::nullableInstanceFieldWithInitializer});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_out.dart b/pkg/front_end/testcases/static_field_lowering/opt_out.dart
index 9ccd9b4..7ca4c56 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_out.dart
+++ b/pkg/front_end/testcases/static_field_lowering/opt_out.dart
@@ -30,6 +30,8 @@
 class Class {
   static const int staticConstField = 123;
 
+  int instanceFieldWithInitializer = init(55);
+
   static int staticFieldWithoutInitializer;
 
   static int staticFieldWithInitializer1 = init(55);
@@ -79,6 +81,10 @@
 
   throws(() => Class.staticFinalFieldWithInitializer2,
       'Read staticFinalFieldWithInitializer2');
+
+  var c = new Class();
+  expect(55, lastInit);
+  expect(55, c.instanceFieldWithInitializer);
 }
 
 expect(expected, actual) {
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline.expect b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline.expect
index e20bb46..a23e5df 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline.expect
@@ -14,6 +14,7 @@
 
 class Class {
   static const int staticConstField = 123;
+  int instanceFieldWithInitializer = init(55);
   static int staticFieldWithoutInitializer;
   static int staticFieldWithInitializer1 = init(55);
   static int staticFieldWithInitializer2 = init(55);
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline_modelled.expect
index 8a89bd3..44c72d7 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.textual_outline_modelled.expect
@@ -2,6 +2,7 @@
 T init<T>(T value) {}
 
 class Class {
+  int instanceFieldWithInitializer = init(55);
   static const int staticConstField = 123;
   static final int staticFinalFieldWithInitializer1 = init(73);
   static final int staticFinalFieldWithInitializer2 =
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.expect b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.expect
index 3b4d666..7fcf775 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.expect
@@ -4,6 +4,7 @@
 
 class Class extends core::Object {
   static const field core::int* staticConstField = #C1;
+  field core::int* instanceFieldWithInitializer = self::init<core::int*>(55);
   static field core::int* staticFieldWithoutInitializer = null;
   static field core::int* staticFieldWithInitializer1 = self::init<core::int*>(55);
   static field core::int* staticFieldWithInitializer2 = self::init<core::int*>(55);
@@ -60,6 +61,9 @@
   self::expect(73, self::Class::staticFinalFieldWithInitializer1);
   self::expect(73, self::lastInit);
   self::throws(() → core::int* => self::Class::staticFinalFieldWithInitializer2, "Read staticFinalFieldWithInitializer2");
+  self::Class* c = new self::Class::•();
+  self::expect(55, self::lastInit);
+  self::expect(55, c.{self::Class::instanceFieldWithInitializer});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.transformed.expect
index 3b4d666..7fcf775 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.transformed.expect
@@ -4,6 +4,7 @@
 
 class Class extends core::Object {
   static const field core::int* staticConstField = #C1;
+  field core::int* instanceFieldWithInitializer = self::init<core::int*>(55);
   static field core::int* staticFieldWithoutInitializer = null;
   static field core::int* staticFieldWithInitializer1 = self::init<core::int*>(55);
   static field core::int* staticFieldWithInitializer2 = self::init<core::int*>(55);
@@ -60,6 +61,9 @@
   self::expect(73, self::Class::staticFinalFieldWithInitializer1);
   self::expect(73, self::lastInit);
   self::throws(() → core::int* => self::Class::staticFinalFieldWithInitializer2, "Read staticFinalFieldWithInitializer2");
+  self::Class* c = new self::Class::•();
+  self::expect(55, self::lastInit);
+  self::expect(55, c.{self::Class::instanceFieldWithInitializer});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/tools/VERSION b/tools/VERSION
index a5cb519..fb4ad25 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 101
+PRERELEASE 102
 PRERELEASE_PATCH 0
\ No newline at end of file