Version 2.11.0-267.0.dev

Merge commit '34cedb980c99f19d9c7f69e7e41b3b1be8f93044' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28b2ea5..5e40af4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -50,6 +50,27 @@
 * Fixed `unawaited_futures` to handle `Future` subtypes.
 * New lint: `avoid_type_to_string`.
 
+## 2.10.3 - 2020-10-29
+
+This is a patch release that fixes the following issues:
+* breaking changes in Chrome 86 that affect DDC (issues [#43750][] and
+  [#43193][]).
+* compiler error causing incorrect use of positional parameters when named
+  parameters should be used instead (issues [flutter/flutter#65324][] and
+  [flutter/flutter#68092][]).
+* crashes and/or undefined behavor in AOT compiled code (issues [#43770][] and
+  [#43786][]).
+* AOT compilation of classes with more than 64 unboxed fields
+  (issue [flutter/flutter#67803][]).
+
+[#43750]: https://github.com/dart-lang/sdk/issues/43750
+[#43193]: https://github.com/dart-lang/sdk/issues/43193
+[flutter/flutter#65324]: https://github.com/flutter/flutter/issues/65324
+[flutter/flutter#68092]: https://github.com/flutter/flutter/issues/68092
+[#43770]: https://github.com/dart-lang/sdk/issues/43770
+[#43786]: https://github.com/dart-lang/sdk/issues/43786
+[flutter/flutter#67803]: https://github.com/flutter/flutter/issues/67803
+
 ## 2.10.2 - 2020-10-15
 
 This is a patch release that fixes a DDC compiler crash (issue [#43589]).
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 36f4dad..082be52 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -436,7 +436,7 @@
               typeSubstitution: getSubstitutionMap(cls.mixedInType));
           // TODO(jensj): Provide a "referenceFrom" if we need to support
           // the incremental compiler.
-          cls.addMember(cloneVisitor.cloneField(field, null));
+          cls.addField(cloneVisitor.cloneField(field, null));
           continue;
         }
         addField(field, includeStatic: false);
@@ -448,7 +448,7 @@
               typeSubstitution: getSubstitutionMap(cls.mixedInType));
           // TODO(jensj): Provide a "referenceFrom" if we need to support
           // the incremental compiler.
-          cls.addMember(cloneVisitor.cloneProcedure(procedure, null));
+          cls.addProcedure(cloneVisitor.cloneProcedure(procedure, null));
           continue;
         }
         addProcedure(procedure,
@@ -486,7 +486,7 @@
       for (var superclassConstructor in cls.superclass.constructors) {
         var forwardingConstructor = _buildForwardingConstructor(
             superclassCloner, superclassConstructor);
-        cls.addMember(forwardingConstructor);
+        cls.addConstructor(forwardingConstructor);
         _constructorMap[forwardingConstructor.name.text] =
             forwardingConstructor;
       }
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 537e376..deb42c7 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -264,7 +264,8 @@
         charEndOffset,
         toStringReference,
         null,
-        AsyncMarker.Sync);
+        AsyncMarker.Sync,
+        /* isExtensionInstanceMember = */ false);
     members["toString"] = toStringBuilder;
     String className = name;
     if (enumConstantInfos != null) {
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 1b81273..a4c221b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -82,6 +82,8 @@
   @override
   Procedure get actualProcedure => _procedure;
 
+  final bool isExtensionInstanceMember;
+
   ProcedureBuilderImpl(
       List<MetadataBuilder> metadata,
       int modifiers,
@@ -96,8 +98,10 @@
       this.charOpenParenOffset,
       int charEndOffset,
       Procedure referenceFrom,
+      this.isExtensionInstanceMember,
       [String nativeMethodName])
-      : _procedure = new Procedure(null, kind, null,
+      : _procedure = new Procedure(
+            null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
             fileUri: compilationUnit.fileUri,
             reference: referenceFrom?.reference)
           ..startFileOffset = startCharOffset
@@ -228,6 +232,7 @@
       Procedure referenceFrom,
       this._tearOffReferenceFrom,
       AsyncMarker asyncModifier,
+      bool isExtensionInstanceMember,
       [String nativeMethodName])
       : super(
             metadata,
@@ -243,6 +248,7 @@
             charOpenParenOffset,
             charEndOffset,
             referenceFrom,
+            isExtensionInstanceMember,
             nativeMethodName) {
     this.asyncModifier = asyncModifier;
   }
@@ -366,7 +372,7 @@
         _procedure.isExtensionMember = true;
         _procedure.isStatic = true;
         if (isExtensionInstanceMember) {
-          _procedure.kind = ProcedureKind.Method;
+          assert(_procedure.kind == ProcedureKind.Method);
         }
         _procedure.name = new Name(
             createProcedureName(true, !isExtensionInstanceMember, kind,
@@ -674,6 +680,7 @@
             charOpenParenOffset,
             charEndOffset,
             referenceFrom,
+            /* isExtensionInstanceMember = */ false,
             nativeMethodName);
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 700d6a9..331b581 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -208,7 +208,8 @@
   DillConstructorBuilder(this.constructor, Builder parent)
       : super(constructor, parent);
 
-  Member get member => constructor;
+  @override
+  Constructor get member => constructor;
 
   @override
   Member get readTarget => null;
@@ -217,7 +218,7 @@
   Member get writeTarget => null;
 
   @override
-  Member get invokeTarget => constructor;
+  Constructor get invokeTarget => constructor;
 }
 
 class DillClassMember extends BuilderClassMember {
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 51255bf..0885714 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -61,6 +61,7 @@
 
 import '../names.dart' show noSuchMethodName;
 
+import '../problems.dart';
 import '../scope.dart' show Scope;
 
 import '../source/source_class_builder.dart';
@@ -3168,7 +3169,18 @@
       Member stub =
           new ForwardingNode(combinedMemberSignature, kind).finalize();
       if (stub != null && classBuilder.cls == stub.enclosingClass) {
-        classBuilder.cls.addMember(stub);
+        if (stub is Procedure) {
+          classBuilder.cls.addProcedure(stub);
+        } else if (stub is Field) {
+          classBuilder.cls.addField(stub);
+        } else if (stub is Constructor) {
+          classBuilder.cls.addConstructor(stub);
+        } else if (stub is RedirectingFactoryConstructor) {
+          classBuilder.cls.addRedirectingFactoryConstructor(stub);
+        } else {
+          unhandled("${stub.runtimeType}", "getMember", stub.fileOffset,
+              stub.fileUri);
+        }
         SourceLibraryBuilder library = classBuilder.library;
         Member bestMemberSoFar =
             combinedMemberSignature.canonicalMember.getMember(hierarchy);
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 6a9bacf..471859f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -862,7 +862,8 @@
         endToken.charOffset,
         nativeMethodName,
         asyncModifier,
-        isTopLevel: true);
+        isTopLevel: true,
+        isExtensionInstanceMember: false);
     nativeMethodName = null;
   }
 
@@ -950,42 +951,42 @@
   @override
   void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.classMethod);
   }
 
   void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.classConstructor);
   }
 
   void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.mixinMethod);
   }
 
   void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.extensionMethod);
   }
 
   void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.mixinConstructor);
   }
 
   void endExtensionConstructor(Token getOrSet, Token beginToken,
       Token beginParam, Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.extensionConstructor);
   }
 
   void _endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken, bool isConstructor) {
+      Token beginInitializers, Token endToken, _MethodKind methodKind) {
     assert(checkState(beginToken, [ValueKinds.MethodBody]));
     debugEvent("Method");
     MethodBody bodyKind = pop();
@@ -1113,12 +1114,23 @@
       return;
     }
 
-    String constructorName = isConstructor
-        ? (libraryBuilder.computeAndValidateConstructorName(name, charOffset) ??
-            name)
-        : null;
+    String constructorName;
+    switch (methodKind) {
+      case _MethodKind.classConstructor:
+      case _MethodKind.mixinConstructor:
+      case _MethodKind.extensionConstructor:
+        constructorName = libraryBuilder.computeAndValidateConstructorName(
+                name, charOffset) ??
+            name;
+        break;
+      case _MethodKind.classMethod:
+      case _MethodKind.mixinMethod:
+      case _MethodKind.extensionMethod:
+        break;
+    }
+    bool isStatic = (modifiers & staticMask) != 0;
     if (constructorName == null &&
-        (modifiers & staticMask) == 0 &&
+        !isStatic &&
         libraryBuilder.currentTypeParameterScopeBuilder.kind ==
             TypeParameterScopeKind.extensionDeclaration) {
       TypeParameterScopeBuilder extension =
@@ -1216,7 +1228,9 @@
           endToken.charOffset,
           nativeMethodName,
           asyncModifier,
-          isTopLevel: false);
+          isTopLevel: false,
+          isExtensionInstanceMember:
+              methodKind == _MethodKind.extensionMethod && !isStatic);
     }
     nativeMethodName = null;
     inConstructor = false;
@@ -2184,3 +2198,12 @@
     // printEvent('OutlineBuilder: $name');
   }
 }
+
+enum _MethodKind {
+  classConstructor,
+  classMethod,
+  mixinConstructor,
+  mixinMethod,
+  extensionConstructor,
+  extensionMethod,
+}
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 de76fc2..35a1e40 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
@@ -147,7 +147,18 @@
               (Member member, BuiltMemberKind memberKind) {
             member.parent = cls;
             if (!memberBuilder.isPatch && !memberBuilder.isDuplicate) {
-              cls.addMember(member);
+              if (member is Procedure) {
+                cls.addProcedure(member);
+              } else if (member is Field) {
+                cls.addField(member);
+              } else if (member is Constructor) {
+                cls.addConstructor(member);
+              } else if (member is RedirectingFactoryConstructor) {
+                cls.addRedirectingFactoryConstructor(member);
+              } else {
+                unhandled("${member.runtimeType}", "getMember",
+                    member.fileOffset, member.fileUri);
+              }
             }
           });
         } else {
@@ -545,7 +556,7 @@
     constructorScopeBuilder.addMember(name, constructorBuilder);
     // Synthetic constructors are created after the component has been built
     // so we need to add the constructor to the class.
-    cls.addMember(constructorBuilder.member);
+    cls.addConstructor(constructorBuilder.member);
     if (constructorBuilder.isConst) {
       cls.hasConstConstructor = true;
     }
@@ -851,7 +862,7 @@
           fileUri: cls.fileUri,
           reference: referenceFrom?.reference)
         ..fileOffset = cls.fileOffset;
-      cls.addMember(field);
+      cls.addField(field);
       constructorsField = new DillFieldBuilder(field, this);
       origin.scope
           .addLocalMember(redirectingName, constructorsField, setter: false);
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 867fb41..0479011 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -146,7 +146,14 @@
                   break;
               }
               assert(kind != null);
-              libraryBuilder.library.addMember(member);
+              if (member is Field) {
+                libraryBuilder.library.addField(member);
+              } else if (member is Procedure) {
+                libraryBuilder.library.addProcedure(member);
+              } else {
+                unhandled("${member.runtimeType}", "buildBuilders",
+                    member.fileOffset, member.fileUri);
+              }
               extension.members.add(new ExtensionMemberDescriptor(
                   name: new Name(memberBuilder.name, libraryBuilder.library),
                   member: member.reference,
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 ea70844..badb049 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
@@ -972,7 +972,7 @@
 
     if (unserializableExports != null) {
       Field referenceFrom = referencesFromIndexed?.lookupField("_exports#");
-      library.addMember(new Field(new Name("_exports#", library),
+      library.addField(new Field(new Name("_exports#", library),
           initializer: new StringLiteral(jsonEncode(unserializableExports)),
           isStatic: true,
           isConst: true,
@@ -2282,7 +2282,11 @@
       int charEndOffset,
       String nativeMethodName,
       AsyncMarker asyncModifier,
-      {bool isTopLevel}) {
+      {bool isTopLevel,
+      bool isExtensionInstanceMember}) {
+    assert(isTopLevel != null);
+    assert(isExtensionInstanceMember != null);
+
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     if (returnType == null) {
       if (kind == ProcedureKind.Operator &&
@@ -2357,6 +2361,7 @@
         referenceFrom,
         tearOffReferenceFrom,
         asyncModifier,
+        isExtensionInstanceMember,
         nativeMethodName);
     metadataCollector?.setDocumentationComment(
         procedureBuilder.procedure, documentationComment);
@@ -2443,6 +2448,7 @@
           referenceFrom,
           null,
           asyncModifier,
+          /* isExtensionInstanceMember = */ false,
           nativeMethodName);
     }
 
@@ -2608,11 +2614,17 @@
           (Member member, BuiltMemberKind memberKind) {
         if (member is Field) {
           member.isStatic = true;
+          if (!declaration.isPatch && !declaration.isDuplicate) {
+            library.addField(member);
+          }
         } else if (member is Procedure) {
           member.isStatic = true;
-        }
-        if (!declaration.isPatch && !declaration.isDuplicate) {
-          library.addMember(member);
+          if (!declaration.isPatch && !declaration.isDuplicate) {
+            library.addProcedure(member);
+          }
+        } else {
+          unhandled("${member.runtimeType}:${memberKind}", "buildBuilder",
+              declaration.charOffset, declaration.fileUri);
         }
       });
     } else if (declaration is SourceTypeAliasBuilder) {
@@ -2807,7 +2819,7 @@
     for (Import import in imports) {
       if (import.deferred) {
         Procedure tearoff = import.prefixBuilder.loadLibraryBuilder.tearoff;
-        if (tearoff != null) library.addMember(tearoff);
+        if (tearoff != null) library.addProcedure(tearoff);
         total++;
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 7dfb32e..a8a4a63 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -474,7 +474,8 @@
         -1,
         null,
         null,
-        AsyncMarker.Sync)
+        AsyncMarker.Sync,
+        /* isExtensionInstanceMember = */ false)
       ..parent = parent;
     BodyBuilder listener = dietListener.createListener(
         builder, dietListener.memberScope,
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index d4e1665..a1ac89a 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart
@@ -23,7 +23,7 @@
     Library library = new Library(Uri.parse("org.dartlang.fasta:library"));
     Field field = new Field(new Name("_exports#", library),
         initializer: new StringLiteral('{"main":"Problem with main"}'));
-    library.addMember(field);
+    library.addField(field);
     Component component = new Component(libraries: <Library>[library]);
     await CompilerContext.runWithDefaultOptions((CompilerContext c) async {
       DillTarget target = new DillTarget(c.options.ticker,
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 84c4f14..3ebb511 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -18,7 +18,6 @@
         Expression,
         FunctionNode,
         Library,
-        Member,
         Name,
         Procedure,
         ProcedureKind,
@@ -83,11 +82,11 @@
         null);
     LoadLibraryBuilder loadLibraryBuilder =
         new LoadLibraryBuilder(libraryBuilder, null, -1);
-    Member getter = new Procedure(
+    Procedure getter = new Procedure(
         new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null));
-    Member interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
+    Procedure interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
         ProcedureKind.Method, new FunctionNode(null));
-    Member setter = new Procedure(
+    Procedure setter = new Procedure(
         new Name("mySetter"), ProcedureKind.Setter, new FunctionNode(null));
     Message message = templateUnspecified.withArguments("My Message.");
     Name binaryOperator = new Name("+");
@@ -112,7 +111,7 @@
     library.addClass(cls);
     library.addProcedure(getter);
     library.addProcedure(setter);
-    cls.addMember(interfaceTarget);
+    cls.addProcedure(interfaceTarget);
 
     PrefixUseGenerator prefixUseGenerator =
         new PrefixUseGenerator(helper, token, prefixBuilder);
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 b364cc6..69abdd8 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -1911,7 +1911,7 @@
         reference: lib.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
             ?.reference);
-    lib.addMember(field);
+    lib.addField(field);
     for (Class c in lib.classes) {
       if (c.fields
           .where((f) => f.name.text == "unique_SimulateTransformer")
@@ -1923,7 +1923,7 @@
           reference: c.reference.canonicalName
               ?.getChildFromFieldWithName(fieldName)
               ?.reference);
-      c.addMember(field);
+      c.addField(field);
     }
   }
 }
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index fc136ab..7f9e8d2 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -244,6 +244,14 @@
     // Should be ok, but we shouldn't actually initialize from dill.
     List<int> mixedPart1;
     {
+      // Create a component that is compiled without NNBD.
+      Map<ExperimentalFlag, bool> prevTesting =
+          options.defaultExperimentFlagsForTesting;
+      options.defaultExperimentFlagsForTesting = {
+        ExperimentalFlag.nonNullable: false
+      };
+      NnbdMode prevNnbd = options.nnbdMode;
+      options.nnbdMode = NnbdMode.Weak;
       compiler = new IncrementalCompiler(
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helper2File])),
@@ -252,10 +260,13 @@
       c.setMainMethodAndMode(
           null, false, NonNullableByDefaultCompiledMode.Weak);
       mixedPart1 = serializeComponent(c);
+      options.defaultExperimentFlagsForTesting = prevTesting;
+      options.nnbdMode = prevNnbd;
     }
 
     List<int> mixedPart2;
     {
+      // Create a component that is compiled with strong NNBD.
       Map<ExperimentalFlag, bool> prevTesting =
           options.defaultExperimentFlagsForTesting;
       options.defaultExperimentFlagsForTesting = {
@@ -275,6 +286,9 @@
       options.nnbdMode = prevNnbd;
     }
 
+    // Now mix the two components together and try to initialize from them.
+    // We expect the compilation to be OK but that the dill is not actually
+    // used to initialize from (as it's invalid because of the mixed mode).
     List<int> mixed = [];
     mixed.addAll(mixedPart1);
     mixed.addAll(mixedPart2);
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index c577233..17e9ba5 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -316,7 +316,7 @@
   library.addClass(cls);
   Procedure factoryConstructor = new Procedure(
       new Name(''), ProcedureKind.Factory, new FunctionNode(null));
-  cls.addMember(factoryConstructor);
+  cls.addProcedure(factoryConstructor);
 
   testExpression(
       new FactoryConstructorInvocationJudgment(
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index de1281f..6470e3a 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -143,7 +143,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 47;
+  UInt32 formatVersion = 49;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -230,8 +230,7 @@
 }
 
 type Library {
-  Byte flags (_unused_, isSynthetic, isNonNullableByDefault,
-              nnbdModeBit1, nnbdModeBit2);
+  Byte flags (isSynthetic, isNonNullableByDefault, nnbdModeBit1, nnbdModeBit2);
   UInt languageVersionMajor;
   UInt languageVersionMinor;
   CanonicalNameReference canonicalName;
@@ -301,16 +300,6 @@
   Byte tag;
 }
 
-enum ClassLevel { Type = 0, Hierarchy = 1, Mixin = 2, Body = 3, }
-
-// A class can be represented at one of three levels: type, hierarchy, or body.
-//
-// If the enclosing library is external, a class is either at type or
-// hierarchy level, depending on its isTypeLevel flag.
-// If the enclosing library is not external, a class is always at body level.
-//
-// See ClassLevel in ast.dart for the details of each loading level.
-
 type Class extends Node {
   Byte tag = 2;
   CanonicalNameReference canonicalName;
@@ -319,9 +308,8 @@
   FileOffset startFileOffset; // Offset of the start of the class including any annotations.
   FileOffset fileOffset; // Offset of the name of the class.
   FileOffset fileEndOffset;
-  Byte flags (levelBit0, levelBit1, isAbstract, isEnum, isAnonymousMixin,
-              isEliminatedMixin, isMixinDeclaration,
-              hasConstConstructor); // Where level is index into ClassLevel
+  Byte flags (isAbstract, isEnum, isAnonymousMixin, isEliminatedMixin,
+              isMixinDeclaration, hasConstConstructor);
   StringReference name;
   List<Expression> annotations;
   List<TypeParameter> typeParameters;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 917c48e..09193dc 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -366,10 +366,10 @@
     _languageVersion = languageVersion;
   }
 
-  static const int SyntheticFlag = 1 << 1;
-  static const int NonNullableByDefaultFlag = 1 << 2;
-  static const int NonNullableByDefaultModeBit1Weak = 1 << 3;
-  static const int NonNullableByDefaultModeBit2Strong = 1 << 4;
+  static const int SyntheticFlag = 1 << 0;
+  static const int NonNullableByDefaultFlag = 1 << 1;
+  static const int NonNullableByDefaultModeBit1 = 1 << 2;
+  static const int NonNullableByDefaultModeBit2 = 1 << 3;
 
   int flags = 0;
 
@@ -388,32 +388,29 @@
   }
 
   NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode {
-    bool weak = (flags & NonNullableByDefaultModeBit1Weak) != 0;
-    bool strong = (flags & NonNullableByDefaultModeBit2Strong) != 0;
-
-    if (weak && strong) return NonNullableByDefaultCompiledMode.Agnostic;
-    if (strong) return NonNullableByDefaultCompiledMode.Strong;
-    if (weak) return NonNullableByDefaultCompiledMode.Weak;
-    // Nothing set is implicitly weak.
-    return NonNullableByDefaultCompiledMode.Weak;
+    bool bit1 = (flags & NonNullableByDefaultModeBit1) != 0;
+    bool bit2 = (flags & NonNullableByDefaultModeBit2) != 0;
+    if (!bit1 && !bit2) return NonNullableByDefaultCompiledMode.Weak;
+    if (bit1 && !bit2) return NonNullableByDefaultCompiledMode.Strong;
+    if (bit1 && bit2) return NonNullableByDefaultCompiledMode.Agnostic;
+    // !bit1 && bit2 is unused.
+    throw new StateError("Unused bit-pattern for compilation mode");
   }
 
   void set nonNullableByDefaultCompiledMode(
       NonNullableByDefaultCompiledMode mode) {
-    // Technically we could but the isNonNullableByDefault flag in here as it's
-    // only allowed when we're weak.
     switch (mode) {
       case NonNullableByDefaultCompiledMode.Weak:
-        flags = (flags | NonNullableByDefaultModeBit1Weak) &
-            ~NonNullableByDefaultModeBit2Strong;
+        flags = (flags & ~NonNullableByDefaultModeBit1) &
+            ~NonNullableByDefaultModeBit2;
         break;
       case NonNullableByDefaultCompiledMode.Strong:
-        flags = (flags & ~NonNullableByDefaultModeBit1Weak) |
-            NonNullableByDefaultModeBit2Strong;
+        flags = (flags | NonNullableByDefaultModeBit1) &
+            ~NonNullableByDefaultModeBit2;
         break;
       case NonNullableByDefaultCompiledMode.Agnostic:
-        flags = (flags | NonNullableByDefaultModeBit1Weak) |
-            NonNullableByDefaultModeBit2Strong;
+        flags = (flags | NonNullableByDefaultModeBit1) |
+            NonNullableByDefaultModeBit2;
         break;
     }
   }
@@ -498,17 +495,6 @@
   Iterable<Member> get members =>
       <Iterable<Member>>[fields, procedures].expand((x) => x);
 
-  void addMember(Member member) {
-    member.parent = this;
-    if (member is Procedure) {
-      procedures.add(member);
-    } else if (member is Field) {
-      fields.add(member);
-    } else {
-      throw new ArgumentError(member);
-    }
-  }
-
   void addAnnotation(Expression node) {
     node.parent = this;
     annotations.add(node);
@@ -547,11 +533,11 @@
     }
     for (int i = 0; i < fields.length; ++i) {
       Field field = fields[i];
-      canonicalName.getChildFromMember(field).bindTo(field.reference);
+      canonicalName.getChildFromField(field).bindTo(field.reference);
     }
     for (int i = 0; i < procedures.length; ++i) {
       Procedure member = procedures[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromProcedure(member).bindTo(member.reference);
     }
     for (int i = 0; i < classes.length; ++i) {
       Class class_ = classes[i];
@@ -886,53 +872,6 @@
   }
 }
 
-/// The degree to which the contents of a class have been loaded into memory.
-///
-/// Each level imply the requirements of the previous ones.
-enum ClassLevel {
-  /// Temporary loading level for internal use by IR producers.  Consumers of
-  /// kernel code should not expect to see classes at this level.
-  Temporary,
-
-  /// The class may be used as a type, and it may contain members that are
-  /// referenced from this build unit.
-  ///
-  /// The type parameters and their bounds are present.
-  ///
-  /// There is no guarantee that all members are present.
-  ///
-  /// All supertypes of this class are at [Type] level or higher.
-  Type,
-
-  /// All instance members of the class are present.
-  ///
-  /// All supertypes of this class are at [Hierarchy] level or higher.
-  ///
-  /// This level exists so supertypes of a fully loaded class contain all the
-  /// members needed to detect override constraints.
-  Hierarchy,
-
-  /// All instance members of the class have their body loaded, and their
-  /// annotations are present.
-  ///
-  /// All supertypes of this class are at [Hierarchy] level or higher.
-  ///
-  /// If this class is a mixin application, then its mixin is loaded at [Mixin]
-  /// level or higher.
-  ///
-  /// This level exists so the contents of a mixin can be cloned into a
-  /// mixin application.
-  Mixin,
-
-  /// All members of the class are fully loaded and are in the correct order.
-  ///
-  /// Annotations are present on classes and members.
-  ///
-  /// All supertypes of this class are at [Hierarchy] level or higher,
-  /// not necessarily at [Body] level.
-  Body,
-}
-
 /// List-wrapper that marks the parent-class as dirty if the list is modified.
 ///
 /// The idea being, that for non-dirty classes (classes just loaded from dill)
@@ -989,9 +928,6 @@
   /// (this is the default if none is specifically set).
   int fileEndOffset = TreeNode.noOffset;
 
-  /// The degree to which the contents of the class have been loaded.
-  ClassLevel level = ClassLevel.Body;
-
   /// List of metadata annotations on the class.
   ///
   /// This defaults to an immutable empty list. Use [addAnnotation] to add
@@ -1008,13 +944,12 @@
   String name;
 
   // Must match serialized bit positions.
-  static const int LevelMask = 0x3; // Bits 0 and 1.
-  static const int FlagAbstract = 1 << 2;
-  static const int FlagEnum = 1 << 3;
-  static const int FlagAnonymousMixin = 1 << 4;
-  static const int FlagEliminatedMixin = 1 << 5;
-  static const int FlagMixinDeclaration = 1 << 6;
-  static const int FlagHasConstConstructor = 1 << 7;
+  static const int FlagAbstract = 1 << 0;
+  static const int FlagEnum = 1 << 1;
+  static const int FlagAnonymousMixin = 1 << 2;
+  static const int FlagEliminatedMixin = 1 << 3;
+  static const int FlagMixinDeclaration = 1 << 4;
+  static const int FlagHasConstConstructor = 1 << 5;
 
   int flags = 0;
 
@@ -1242,19 +1177,21 @@
     if (!dirty) return;
     for (int i = 0; i < fields.length; ++i) {
       Field member = fields[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromField(member).bindTo(member.reference);
     }
     for (int i = 0; i < procedures.length; ++i) {
       Procedure member = procedures[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromProcedure(member).bindTo(member.reference);
     }
     for (int i = 0; i < constructors.length; ++i) {
       Constructor member = constructors[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromConstructor(member).bindTo(member.reference);
     }
     for (int i = 0; i < redirectingFactoryConstructors.length; ++i) {
       RedirectingFactoryConstructor member = redirectingFactoryConstructors[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName
+          .getChildFromRedirectingFactoryConstructor(member)
+          .bindTo(member.reference);
     }
     dirty = false;
   }
@@ -1347,24 +1284,33 @@
   /// if false we can skip it.
   bool dirty = true;
 
-  /// Adds a member to this class.
-  ///
-  /// Throws an error if attempting to add a field or procedure to a mixin
-  /// application.
-  void addMember(Member member) {
+  /// Adds a constructor to this class.
+  void addConstructor(Constructor constructor) {
     dirty = true;
-    member.parent = this;
-    if (member is Constructor) {
-      constructorsInternal.add(member);
-    } else if (member is Procedure) {
-      proceduresInternal.add(member);
-    } else if (member is Field) {
-      fieldsInternal.add(member);
-    } else if (member is RedirectingFactoryConstructor) {
-      redirectingFactoryConstructorsInternal.add(member);
-    } else {
-      throw new ArgumentError(member);
-    }
+    constructor.parent = this;
+    constructorsInternal.add(constructor);
+  }
+
+  /// Adds a procedure to this class.
+  void addProcedure(Procedure procedure) {
+    dirty = true;
+    procedure.parent = this;
+    proceduresInternal.add(procedure);
+  }
+
+  /// Adds a field to this class.
+  void addField(Field field) {
+    dirty = true;
+    field.parent = this;
+    fieldsInternal.add(field);
+  }
+
+  /// Adds a field to this class.
+  void addRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor redirectingFactoryConstructor) {
+    dirty = true;
+    redirectingFactoryConstructor.parent = this;
+    redirectingFactoryConstructorsInternal.add(redirectingFactoryConstructor);
   }
 
   void addAnnotation(Expression node) {
@@ -2176,7 +2122,7 @@
   /// set).
   int startFileOffset = TreeNode.noOffset;
 
-  ProcedureKind kind;
+  final ProcedureKind kind;
   int flags = 0;
   // function is null if and only if abstract, external.
   FunctionNode function;
@@ -2257,7 +2203,8 @@
       this.forwardingStubSuperTargetReference,
       this.forwardingStubInterfaceTargetReference,
       this.memberSignatureOriginReference})
-      : super(name, fileUri, reference) {
+      : assert(kind != null),
+        super(name, fileUri, reference) {
     function?.parent = this;
     this.isAbstract = isAbstract;
     this.isStatic = isStatic;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index ab556d1..8153e05 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1149,9 +1149,7 @@
       node = null;
     }
     if (node == null) {
-      node = new Class(reference: reference)
-        ..level = ClassLevel.Temporary
-        ..dirty = false;
+      node = new Class(reference: reference)..dirty = false;
     }
 
     var fileUri = readUriReference();
@@ -1159,12 +1157,7 @@
     node.fileOffset = readOffset();
     node.fileEndOffset = readOffset();
     int flags = readByte();
-    node.flags = flags & ~Class.LevelMask;
-    int levelIndex = flags & Class.LevelMask;
-    var level = ClassLevel.values[levelIndex + 1];
-    if (level.index >= node.level.index) {
-      node.level = level;
-    }
+    node.flags = flags;
     var name = readStringOrNullIfEmpty();
     var annotations = readAnnotationList(node);
     assert(() {
@@ -1378,15 +1371,17 @@
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    if (node == null) {
-      node = new Procedure(null, null, null, reference: reference);
-    }
     var fileUri = readUriReference();
     var startFileOffset = readOffset();
     var fileOffset = readOffset();
     var fileEndOffset = readOffset();
     int kindIndex = readByte();
     var kind = ProcedureKind.values[kindIndex];
+    if (node == null) {
+      node = new Procedure(null, kind, null, reference: reference);
+    } else {
+      assert(node.kind == kind);
+    }
     var flags = readUInt();
     var name = readName();
     var annotations = readAnnotationList(node);
@@ -1410,7 +1405,6 @@
     node.startFileOffset = startFileOffset;
     node.fileOffset = fileOffset;
     node.fileEndOffset = fileEndOffset;
-    node.kind = kind;
     node.flags = flags;
     node.name = name;
     node.fileUri = fileUri;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 872398e..a5a426f 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1113,20 +1113,12 @@
     }
   }
 
-  int _encodeClassFlags(int flags, ClassLevel level) {
-    assert((flags & Class.LevelMask) == 0);
-    final levelIndex = level.index - 1;
-    assert((levelIndex & Class.LevelMask) == levelIndex);
-    return flags | levelIndex;
-  }
-
   @override
   void visitClass(Class node) {
     classOffsets.add(getBufferOffset());
 
     if (node.isAnonymousMixin) _currentlyInNonimplementation = true;
 
-    int flags = _encodeClassFlags(node.flags, node.level);
     if (node.canonicalName == null) {
       throw new ArgumentError('Missing canonical name for $node');
     }
@@ -1137,7 +1129,7 @@
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
 
-    writeByte(flags);
+    writeByte(node.flags);
     writeStringReference(node.name ?? '');
 
     enterScope(memberScope: true);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 4fdf50b..ebdf993 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -146,7 +146,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 47;
+  static const int BinaryFormatVersion = 49;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 95acedd..27e66ef 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -122,9 +122,24 @@
         : getChild(name.text);
   }
 
-  CanonicalName getChildFromMember(Member member) {
-    return getChild(getMemberQualifier(member))
-        .getChildFromQualifiedName(member.name);
+  CanonicalName getChildFromProcedure(Procedure procedure) {
+    return getChild(getProcedureQualifier(procedure))
+        .getChildFromQualifiedName(procedure.name);
+  }
+
+  CanonicalName getChildFromField(Field field) {
+    return getChild('@fields').getChildFromQualifiedName(field.name);
+  }
+
+  CanonicalName getChildFromConstructor(Constructor constructor) {
+    return getChild('@constructors')
+        .getChildFromQualifiedName(constructor.name);
+  }
+
+  CanonicalName getChildFromRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor redirectingFactoryConstructor) {
+    return getChild('@factories')
+        .getChildFromQualifiedName(redirectingFactoryConstructor.name);
   }
 
   CanonicalName getChildFromFieldWithName(Name name) {
@@ -210,22 +225,10 @@
     return reference ??= (new Reference()..canonicalName = this);
   }
 
-  static String getMemberQualifier(Member member) {
-    if (member is Procedure) {
-      if (member.isGetter) return '@getters';
-      if (member.isSetter) return '@setters';
-      if (member.isFactory) return '@factories';
-      return '@methods';
-    }
-    if (member is Field) {
-      return '@fields';
-    }
-    if (member is Constructor) {
-      return '@constructors';
-    }
-    if (member is RedirectingFactoryConstructor) {
-      return '@factories';
-    }
-    throw 'Unexpected member: $member';
+  static String getProcedureQualifier(Procedure procedure) {
+    if (procedure.isGetter) return '@getters';
+    if (procedure.isSetter) return '@setters';
+    if (procedure.isFactory) return '@factories';
+    return '@methods';
   }
 }
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 602ec1c7..f83e594 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -640,7 +640,7 @@
     return result;
   }
 
-  cloneProcedure(Procedure node, Procedure referenceFrom) {
+  Procedure cloneProcedure(Procedure node, Procedure referenceFrom) {
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = node.fileUri ?? _activeFileUri;
 
@@ -664,7 +664,7 @@
     return result;
   }
 
-  cloneField(Field node, Field referenceFrom) {
+  Field cloneField(Field node, Field referenceFrom) {
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = node.fileUri ?? _activeFileUri;
 
@@ -692,7 +692,8 @@
     return result;
   }
 
-  cloneRedirectingFactoryConstructor(RedirectingFactoryConstructor node,
+  RedirectingFactoryConstructor cloneRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor node,
       RedirectingFactoryConstructor referenceFrom) {
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = node.fileUri ?? _activeFileUri;
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index e633d04..5d12e73 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1617,8 +1617,8 @@
 const Map<int, String> libraryFlagToName = const {
   Library.SyntheticFlag: "synthetic",
   Library.NonNullableByDefaultFlag: "nnbd",
-  Library.NonNullableByDefaultModeBit1Weak: "nnbd-weak",
-  Library.NonNullableByDefaultModeBit2Strong: "nnbd-strong",
+  Library.NonNullableByDefaultModeBit1: "nnbd-bit1",
+  Library.NonNullableByDefaultModeBit2: "nnbd-bit2",
 };
 
 class LibraryFlagTagger implements Tagger<int> {
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 8af53bf..345d452 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -83,8 +83,7 @@
     }
 
     // Ensure super classes have been transformed before this class.
-    if (class_.superclass != null &&
-        class_.superclass.level.index >= ClassLevel.Mixin.index) {
+    if (class_.superclass != null) {
       transformClass(librariesToBeTransformed, processedClasses,
           transformedClasses, class_.superclass, referenceFromIndex);
     }
@@ -94,12 +93,6 @@
     if (!class_.isMixinApplication) return;
     assert(librariesToBeTransformed.contains(enclosingLibrary));
 
-    if (class_.mixedInClass.level.index < ClassLevel.Mixin.index) {
-      throw new Exception(
-          'Class "${class_.name}" mixes in "${class_.mixedInClass.name}" from'
-          ' an external library.  Did you forget --link?');
-    }
-
     transformedClasses.add(class_);
 
     // Clone fields and methods from the mixin class.
@@ -134,7 +127,7 @@
         clone.isGenericCovariantImpl = parameter.isGenericCovariantImpl;
       }
       nonSetters.remove(field.name);
-      class_.addMember(clone);
+      class_.addField(clone);
     }
     class_.procedures.clear();
     class_.procedures..addAll(nonSetters.values)..addAll(setters.values);
@@ -208,7 +201,7 @@
 
         class_.procedures[originalIndex] = clone;
       } else {
-        class_.addMember(clone);
+        class_.addProcedure(clone);
       }
     }
     assert(class_.constructors.isNotEmpty);
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index a47072d..3713e32 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -382,7 +382,7 @@
         reference: clazz.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
             ?.reference);
-    clazz.addMember(locationField);
+    clazz.addField(locationField);
 
     final Set<Constructor> _handledConstructors =
         new Set<Constructor>.identity();
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index d56989a..5e21e5c 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -183,7 +183,7 @@
           positionalParameters: [other]),
       fileUri: cls.fileUri)
     ..fileOffset = cls.fileOffset;
-  cls.addMember(equalsOperator);
+  cls.addProcedure(equalsOperator);
 }
 
 void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
@@ -226,7 +226,7 @@
     targetsHashcode[variable] = targetHashcode;
     targets[variable] = target;
   }
-  cls.addMember(Procedure(
+  cls.addProcedure(Procedure(
       Name("hashCode"),
       ProcedureKind.Getter,
       FunctionNode(
@@ -278,7 +278,7 @@
   }
   DartType returnType =
       coreTypes.stringRawType(cls.enclosingLibrary.nonNullable);
-  cls.addMember(Procedure(
+  cls.addProcedure(Procedure(
       Name("toString"),
       ProcedureKind.Method,
       FunctionNode(ReturnStatement(StringConcatenation(wording)),
@@ -311,7 +311,7 @@
     targets[variable] = target;
   }
 
-  cls.addMember(Procedure(
+  cls.addProcedure(Procedure(
       Name("copyWith"),
       ProcedureKind.Method,
       FunctionNode(
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 731e054..613f5f7 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -167,7 +167,7 @@
         hierarchy.getDispatchTargets(a), unorderedEquals([methodA1, methodA2]));
 
     // Add a member to A, but only update A.
-    a.addMember(methodA3);
+    a.addProcedure(methodA3);
     hierarchy.applyMemberChanges([a]);
     expect(hierarchy.getDispatchTargets(b),
         unorderedEquals([methodA1, methodA2, methodB1]));
diff --git a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
index 3d37648..05bbc05 100644
--- a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
+++ b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
@@ -22,8 +22,8 @@
   Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method,
       new FunctionNode(new ReturnStatement()))
     ..fileUri = uri1;
-  library1.addMember(p1);
-  library2.addMember(p2);
+  library1.addProcedure(p1);
+  library2.addProcedure(p2);
 
   Component component = new Component(libraries: [library1, library2])
     ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
diff --git a/pkg/kernel/test/relink_test.dart b/pkg/kernel/test/relink_test.dart
index fef6210..ed51ee6 100644
--- a/pkg/kernel/test/relink_test.dart
+++ b/pkg/kernel/test/relink_test.dart
@@ -91,7 +91,7 @@
       new Name("method"),
       ProcedureKind.Method,
       new FunctionNode(libProcedureBody, returnType: new DynamicType()));
-  lib.addMember(libProcedure);
+  lib.addProcedure(libProcedure);
 
   final Library main = new Library(Uri.parse('org-dartlang:///main.dart'));
   final Block mainProcedureBody = new Block([
@@ -102,7 +102,7 @@
       new Name("method"),
       ProcedureKind.Method,
       new FunctionNode(mainProcedureBody, returnType: new DynamicType()));
-  main.addMember(mainProcedure);
+  main.addProcedure(mainProcedure);
   return new Component(libraries: [main, lib])
     ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
 }
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 0e5a207..56ccfcf 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -292,7 +292,7 @@
           new FunctionNode(new EmptyStatement(),
               positionalParameters: [new VariableDeclaration('p')]),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(
           StaticInvocation(method, new Arguments([new NullLiteral()])));
     },
@@ -303,7 +303,7 @@
       var method = new Procedure(new Name('bar'), ProcedureKind.Method,
           new FunctionNode(new EmptyStatement()),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(
           StaticInvocation(method, new Arguments([new NullLiteral()])));
       return method;
@@ -320,7 +320,7 @@
           new FunctionNode(new EmptyStatement(),
               positionalParameters: [new VariableDeclaration('p')]),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(StaticInvocation(method, new Arguments.empty()));
       return method;
     },
@@ -332,7 +332,7 @@
       var method = new Procedure(new Name('bar'), ProcedureKind.Method,
           new FunctionNode(new EmptyStatement()),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(StaticInvocation(
           method,
           new Arguments([],
@@ -351,7 +351,7 @@
           new FunctionNode(new EmptyStatement(),
               typeParameters: [test.makeTypeParameter()]),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(StaticInvocation(method, new Arguments.empty()));
       return method;
     },
@@ -363,7 +363,7 @@
     (TestHarness test) {
       var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
           name: new Name('foo'));
-      test.enclosingClass.addMember(constructor);
+      test.enclosingClass.addConstructor(constructor);
       test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
       return constructor;
     },
@@ -424,7 +424,7 @@
       var field = new Field(new Name('field'),
           type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
       test.enclosingLibrary.addTypedef(typedef_);
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
     },
   );
   negative1Test(
@@ -635,7 +635,7 @@
       var field =
           new Field(new Name('field'), type: typedefType, isStatic: true);
       test.enclosingLibrary.addTypedef(foo);
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
       return typedefType;
     },
     (Node typedefType) =>
@@ -648,7 +648,7 @@
       var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
       var field = new Field(new Name('field'),
           type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
       return foo;
     },
     (Node foo) => "Dangling reference to '$foo', parent is: 'null'",
@@ -657,7 +657,7 @@
     'Non-static top-level field',
     (TestHarness test) {
       var field = new Field(new Name('field'));
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
       return null;
     },
     (Node node) => "The top-level field 'field' should be static",
@@ -715,11 +715,27 @@
   }
 
   void addClassMember(Member node) {
-    enclosingClass.addMember(node);
+    if (node is Procedure) {
+      enclosingClass.addProcedure(node);
+    } else if (node is Field) {
+      enclosingClass.addField(node);
+    } else if (node is Constructor) {
+      enclosingClass.addConstructor(node);
+    } else if (node is RedirectingFactoryConstructor) {
+      enclosingClass.addRedirectingFactoryConstructor(node);
+    } else {
+      throw "Unexpected class member: ${node.runtimeType}";
+    }
   }
 
   void addTopLevelMember(Member node) {
-    enclosingLibrary.addMember(node);
+    if (node is Procedure) {
+      enclosingLibrary.addProcedure(node);
+    } else if (node is Field) {
+      enclosingLibrary.addField(node);
+    } else {
+      throw "Unexpected top level member: ${node.runtimeType}";
+    }
   }
 
   void addClass(Class node) {
@@ -762,7 +778,7 @@
     enclosingLibrary.addClass(enclosingClass);
     enclosingMember = new Procedure(new Name('test'), ProcedureKind.Method,
         new FunctionNode(new EmptyStatement()));
-    enclosingClass.addMember(enclosingMember);
+    enclosingClass.addProcedure(enclosingMember);
     otherClass = new Class(
         name: 'OtherClass',
         typeParameters: [makeTypeParameter('OtherT')],
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index b8a3e62..8986ebe 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -286,7 +286,7 @@
       ..fileOffset = node.fileOffset
       ..isNonNullableByDefault = node.enclosingLibrary.isNonNullableByDefault;
     _makeEntryPoint(ctor);
-    node.addMember(ctor);
+    node.addConstructor(ctor);
   }
 
   /// Computes the field offsets (for all ABIs) in the struct and replaces the
@@ -349,7 +349,7 @@
           .map((Abi abi, SizeAndOffsets v) => MapEntry(abi, v.offsets[i]));
       final methods = _generateMethodsForField(
           fields[i], types[i], fieldOffsets, indexedClass);
-      methods.forEach((p) => node.addMember(p));
+      methods.forEach((p) => node.addProcedure(p));
     }
 
     for (final Field f in fields.values) {
@@ -537,7 +537,7 @@
         reference: indexedClass?.lookupField(name.text)?.reference)
       ..fileOffset = struct.fileOffset;
     _makeEntryPoint(sizeOf);
-    struct.addMember(sizeOf);
+    struct.addField(sizeOf);
   }
 
   int _sizeInBytes(NativeType type, Abi abi) {
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index b0926a1..fb6635c 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -347,7 +347,7 @@
         fileUri: currentLibrary.fileUri,
         reference: currentLibraryIndex?.lookupField(name.text)?.reference)
       ..fileOffset = node.fileOffset;
-    currentLibrary.addMember(field);
+    currentLibrary.addField(field);
     return StaticGet(field);
   }
 
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 53f5219..de5576f 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -695,7 +695,7 @@
           isAbstract: true, fileUri: field.fileUri);
     }
     accessor.fileOffset = field.fileOffset;
-    field.enclosingClass.addMember(accessor);
+    field.enclosingClass.addProcedure(accessor);
     _removedFields[accessor] = field;
     shaker.addUsedMember(accessor);
     return accessor;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 321285e..e3f6c54 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -689,12 +689,12 @@
   };
 
   enum Flag {
-    kIsAbstract = 1 << 2,
-    kIsEnumClass = 1 << 3,
-    kIsAnonymousMixin = 1 << 4,
-    kIsEliminatedMixin = 1 << 5,
-    kFlagMixinDeclaration = 1 << 6,
-    kHasConstConstructor = 1 << 7,
+    kIsAbstract = 1 << 0,
+    kIsEnumClass = 1 << 1,
+    kIsAnonymousMixin = 1 << 2,
+    kIsEliminatedMixin = 1 << 3,
+    kFlagMixinDeclaration = 1 << 4,
+    kHasConstConstructor = 1 << 5,
   };
 
   explicit ClassHelper(KernelReaderHelper* helper)
@@ -770,11 +770,10 @@
   };
 
   enum Flag {
-    kExternal = 1 << 0,
-    kSynthetic = 1 << 1,
-    kIsNonNullableByDefault = 1 << 2,
-    kNonNullableByDefaultCompiledModeBit1Weak = 1 << 3,
-    kNonNullableByDefaultCompiledModeBit2Strong = 1 << 4,
+    kSynthetic = 1 << 0,
+    kIsNonNullableByDefault = 1 << 1,
+    kNonNullableByDefaultCompiledModeBit1 = 1 << 2,
+    kNonNullableByDefaultCompiledModeBit2 = 1 << 3,
   };
 
   explicit LibraryHelper(KernelReaderHelper* helper, uint32_t binary_version)
@@ -789,19 +788,18 @@
   void SetNext(Field field) { next_read_ = field; }
   void SetJustRead(Field field) { next_read_ = field + 1; }
 
-  bool IsExternal() const { return (flags_ & kExternal) != 0; }
   bool IsSynthetic() const { return (flags_ & kSynthetic) != 0; }
   bool IsNonNullableByDefault() const {
     return (flags_ & kIsNonNullableByDefault) != 0;
   }
   NNBDCompiledMode GetNonNullableByDefaultCompiledMode() const {
-    bool weak = (flags_ & kNonNullableByDefaultCompiledModeBit1Weak) != 0;
-    bool strong = (flags_ & kNonNullableByDefaultCompiledModeBit2Strong) != 0;
-    if (weak && strong) return NNBDCompiledMode::kAgnostic;
-    if (strong) return NNBDCompiledMode::kStrong;
-    if (weak) return NNBDCompiledMode::kWeak;
-    // Nothing set is implicitly weak.
-    return NNBDCompiledMode::kWeak;
+    bool bit1 = (flags_ & kNonNullableByDefaultCompiledModeBit1) != 0;
+    bool bit2 = (flags_ & kNonNullableByDefaultCompiledModeBit2) != 0;
+    if (!bit1 && !bit2) return NNBDCompiledMode::kWeak;
+    if (bit1 && !bit2) return NNBDCompiledMode::kStrong;
+    if (bit1 && bit2) return NNBDCompiledMode::kAgnostic;
+    // !bit1 && bit2 is unused.
+    UNREACHABLE();
   }
 
   uint8_t flags_ = 0;
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 49898fe..1625ce1 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 47;
-static const uint32_t kMaxSupportedKernelFormatVersion = 47;
+static const uint32_t kMinSupportedKernelFormatVersion = 49;
+static const uint32_t kMaxSupportedKernelFormatVersion = 49;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 44b07a4..5b5ea0d 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1040,8 +1040,6 @@
   Library& library =
       Library::Handle(Z, LookupLibrary(library_helper.canonical_name_));
 
-  // The Kernel library is external implies that it is already loaded.
-  ASSERT(!library_helper.IsExternal() || library.Loaded());
   if (library.Loaded()) return library.raw();
 
   library.set_is_nnbd(library_helper.IsNonNullableByDefault());
diff --git a/tools/VERSION b/tools/VERSION
index dd0d6b5..392009d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 266
+PRERELEASE 267
 PRERELEASE_PATCH 0
\ No newline at end of file