Version 2.15.0-85.0.dev

Merge commit 'f42cc14c3c5055f141cda84105c1f8bc35aa0041' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7233909..2c7f285 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -89,9 +89,9 @@
 
 #### Dart VM
 
-- **Breaking Change** [#45451][]: Support for `dart-ext:`-style native
-  extensions has been removed as previously announced. Use `dart:ffi` to bind
-  to native libraries instead.
+- **Breaking Change** [#45451](https://github.com/dart-lang/sdk/issues/45451) :
+  Support for `dart-ext:`-style native extensions has been removed as previously
+  announced. Use `dart:ffi` to bind to native libraries instead.
 
 ## 2.14.0
 
diff --git a/pkg/front_end/lib/src/fasta/builder/builder.dart b/pkg/front_end/lib/src/fasta/builder/builder.dart
index b0fa8e8..f933d9f 100644
--- a/pkg/front_end/lib/src/fasta/builder/builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builder.dart
@@ -36,6 +36,8 @@
 
   bool get isGetter;
 
+  bool get isExternal;
+
   /// Returns `true` if this builder is an extension declaration.
   ///
   /// For instance `B` in:
@@ -277,6 +279,9 @@
   bool get isStatic => false;
 
   @override
+  bool get isExternal => false;
+
+  @override
   bool get isSynthetic => false;
 
   @override
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 98e54de..3822c10 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -55,8 +55,8 @@
 
 import '../scope.dart';
 
+import '../source/name_scheme.dart';
 import '../source/source_class_builder.dart' show SourceClassBuilder;
-
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'builder.dart';
@@ -189,7 +189,7 @@
     ///   String toString() => _name;
     /// }
 
-    FieldNameScheme instanceFieldNameScheme = new FieldNameScheme(
+    NameScheme instanceFieldNameScheme = new NameScheme(
         isInstanceMember: true,
         className: name,
         isExtensionMember: false,
@@ -198,7 +198,7 @@
             ? referencesFromIndexed.library.reference
             : parent.library.reference);
 
-    FieldNameScheme staticFieldNameScheme = new FieldNameScheme(
+    NameScheme staticFieldNameScheme = new NameScheme(
         isInstanceMember: false,
         className: name,
         isExtensionMember: false,
@@ -207,8 +207,9 @@
             ? referencesFromIndexed.library.reference
             : parent.library.reference);
 
-    ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
-        isStatic: false,
+    NameScheme procedureNameScheme = new NameScheme(
+        isInstanceMember: true,
+        className: name,
         isExtensionMember: false,
         extensionName: null,
         libraryReference: referencesFromIndexed != null
@@ -254,7 +255,6 @@
         charOffset,
         charOffset,
         instanceFieldNameScheme,
-        isInstanceMember: true,
         fieldGetterReference: indexGetterReference,
         fieldSetterReference: indexSetterReference);
     members["index"] = indexBuilder;
@@ -268,7 +268,6 @@
         charOffset,
         charOffset,
         instanceFieldNameScheme,
-        isInstanceMember: true,
         fieldGetterReference: _nameGetterReference,
         fieldSetterReference: _nameSetterReference);
     members["_name"] = nameBuilder;
@@ -302,7 +301,6 @@
         charOffset,
         charOffset,
         staticFieldNameScheme,
-        isInstanceMember: false,
         fieldGetterReference: valuesGetterReference,
         fieldSetterReference: valuesSetterReference);
     members["values"] = valuesBuilder;
@@ -384,7 +382,6 @@
             enumConstantInfo.charOffset,
             enumConstantInfo.charOffset,
             staticFieldNameScheme,
-            isInstanceMember: false,
             fieldGetterReference: getterReference,
             fieldSetterReference: setterReference);
         members[name] = fieldBuilder..next = existing;
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index d0250bf..4ac03ac 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -15,6 +15,7 @@
 
 import 'builder.dart';
 import 'declaration_builder.dart';
+import 'field_builder.dart';
 import 'library_builder.dart';
 import 'member_builder.dart';
 import 'metadata_builder.dart';
@@ -181,9 +182,21 @@
       {bool setter: false, bool required: false}) {
     Builder? builder =
         lookupLocalMember(name.text, setter: setter, required: required);
+    if (builder == null && setter) {
+      // When looking up setters, we include assignable fields.
+      builder = lookupLocalMember(name.text, setter: false, required: required);
+      if (builder is! FieldBuilder || !builder.isAssignable) {
+        builder = null;
+      }
+    }
     if (builder != null) {
       if (name.isPrivate && library.library != name.library) {
         builder = null;
+      } else if (builder is FieldBuilder &&
+          !builder.isStatic &&
+          !builder.isExternal) {
+        // Non-external extension instance fields are invalid.
+        builder = null;
       } else if (builder.isDuplicate) {
         // Duplicates are not visible in the instance scope.
         builder = null;
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 14c0575..f375735 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -23,6 +23,7 @@
 
 import '../problems.dart' show unexpected, unhandled;
 
+import '../source/name_scheme.dart';
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import '../type_inference/type_inferrer.dart';
@@ -36,7 +37,6 @@
 import 'function_builder.dart';
 import 'member_builder.dart';
 import 'metadata_builder.dart';
-import 'procedure_builder.dart';
 import 'type_builder.dart';
 import 'type_variable_builder.dart';
 
@@ -67,10 +67,10 @@
       int charEndOffset,
       Reference? procedureReference,
       AsyncMarker asyncModifier,
-      ProcedureNameScheme procedureNameScheme,
+      NameScheme nameScheme,
       {String? nativeMethodName})
       : _procedureInternal = new Procedure(
-            procedureNameScheme.getName(ProcedureKind.Factory, name),
+            nameScheme.getProcedureName(ProcedureKind.Factory, name),
             ProcedureKind.Factory,
             new FunctionNode(null),
             fileUri: libraryBuilder.fileUri,
@@ -273,7 +273,7 @@
       int charOpenParenOffset,
       int charEndOffset,
       Reference? procedureReference,
-      ProcedureNameScheme procedureNameScheme,
+      NameScheme nameScheme,
       String? nativeMethodName,
       this.redirectionTarget)
       : super(
@@ -290,7 +290,7 @@
             charEndOffset,
             procedureReference,
             AsyncMarker.Sync,
-            procedureNameScheme,
+            nameScheme,
             nativeMethodName: nativeMethodName);
 
   @override
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 1915d6c..e3b28d2 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/type_algebra.dart';
 
 import '../constant_context.dart' show ConstantContext;
 
@@ -27,8 +28,9 @@
 
 import '../scope.dart' show Scope;
 
+import '../source/name_scheme.dart';
+import '../source/source_extension_builder.dart';
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
-
 import '../source/source_loader.dart' show SourceLoader;
 
 import '../type_inference/type_inference_engine.dart'
@@ -117,9 +119,8 @@
       SourceLibraryBuilder libraryBuilder,
       int charOffset,
       int charEndOffset,
-      FieldNameScheme fieldNameScheme,
-      {required bool isInstanceMember,
-      Reference? fieldGetterReference,
+      NameScheme fieldNameScheme,
+      {Reference? fieldGetterReference,
       Reference? fieldSetterReference,
       Reference? lateIsSetGetterReference,
       Reference? lateIsSetSetterReference,
@@ -128,8 +129,7 @@
       Token? constInitializerToken})
       : _constInitializerToken = constInitializerToken,
         super(libraryBuilder, charOffset) {
-    // ignore: unnecessary_null_comparison
-    assert(isInstanceMember != null);
+    bool isInstanceMember = fieldNameScheme.isInstanceMember;
 
     Uri fileUri = libraryBuilder.fileUri;
     // If in mixed mode, late lowerings cannot use `null` as a sentinel on
@@ -143,6 +143,7 @@
       assert(lateGetterReference == null);
       assert(lateSetterReference == null);
       _fieldEncoding = new AbstractOrExternalFieldEncoding(
+          this,
           name,
           fieldNameScheme,
           fileUri,
@@ -393,7 +394,7 @@
       // notInstanceContext is set to true for extension fields as they
       // ultimately become static.
       fieldType = type!.build(libraryBuilder,
-          nonInstanceContext: isStatic || isExtensionMember);
+          nonInstanceContext: isStatic || (isExtensionMember && !isExternal));
     }
     _fieldEncoding.build(libraryBuilder, this);
   }
@@ -520,86 +521,6 @@
   @override
   List<ClassMember> get localSetters =>
       _localSetters ??= _fieldEncoding.getLocalSetters(this);
-
-  static String createFieldName(FieldNameType type, String name,
-      {required bool isInstanceMember,
-      required String? className,
-      bool isExtensionMethod: false,
-      String? extensionName,
-      bool isSynthesized: false}) {
-    assert(isSynthesized || type == FieldNameType.Field,
-        "Unexpected field name type for non-synthesized field: $type");
-    // ignore: unnecessary_null_comparison
-    assert(isExtensionMethod || isInstanceMember != null,
-        "`isInstanceMember` is null for class member.");
-    assert(!(isExtensionMethod && extensionName == null),
-        "No extension name provided for extension member.");
-    // ignore: unnecessary_null_comparison
-    assert(isInstanceMember == null || !(isInstanceMember && className == null),
-        "No class name provided for instance member.");
-    String baseName;
-    if (!isExtensionMethod) {
-      baseName = name;
-    } else {
-      baseName = "${extensionName}|${name}";
-    }
-
-    if (!isSynthesized) {
-      return baseName;
-    } else {
-      String namePrefix = late_lowering.lateFieldPrefix;
-      if (isInstanceMember) {
-        namePrefix = '$namePrefix${className}#';
-      }
-      switch (type) {
-        case FieldNameType.Field:
-          return "$namePrefix$baseName";
-        case FieldNameType.Getter:
-          return baseName;
-        case FieldNameType.Setter:
-          return baseName;
-        case FieldNameType.IsSetField:
-          return "$namePrefix$baseName${late_lowering.lateIsSetSuffix}";
-      }
-    }
-  }
-}
-
-enum FieldNameType { Field, Getter, Setter, IsSetField }
-
-class FieldNameScheme {
-  final bool isInstanceMember;
-  final String? className;
-  final bool isExtensionMember;
-  final String? extensionName;
-  final Reference? libraryReference;
-
-  FieldNameScheme(
-      {required this.isInstanceMember,
-      required this.className,
-      required this.isExtensionMember,
-      required this.extensionName,
-      required this.libraryReference})
-      // ignore: unnecessary_null_comparison
-      : assert(isInstanceMember != null),
-        // ignore: unnecessary_null_comparison
-        assert(isExtensionMember != null),
-        // ignore: unnecessary_null_comparison
-        assert(!isExtensionMember || extensionName != null),
-        // ignore: unnecessary_null_comparison
-        assert(libraryReference != null);
-
-  Name getName(FieldNameType type, String name, {required bool isSynthesized}) {
-    // ignore: unnecessary_null_comparison
-    assert(isSynthesized != null);
-    String text = SourceFieldBuilder.createFieldName(type, name,
-        isInstanceMember: isInstanceMember,
-        className: className,
-        isExtensionMethod: isExtensionMember,
-        extensionName: extensionName,
-        isSynthesized: isSynthesized);
-    return new Name.byReference(text, libraryReference);
-  }
 }
 
 /// Strategy pattern for creating different encodings of a declared field.
@@ -671,8 +592,8 @@
 class RegularFieldEncoding implements FieldEncoding {
   late final Field _field;
 
-  RegularFieldEncoding(String name, FieldNameScheme fieldNameScheme,
-      Uri fileUri, int charOffset, int charEndOffset,
+  RegularFieldEncoding(String name, NameScheme nameScheme, Uri fileUri,
+      int charOffset, int charEndOffset,
       {required bool isFinal,
       required bool isConst,
       required bool isLate,
@@ -692,7 +613,7 @@
         isLate ? (isFinal && hasInitializer) : (isFinal || isConst);
     _field = isImmutable
         ? new Field.immutable(
-            fieldNameScheme.getName(FieldNameType.Field, name,
+            nameScheme.getFieldName(FieldNameType.Field, name,
                 isSynthesized: false),
             isFinal: isFinal,
             isConst: isConst,
@@ -700,7 +621,7 @@
             fileUri: fileUri,
             getterReference: getterReference)
         : new Field.mutable(
-            fieldNameScheme.getName(FieldNameType.Field, name,
+            nameScheme.getFieldName(FieldNameType.Field, name,
                 isSynthesized: false),
             isFinal: isFinal,
             isLate: isLate,
@@ -883,7 +804,7 @@
 
   AbstractLateFieldEncoding(
       this.name,
-      FieldNameScheme fieldNameScheme,
+      NameScheme nameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -901,7 +822,7 @@
         _forceIncludeIsSetField =
             isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
     _field = new Field.mutable(
-        fieldNameScheme.getName(FieldNameType.Field, name, isSynthesized: true),
+        nameScheme.getFieldName(FieldNameType.Field, name, isSynthesized: true),
         fileUri: fileUri,
         getterReference: fieldGetterReference,
         setterReference: fieldSetterReference)
@@ -917,7 +838,7 @@
       case late_lowering.IsSetStrategy.forceUseIsSetField:
       case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
         _lateIsSetField = new Field.mutable(
-            fieldNameScheme.getName(FieldNameType.IsSetField, name,
+            nameScheme.getFieldName(FieldNameType.IsSetField, name,
                 isSynthesized: true),
             fileUri: fileUri,
             getterReference: lateIsSetGetterReference,
@@ -929,7 +850,7 @@
         break;
     }
     _lateGetter = new Procedure(
-        fieldNameScheme.getName(FieldNameType.Getter, name,
+        nameScheme.getFieldName(FieldNameType.Getter, name,
             isSynthesized: true),
         ProcedureKind.Getter,
         new FunctionNode(null)
@@ -941,7 +862,7 @@
       ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = true;
     _lateSetter = _createSetter(
-        fieldNameScheme.getName(FieldNameType.Setter, name,
+        nameScheme.getFieldName(FieldNameType.Setter, name,
             isSynthesized: true),
         fileUri,
         charOffset,
@@ -1267,7 +1188,7 @@
     with NonFinalLate, LateWithoutInitializer {
   LateFieldWithoutInitializerEncoding(
       String name,
-      FieldNameScheme fieldNameScheme,
+      NameScheme nameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1281,7 +1202,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
-            fieldNameScheme,
+            nameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1299,7 +1220,7 @@
     with NonFinalLate {
   LateFieldWithInitializerEncoding(
       String name,
-      FieldNameScheme fieldNameScheme,
+      NameScheme nameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1313,7 +1234,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
-            fieldNameScheme,
+            nameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1346,7 +1267,7 @@
     with LateWithoutInitializer {
   LateFinalFieldWithoutInitializerEncoding(
       String name,
-      FieldNameScheme fieldNameScheme,
+      NameScheme nameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1360,7 +1281,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
-            fieldNameScheme,
+            nameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1394,7 +1315,7 @@
 class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
   LateFinalFieldWithInitializerEncoding(
       String name,
-      FieldNameScheme fieldNameScheme,
+      NameScheme nameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1408,7 +1329,7 @@
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
             name,
-            fieldNameScheme,
+            nameScheme,
             fileUri,
             charOffset,
             charEndOffset,
@@ -1595,15 +1516,19 @@
 }
 
 class AbstractOrExternalFieldEncoding implements FieldEncoding {
+  final SourceFieldBuilder _fieldBuilder;
   final bool isAbstract;
   final bool isExternal;
+  final bool _isExtensionInstanceMember;
 
   late Procedure _getter;
   Procedure? _setter;
+  DartType? _type;
 
   AbstractOrExternalFieldEncoding(
+      this._fieldBuilder,
       String name,
-      FieldNameScheme fieldNameScheme,
+      NameScheme nameScheme,
       Uri fileUri,
       int charOffset,
       int charEndOffset,
@@ -1623,45 +1548,138 @@
         // ignore: unnecessary_null_comparison
         assert(isCovariant != null),
         // ignore: unnecessary_null_comparison
-        assert(isNonNullableByDefault != null) {
-    _getter = new Procedure(
-        fieldNameScheme.getName(FieldNameType.Getter, name,
-            isSynthesized: true),
-        ProcedureKind.Getter,
-        new FunctionNode(null),
-        fileUri: fileUri,
-        reference: getterReference)
-      ..fileOffset = charOffset
-      ..fileEndOffset = charEndOffset
-      ..isNonNullableByDefault = isNonNullableByDefault;
-    if (!isFinal) {
-      VariableDeclaration parameter =
-          new VariableDeclaration("#externalFieldValue")
-            ..isCovariant = isCovariant
-            ..fileOffset = charOffset;
-      _setter = new Procedure(
-          fieldNameScheme.getName(FieldNameType.Setter, name,
-              isSynthesized: true),
-          ProcedureKind.Setter,
-          new FunctionNode(null,
-              positionalParameters: [parameter], returnType: const VoidType())
-            ..fileOffset = charOffset
-            ..fileEndOffset = charEndOffset,
+        assert(isNonNullableByDefault != null),
+        _isExtensionInstanceMember = isExternal &&
+            nameScheme.isExtensionMember &&
+            nameScheme.isInstanceMember {
+    if (_isExtensionInstanceMember) {
+      _getter = new Procedure(
+          nameScheme.getProcedureName(ProcedureKind.Getter, name),
+          ProcedureKind.Method,
+          new FunctionNode(null, positionalParameters: [
+            new VariableDeclaration(extensionThisName)..fileOffset
+          ]),
           fileUri: fileUri,
-          reference: setterReference)
+          reference: getterReference)
         ..fileOffset = charOffset
         ..fileEndOffset = charEndOffset
         ..isNonNullableByDefault = isNonNullableByDefault;
+      if (!isFinal) {
+        VariableDeclaration parameter =
+            new VariableDeclaration("#externalFieldValue")
+              ..isCovariant = isCovariant
+              ..fileOffset = charOffset;
+        _setter = new Procedure(
+            nameScheme.getProcedureName(ProcedureKind.Setter, name),
+            ProcedureKind.Method,
+            new FunctionNode(null,
+                positionalParameters: [
+                  new VariableDeclaration(extensionThisName)..fileOffset,
+                  parameter
+                ],
+                returnType: const VoidType())
+              ..fileOffset = charOffset
+              ..fileEndOffset = charEndOffset,
+            fileUri: fileUri,
+            reference: setterReference)
+          ..fileOffset = charOffset
+          ..fileEndOffset = charEndOffset
+          ..isNonNullableByDefault = isNonNullableByDefault;
+      }
+    } else {
+      _getter = new Procedure(
+          nameScheme.getFieldName(FieldNameType.Getter, name,
+              isSynthesized: true),
+          ProcedureKind.Getter,
+          new FunctionNode(null),
+          fileUri: fileUri,
+          reference: getterReference)
+        ..fileOffset = charOffset
+        ..fileEndOffset = charEndOffset
+        ..isNonNullableByDefault = isNonNullableByDefault;
+      if (!isFinal) {
+        VariableDeclaration parameter =
+            new VariableDeclaration("#externalFieldValue")
+              ..isCovariant = isCovariant
+              ..fileOffset = charOffset;
+        _setter = new Procedure(
+            nameScheme.getFieldName(FieldNameType.Setter, name,
+                isSynthesized: true),
+            ProcedureKind.Setter,
+            new FunctionNode(null,
+                positionalParameters: [parameter], returnType: const VoidType())
+              ..fileOffset = charOffset
+              ..fileEndOffset = charEndOffset,
+            fileUri: fileUri,
+            reference: setterReference)
+          ..fileOffset = charOffset
+          ..fileEndOffset = charEndOffset
+          ..isNonNullableByDefault = isNonNullableByDefault;
+      }
     }
   }
 
   @override
-  DartType get type => _getter.function.returnType;
+  DartType get type {
+    assert(_type != null,
+        "Type has not been computed for field ${_fieldBuilder.name}.");
+    return _type!;
+  }
 
   @override
   void set type(DartType value) {
-    _getter.function.returnType = value;
-    _setter?.function.positionalParameters.first.type = value;
+    assert(_type == null || _type is ImplicitFieldType,
+        "Type has already been computed for field ${_fieldBuilder.name}.");
+    _type = value;
+    if (value is! ImplicitFieldType) {
+      if (_isExtensionInstanceMember) {
+        SourceExtensionBuilder extensionBuilder =
+            _fieldBuilder.parent as SourceExtensionBuilder;
+        DartType onType = extensionBuilder.extension.onType;
+        List<TypeParameter> typeParameters =
+            extensionBuilder.extension.typeParameters;
+        if (typeParameters.isNotEmpty) {
+          FreshTypeParameters getterTypeParameters =
+              getFreshTypeParameters(typeParameters);
+          _getter.function.positionalParameters.first.type =
+              getterTypeParameters.substitute(onType);
+          _getter.function.returnType = getterTypeParameters.substitute(value);
+          _getter.function.typeParameters =
+              getterTypeParameters.freshTypeParameters;
+          setParents(
+              getterTypeParameters.freshTypeParameters, _getter.function);
+
+          Procedure? setter = _setter;
+          if (setter != null) {
+            FreshTypeParameters setterTypeParameters =
+                getFreshTypeParameters(typeParameters);
+            setter.function.positionalParameters.first.type =
+                setterTypeParameters.substitute(onType);
+            setter.function.positionalParameters[1].type =
+                setterTypeParameters.substitute(value);
+            setter.function.typeParameters =
+                setterTypeParameters.freshTypeParameters;
+            setParents(
+                setterTypeParameters.freshTypeParameters, setter.function);
+          }
+        } else {
+          _getter.function.returnType = value;
+          _setter?.function.positionalParameters[1].type = value;
+          _getter.function.positionalParameters.first.type = onType;
+          _setter?.function.positionalParameters.first.type = onType;
+        }
+      } else {
+        _getter.function.returnType = value;
+        Procedure? setter = _setter;
+        if (setter != null) {
+          if (setter.kind == ProcedureKind.Method) {
+            setter.function.positionalParameters[1].type = value;
+          } else {
+            setter.function.positionalParameters.first.type = value;
+          }
+        }
+      }
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index bae23b9..f164ecc 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -68,6 +68,7 @@
   // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
   ProcedureKind? get kind;
 
+  @override
   bool get isExternal;
 
   bool get isAbstract;
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index bccd75e..8c5b997 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -276,7 +276,7 @@
   // TODO(johnniwinther): Store [origin] on the built type.
   DartType buildInternal(LibraryBuilder library,
       {TypedefType? origin,
-      bool? nonInstanceContext,
+      required bool? nonInstanceContext,
       required bool forTypeLiteral}) {
     assert(declaration != null, "Declaration has not been resolved on $this.");
     // TODO(johnniwinther): Change `nonInstanceContext == true` to
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 741445c..48b6cd4 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -10,6 +10,7 @@
 
 import '../loader.dart' show Loader;
 
+import '../source/name_scheme.dart';
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'builder.dart';
@@ -94,7 +95,7 @@
       Reference? procedureReference,
       this._tearOffReference,
       AsyncMarker asyncModifier,
-      ProcedureNameScheme procedureNameScheme,
+      NameScheme nameScheme,
       {required bool isExtensionMember,
       required bool isInstanceMember,
       String? nativeMethodName})
@@ -107,7 +108,7 @@
         super(metadata, modifiers, returnType, name, typeVariables, formals,
             libraryBuilder, charOffset, nativeMethodName) {
     _procedure = new Procedure(
-        procedureNameScheme.getName(kind, name),
+        nameScheme.getProcedureName(kind, name),
         isExtensionInstanceMember ? ProcedureKind.Method : kind,
         new FunctionNode(null),
         fileUri: libraryBuilder.fileUri,
@@ -119,7 +120,7 @@
     this.asyncModifier = asyncModifier;
     if (isExtensionMember && isInstanceMember && kind == ProcedureKind.Method) {
       _extensionTearOff ??= new Procedure(
-          procedureNameScheme.getName(ProcedureKind.Getter, name),
+          nameScheme.getProcedureName(ProcedureKind.Getter, name),
           ProcedureKind.Method,
           new FunctionNode(null),
           isStatic: true,
@@ -310,35 +311,6 @@
     return _procedure;
   }
 
-  static String createProcedureName(bool isExtensionMethod, bool isStatic,
-      ProcedureKind kind, String? extensionName, String name) {
-    if (isExtensionMethod) {
-      String kindInfix = '';
-      if (!isStatic) {
-        // Instance getter and setter are converted to methods so we use an
-        // infix to make their names unique.
-        switch (kind) {
-          case ProcedureKind.Getter:
-            kindInfix = 'get#';
-            break;
-          case ProcedureKind.Setter:
-            kindInfix = 'set#';
-            break;
-          case ProcedureKind.Method:
-          case ProcedureKind.Operator:
-            kindInfix = '';
-            break;
-          case ProcedureKind.Factory:
-            throw new UnsupportedError(
-                'Unexpected extension method kind ${kind}');
-        }
-      }
-      return '${extensionName}|${kindInfix}${name}';
-    } else {
-      return name;
-    }
-  }
-
   /// Creates a top level function that creates a tear off of an extension
   /// instance method.
   ///
@@ -591,33 +563,3 @@
         memberBuilder == other.memberBuilder;
   }
 }
-
-class ProcedureNameScheme {
-  final bool isExtensionMember;
-  final bool isStatic;
-  final String? extensionName;
-  final Reference libraryReference;
-
-  ProcedureNameScheme(
-      {required this.isExtensionMember,
-      required this.isStatic,
-      this.extensionName,
-      required this.libraryReference})
-      // ignore: unnecessary_null_comparison
-      : assert(isExtensionMember != null),
-        // ignore: unnecessary_null_comparison
-        assert(isStatic != null),
-        // ignore: unnecessary_null_comparison
-        assert(!isExtensionMember || extensionName != null),
-        // ignore: unnecessary_null_comparison
-        assert(libraryReference != null);
-
-  Name getName(ProcedureKind kind, String name) {
-    // ignore: unnecessary_null_comparison
-    assert(kind != null);
-    return new Name.byReference(
-        SourceProcedureBuilder.createProcedureName(
-            isExtensionMember, isStatic, kind, extensionName, name),
-        libraryReference);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 0db0a7a..2a2955a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6845,7 +6845,8 @@
           builder.declaration as TypeVariableBuilder;
       TypeParameter typeParameter = typeParameterBuilder.parameter;
       LocatedMessage message;
-      bool extensionField = member.isExtensionMember && member.isField;
+      bool extensionField =
+          member.isExtensionMember && member.isField && !member.isExternal;
       if ((extensionField || !isDeclarationInstanceContext) &&
           (typeParameter.parent is Class ||
               typeParameter.parent is Extension)) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index dd26634..49d92a1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1942,6 +1942,10 @@
         assert(!getterBuilder.isStatic);
         MemberBuilder memberBuilder = getterBuilder as MemberBuilder;
         invokeTarget = memberBuilder.invokeTarget as Procedure?;
+      } else if (getterBuilder.isField) {
+        assert(!getterBuilder.isStatic);
+        MemberBuilder memberBuilder = getterBuilder as MemberBuilder;
+        readTarget = memberBuilder.invokeTarget as Procedure?;
       } else {
         return unhandled(
             "$getterBuilder (${getterBuilder.runtimeType})",
@@ -1959,6 +1963,10 @@
         assert(!setterBuilder.isStatic);
         MemberBuilder memberBuilder = setterBuilder as MemberBuilder;
         writeTarget = memberBuilder.writeTarget as Procedure?;
+      } else if (setterBuilder.isField) {
+        assert(!setterBuilder.isStatic);
+        MemberBuilder memberBuilder = setterBuilder as MemberBuilder;
+        writeTarget = memberBuilder.writeTarget as Procedure?;
       } else {
         return unhandled(
             "$setterBuilder (${setterBuilder.runtimeType})",
@@ -2598,7 +2606,7 @@
   Generator _createInstanceAccess(Token token, Name name,
       {bool isNullAware: false}) {
     Builder? getter = extensionBuilder.lookupLocalMemberByName(name);
-    if (getter != null && (getter.isStatic || getter.isField)) {
+    if (getter != null && getter.isStatic) {
       getter = null;
     }
     Builder? setter =
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 64ce17a..f38b46b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -67,6 +67,7 @@
         templateSuperclassHasNoDefaultConstructor;
 import '../problems.dart' show unhandled;
 import '../scope.dart' show AmbiguousBuilder;
+import '../source/name_scheme.dart';
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 import '../source/source_library_builder.dart'
     show LanguageVersion, SourceLibraryBuilder;
@@ -1185,7 +1186,7 @@
     assert(() {
       Set<String> patchFieldNames = {};
       builder.forEachDeclaredField((String name, FieldBuilder fieldBuilder) {
-        patchFieldNames.add(SourceFieldBuilder.createFieldName(
+        patchFieldNames.add(NameScheme.createFieldName(
           FieldNameType.Field,
           name,
           isInstanceMember: fieldBuilder.isClassInstanceMember,
diff --git a/pkg/front_end/lib/src/fasta/source/name_scheme.dart b/pkg/front_end/lib/src/fasta/source/name_scheme.dart
new file mode 100644
index 0000000..65bcfe7
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/source/name_scheme.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart';
+
+import '../kernel/late_lowering.dart' as late_lowering;
+
+enum FieldNameType { Field, Getter, Setter, IsSetField }
+
+class NameScheme {
+  final bool isInstanceMember;
+  final String? className;
+  final bool isExtensionMember;
+  final String? extensionName;
+  final Reference? libraryReference;
+
+  NameScheme(
+      {required this.isInstanceMember,
+      required this.className,
+      required this.isExtensionMember,
+      required this.extensionName,
+      required this.libraryReference})
+      // ignore: unnecessary_null_comparison
+      : assert(isInstanceMember != null),
+        // ignore: unnecessary_null_comparison
+        assert(isExtensionMember != null),
+        // ignore: unnecessary_null_comparison
+        assert(!isExtensionMember || extensionName != null),
+        // ignore: unnecessary_null_comparison
+        assert(libraryReference != null);
+
+  bool get isStatic => !isInstanceMember;
+
+  Name getFieldName(FieldNameType type, String name,
+      {required bool isSynthesized}) {
+    // ignore: unnecessary_null_comparison
+    assert(isSynthesized != null);
+    String text = createFieldName(type, name,
+        isInstanceMember: isInstanceMember,
+        className: className,
+        isExtensionMethod: isExtensionMember,
+        extensionName: extensionName,
+        isSynthesized: isSynthesized);
+    return new Name.byReference(text, libraryReference);
+  }
+
+  static String createFieldName(FieldNameType type, String name,
+      {required bool isInstanceMember,
+      required String? className,
+      bool isExtensionMethod: false,
+      String? extensionName,
+      bool isSynthesized: false}) {
+    assert(isSynthesized || type == FieldNameType.Field,
+        "Unexpected field name type for non-synthesized field: $type");
+    // ignore: unnecessary_null_comparison
+    assert(isExtensionMethod || isInstanceMember != null,
+        "`isInstanceMember` is null for class member.");
+    assert(!(isExtensionMethod && extensionName == null),
+        "No extension name provided for extension member.");
+    // ignore: unnecessary_null_comparison
+    assert(isInstanceMember == null || !(isInstanceMember && className == null),
+        "No class name provided for instance member.");
+    String baseName;
+    if (!isExtensionMethod) {
+      baseName = name;
+    } else {
+      baseName = "${extensionName}|${name}";
+    }
+
+    if (!isSynthesized) {
+      return baseName;
+    } else {
+      String namePrefix = late_lowering.lateFieldPrefix;
+      if (isInstanceMember) {
+        namePrefix = '$namePrefix${className}#';
+      }
+      switch (type) {
+        case FieldNameType.Field:
+          return "$namePrefix$baseName";
+        case FieldNameType.Getter:
+          return baseName;
+        case FieldNameType.Setter:
+          return baseName;
+        case FieldNameType.IsSetField:
+          return "$namePrefix$baseName${late_lowering.lateIsSetSuffix}";
+      }
+    }
+  }
+
+  Name getProcedureName(ProcedureKind kind, String name) {
+    // ignore: unnecessary_null_comparison
+    assert(kind != null);
+    return new Name.byReference(
+        createProcedureName(
+            isExtensionMethod: isExtensionMember,
+            isStatic: isStatic,
+            kind: kind,
+            extensionName: extensionName,
+            name: name),
+        libraryReference);
+  }
+
+  static String createProcedureName(
+      {required bool isExtensionMethod,
+      required bool isStatic,
+      required ProcedureKind kind,
+      String? extensionName,
+      required String name}) {
+    if (isExtensionMethod) {
+      assert(extensionName != null);
+      String kindInfix = '';
+      if (!isStatic) {
+        // Instance getter and setter are converted to methods so we use an
+        // infix to make their names unique.
+        switch (kind) {
+          case ProcedureKind.Getter:
+            kindInfix = 'get#';
+            break;
+          case ProcedureKind.Setter:
+            kindInfix = 'set#';
+            break;
+          case ProcedureKind.Method:
+          case ProcedureKind.Operator:
+            kindInfix = '';
+            break;
+          case ProcedureKind.Factory:
+            throw new UnsupportedError(
+                'Unexpected extension method kind ${kind}');
+        }
+      }
+      return '${extensionName}|${kindInfix}${name}';
+    } else {
+      return name;
+    }
+  }
+}
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 d528324..180e20c 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
@@ -93,6 +93,8 @@
   Extension build(
       SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary,
       {required bool addMembersToLibrary}) {
+    _extension.onType = onType.build(libraryBuilder);
+
     SourceLibraryBuilder.checkMemberConflicts(library, scope,
         checkForInstanceVsStaticConflict: true,
         checkForMethodVsSetterConflict: true);
@@ -191,8 +193,6 @@
 
     scope.forEach(buildBuilders);
 
-    _extension.onType = onType.build(libraryBuilder);
-
     return _extension;
   }
 
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 3cf100e..76d8d26 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
@@ -122,12 +122,10 @@
 
 import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
 
+import 'name_scheme.dart';
 import 'source_class_builder.dart' show SourceClassBuilder;
-
 import 'source_extension_builder.dart' show SourceExtensionBuilder;
-
 import 'source_loader.dart' show SourceLoader;
-
 import 'source_type_alias_builder.dart';
 
 class SourceLibraryBuilder extends LibraryBuilderImpl {
@@ -2227,7 +2225,7 @@
     Reference? lateGetterReference;
     Reference? lateSetterReference;
 
-    FieldNameScheme fieldNameScheme = new FieldNameScheme(
+    NameScheme nameScheme = new NameScheme(
         isInstanceMember: isInstanceMember,
         className: className,
         isExtensionMember: isExtensionMember,
@@ -2236,14 +2234,14 @@
     if (referencesFrom != null) {
       IndexedContainer indexedContainer =
           (_currentClassReferencesFromIndexed ?? referencesFromIndexed)!;
-      Name nameToLookupName = fieldNameScheme.getName(FieldNameType.Field, name,
+      Name nameToLookupName = nameScheme.getFieldName(FieldNameType.Field, name,
           isSynthesized: fieldIsLateWithLowering);
       fieldGetterReference =
           indexedContainer.lookupGetterReference(nameToLookupName);
       fieldSetterReference =
           indexedContainer.lookupSetterReference(nameToLookupName);
       if (fieldIsLateWithLowering) {
-        Name lateIsSetNameName = fieldNameScheme.getName(
+        Name lateIsSetNameName = nameScheme.getFieldName(
             FieldNameType.IsSetField, name,
             isSynthesized: fieldIsLateWithLowering);
         lateIsSetGetterReference =
@@ -2251,10 +2249,10 @@
         lateIsSetSetterReference =
             indexedContainer.lookupSetterReference(lateIsSetNameName);
         lateGetterReference = indexedContainer.lookupGetterReference(
-            fieldNameScheme.getName(FieldNameType.Getter, name,
+            nameScheme.getFieldName(FieldNameType.Getter, name,
                 isSynthesized: fieldIsLateWithLowering));
         lateSetterReference = indexedContainer.lookupSetterReference(
-            fieldNameScheme.getName(FieldNameType.Setter, name,
+            nameScheme.getFieldName(FieldNameType.Setter, name,
                 isSynthesized: fieldIsLateWithLowering));
       }
     }
@@ -2268,8 +2266,7 @@
         this,
         charOffset,
         charEndOffset,
-        fieldNameScheme,
-        isInstanceMember: isInstanceMember,
+        nameScheme,
         fieldGetterReference: fieldGetterReference,
         fieldSetterReference: fieldSetterReference,
         lateIsSetGetterReference: lateIsSetGetterReference,
@@ -2371,12 +2368,16 @@
     assert(!isExtensionMember ||
         currentTypeParameterScopeBuilder.kind ==
             TypeParameterScopeKind.extensionDeclaration);
+    String? className = (isInstanceMember && !isExtensionMember)
+        ? currentTypeParameterScopeBuilder.name
+        : null;
     String? extensionName =
         isExtensionMember ? currentTypeParameterScopeBuilder.name : null;
-    ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+    NameScheme nameScheme = new NameScheme(
         isExtensionMember: isExtensionMember,
+        className: className,
         extensionName: extensionName,
-        isStatic: !isInstanceMember,
+        isInstanceMember: isInstanceMember,
         libraryReference: referencesFrom?.reference ?? library.reference);
 
     if (returnType == null) {
@@ -2390,7 +2391,7 @@
     Reference? procedureReference;
     Reference? tearOffReference;
     if (referencesFrom != null) {
-      Name nameToLookup = procedureNameScheme.getName(kind, name);
+      Name nameToLookup = nameScheme.getProcedureName(kind, name);
       if (_currentClassReferencesFromIndexed != null) {
         if (kind == ProcedureKind.Setter) {
           procedureReference = _currentClassReferencesFromIndexed!
@@ -2411,7 +2412,7 @@
         }
         if (isExtensionMember && kind == ProcedureKind.Method) {
           tearOffReference = referencesFromIndexed!.lookupGetterReference(
-              procedureNameScheme.getName(ProcedureKind.Getter, name));
+              nameScheme.getProcedureName(ProcedureKind.Getter, name));
         }
       }
     }
@@ -2431,7 +2432,7 @@
         procedureReference,
         tearOffReference,
         asyncModifier,
-        procedureNameScheme,
+        nameScheme,
         isExtensionMember: isExtensionMember,
         isInstanceMember: isInstanceMember,
         nativeMethodName: nativeMethodName);
@@ -2474,10 +2475,11 @@
       procedureName = name as String;
     }
 
-    ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+    NameScheme procedureNameScheme = new NameScheme(
         isExtensionMember: false,
+        className: null,
         extensionName: null,
-        isStatic: true,
+        isInstanceMember: false,
         libraryReference: referencesFrom != null
             ? (_currentClassReferencesFromIndexed ?? referencesFromIndexed)!
                 .library
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 308ab12..110567c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -106,8 +106,6 @@
 
 import '../problems.dart' show internalProblem;
 
-import '../source/stack_listener_impl.dart' show offsetForToken;
-
 import '../type_inference/type_inference_engine.dart';
 import '../type_inference/type_inferrer.dart';
 
@@ -115,10 +113,12 @@
 
 import 'diet_listener.dart' show DietListener;
 import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
+import 'name_scheme.dart';
 import 'outline_builder.dart' show OutlineBuilder;
 import 'source_class_builder.dart' show SourceClassBuilder;
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 import 'source_type_alias_builder.dart';
+import 'stack_listener_impl.dart' show offsetForToken;
 
 class SourceLoader extends Loader {
   /// The [FileSystem] which should be used to access files.
@@ -551,9 +551,11 @@
         null,
         null,
         AsyncMarker.Sync,
-        new ProcedureNameScheme(
+        new NameScheme(
+            className: null,
+            extensionName: null,
             isExtensionMember: false,
-            isStatic: true,
+            isInstanceMember: false,
             libraryReference: libraryBuilder.library.reference),
         isInstanceMember: false,
         isExtensionMember: false)
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 4a559f2..d76c881 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1039,22 +1039,31 @@
 
         if (typeSchemaEnvironment.isSubtypeOf(
             receiverType, onType, SubtypeCheckMode.withNullabilities)) {
+          ObjectAccessTarget target = const ObjectAccessTarget.missing();
+          if (thisBuilder != null && !thisBuilder.isStatic) {
+            if (thisBuilder.isField) {
+              if (thisBuilder.isExternal) {
+                target = new ObjectAccessTarget.extensionMember(
+                    setter ? thisBuilder.writeTarget! : thisBuilder.readTarget!,
+                    thisBuilder.readTarget,
+                    setter ? ProcedureKind.Setter : ProcedureKind.Getter,
+                    inferredTypeArguments,
+                    isPotentiallyNullable: isPotentiallyNullableAccess);
+              }
+            } else {
+              target = new ObjectAccessTarget.extensionMember(
+                  setter ? thisBuilder.writeTarget! : thisBuilder.invokeTarget!,
+                  thisBuilder.readTarget,
+                  thisBuilder.kind!,
+                  inferredTypeArguments,
+                  isPotentiallyNullable: isPotentiallyNullableAccess);
+            }
+          }
           ExtensionAccessCandidate candidate = new ExtensionAccessCandidate(
               (thisBuilder ?? otherBuilder)!,
               onType,
               onTypeInstantiateToBounds,
-              thisBuilder != null &&
-                      !thisBuilder.isField &&
-                      !thisBuilder.isStatic
-                  ? new ObjectAccessTarget.extensionMember(
-                      setter
-                          ? thisBuilder.writeTarget!
-                          : thisBuilder.invokeTarget!,
-                      thisBuilder.readTarget,
-                      thisBuilder.kind!,
-                      inferredTypeArguments,
-                      isPotentiallyNullable: isPotentiallyNullableAccess)
-                  : const ObjectAccessTarget.missing(),
+              target,
               isPlatform: extensionBuilder.library.importUri.scheme == 'dart');
           if (noneMoreSpecific.isNotEmpty) {
             bool isMostSpecific = true;
diff --git a/pkg/front_end/testcases/extensions/external.dart b/pkg/front_end/testcases/extensions/external.dart
new file mode 100644
index 0000000..29f5ed2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension Extension<T extends num> on List<T> {
+  external T field;
+  external static int staticField;
+  external final T finalField;
+  external static final int staticFinalField;
+  external T method();
+  external static int staticMethod();
+  external T get getter;
+  external static int get staticGetter;
+  external void set setter(T value);
+  external static void set staticSetter(int value);
+  external T get property;
+  external void set property(T value);
+  external static int get staticProperty;
+  external static void set staticProperty(int value);
+  external final T fieldSetter;
+  external void set fieldSetter(T value);
+  external static final int staticFieldSetter;
+  external static void set staticFieldSetter(int value);
+}
+
+test() {
+  List<int> list = [];
+  int value = list.field;
+  list.field = value;
+  value = list.finalField;
+  value = list.method();
+  value = list.getter;
+  list.setter = value;
+  value = list.property;
+  list.property = value;
+  value = list.fieldSetter;
+  list.fieldSetter = value;
+
+  List<int> iterable = list;
+  num n = Extension<num>(iterable).field;
+  Extension<num>(iterable).field = n;
+  n = Extension<num>(iterable).finalField;
+  n = Extension<num>(iterable).method();
+  n = Extension<num>(iterable).getter;
+  Extension<num>(iterable).setter = n;
+  n = Extension<num>(iterable).property;
+  Extension<num>(iterable).property = n;
+  n = Extension<num>(iterable).fieldSetter;
+  Extension<num>(iterable).fieldSetter = n;
+
+  value = Extension.staticField;
+  Extension.staticField = value;
+  value = Extension.staticFinalField;
+  value = Extension.staticMethod();
+  value = Extension.staticGetter;
+  Extension.staticSetter = value;
+  value = Extension.staticProperty;
+  Extension.staticProperty = value;
+  value = Extension.staticFieldSetter;
+  Extension.staticFieldSetter = value;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/external.dart.textual_outline.expect
new file mode 100644
index 0000000..8a7d6d9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+extension Extension<T extends num> on List<T> {
+  external T field;
+  external static int staticField;
+  external final T finalField;
+  external static final int staticFinalField;
+  external T method();
+  external static int staticMethod();
+  external T get getter;
+  external static int get staticGetter;
+  external void set setter(T value);
+  external static void set staticSetter(int value);
+  external T get property;
+  external void set property(T value);
+  external static int get staticProperty;
+  external static void set staticProperty(int value);
+  external final T fieldSetter;
+  external void set fieldSetter(T value);
+  external static final int staticFieldSetter;
+  external static void set staticFieldSetter(int value);
+}
+
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/external.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e84ee4c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.textual_outline_modelled.expect
@@ -0,0 +1,23 @@
+extension Extension<T extends num> on List<T> {
+  external T field;
+  external T get getter;
+  external T get property;
+  external T method();
+  external final T fieldSetter;
+  external final T finalField;
+  external static final int staticFieldSetter;
+  external static final int staticFinalField;
+  external static int get staticGetter;
+  external static int get staticProperty;
+  external static int staticField;
+  external static int staticMethod();
+  external static void set staticFieldSetter(int value);
+  external static void set staticProperty(int value);
+  external static void set staticSetter(int value);
+  external void set fieldSetter(T value);
+  external void set property(T value);
+  external void set setter(T value);
+}
+
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.expect b/pkg/front_end/testcases/extensions/external.dart.weak.expect
new file mode 100644
index 0000000..f9c3590
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension Extension<T extends core::num> on core::List<T> {
+  get field = self::Extension|get#field;
+  set field = self::Extension|set#field;
+  static get staticField = get self::Extension|staticField;
+  static set staticField = set self::Extension|staticField;
+  get finalField = self::Extension|get#finalField;
+  static get staticFinalField = get self::Extension|staticFinalField;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  static method staticMethod = self::Extension|staticMethod;
+  get getter = self::Extension|get#getter;
+  static get staticGetter = get self::Extension|staticGetter;
+  get property = self::Extension|get#property;
+  static get staticProperty = get self::Extension|staticProperty;
+  get fieldSetter = self::Extension|get#fieldSetter;
+  static get staticFieldSetter = get self::Extension|staticFieldSetter;
+  set setter = self::Extension|set#setter;
+  static set staticSetter = set self::Extension|staticSetter;
+  set property = self::Extension|set#property;
+  static set staticProperty = set self::Extension|staticProperty;
+  set fieldSetter = self::Extension|set#fieldSetter;
+  static set staticFieldSetter = set self::Extension|staticFieldSetter;
+}
+external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
+external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
+external static get Extension|staticField() → core::int;
+external static set Extension|staticField(core::int #externalFieldValue) → void;
+external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
+external static get Extension|staticFinalField() → core::int;
+external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
+static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
+  return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
+external static method Extension|staticMethod() → core::int;
+external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
+external static get Extension|staticGetter() → core::int;
+external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
+external static set Extension|staticSetter(core::int value) → void;
+external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
+external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
+external static get Extension|staticProperty() → core::int;
+external static set Extension|staticProperty(core::int value) → void;
+external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
+external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
+external static get Extension|staticFieldSetter() → core::int;
+external static set Extension|staticFieldSetter(core::int value) → void;
+static method test() → dynamic {
+  core::List<core::int> list = <core::int>[];
+  core::int value = self::Extension|get#field<core::int>(list);
+  self::Extension|set#field<core::int>(list, value);
+  value = self::Extension|get#finalField<core::int>(list);
+  value = self::Extension|method<core::int>(list);
+  value = self::Extension|get#getter<core::int>(list);
+  self::Extension|set#setter<core::int>(list, value);
+  value = self::Extension|get#property<core::int>(list);
+  self::Extension|set#property<core::int>(list, value);
+  value = self::Extension|get#fieldSetter<core::int>(list);
+  self::Extension|set#fieldSetter<core::int>(list, value);
+  core::List<core::int> iterable = list;
+  core::num n = self::Extension|get#field<core::num>(iterable);
+  self::Extension|set#field<core::num>(iterable, n);
+  n = self::Extension|get#finalField<core::num>(iterable);
+  n = self::Extension|method<core::num>(iterable);
+  n = self::Extension|get#getter<core::num>(iterable);
+  self::Extension|set#setter<core::num>(iterable, n);
+  n = self::Extension|get#property<core::num>(iterable);
+  self::Extension|set#property<core::num>(iterable, n);
+  n = self::Extension|get#fieldSetter<core::num>(iterable);
+  self::Extension|set#fieldSetter<core::num>(iterable, n);
+  value = self::Extension|staticField;
+  self::Extension|staticField = value;
+  value = self::Extension|staticFinalField;
+  value = self::Extension|staticMethod();
+  value = self::Extension|staticGetter;
+  self::Extension|staticSetter = value;
+  value = self::Extension|staticProperty;
+  self::Extension|staticProperty = value;
+  value = self::Extension|staticFieldSetter;
+  self::Extension|staticFieldSetter = value;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/external.dart.weak.outline.expect
new file mode 100644
index 0000000..9dc219e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.outline.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension Extension<T extends core::num> on core::List<T> {
+  get field = self::Extension|get#field;
+  set field = self::Extension|set#field;
+  static get staticField = get self::Extension|staticField;
+  static set staticField = set self::Extension|staticField;
+  get finalField = self::Extension|get#finalField;
+  static get staticFinalField = get self::Extension|staticFinalField;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  static method staticMethod = self::Extension|staticMethod;
+  get getter = self::Extension|get#getter;
+  static get staticGetter = get self::Extension|staticGetter;
+  get property = self::Extension|get#property;
+  static get staticProperty = get self::Extension|staticProperty;
+  get fieldSetter = self::Extension|get#fieldSetter;
+  static get staticFieldSetter = get self::Extension|staticFieldSetter;
+  set setter = self::Extension|set#setter;
+  static set staticSetter = set self::Extension|staticSetter;
+  set property = self::Extension|set#property;
+  static set staticProperty = set self::Extension|staticProperty;
+  set fieldSetter = self::Extension|set#fieldSetter;
+  static set staticFieldSetter = set self::Extension|staticFieldSetter;
+}
+external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
+external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
+external static get Extension|staticField() → core::int;
+external static set Extension|staticField(core::int #externalFieldValue) → void;
+external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
+external static get Extension|staticFinalField() → core::int;
+external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
+static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
+  return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
+external static method Extension|staticMethod() → core::int;
+external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
+external static get Extension|staticGetter() → core::int;
+external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
+external static set Extension|staticSetter(core::int value) → void;
+external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
+external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
+external static get Extension|staticProperty() → core::int;
+external static set Extension|staticProperty(core::int value) → void;
+external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
+external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
+external static get Extension|staticFieldSetter() → core::int;
+external static set Extension|staticFieldSetter(core::int value) → void;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/external.dart.weak.transformed.expect
new file mode 100644
index 0000000..e19cd2d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension Extension<T extends core::num> on core::List<T> {
+  get field = self::Extension|get#field;
+  set field = self::Extension|set#field;
+  static get staticField = get self::Extension|staticField;
+  static set staticField = set self::Extension|staticField;
+  get finalField = self::Extension|get#finalField;
+  static get staticFinalField = get self::Extension|staticFinalField;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  static method staticMethod = self::Extension|staticMethod;
+  get getter = self::Extension|get#getter;
+  static get staticGetter = get self::Extension|staticGetter;
+  get property = self::Extension|get#property;
+  static get staticProperty = get self::Extension|staticProperty;
+  get fieldSetter = self::Extension|get#fieldSetter;
+  static get staticFieldSetter = get self::Extension|staticFieldSetter;
+  set setter = self::Extension|set#setter;
+  static set staticSetter = set self::Extension|staticSetter;
+  set property = self::Extension|set#property;
+  static set staticProperty = set self::Extension|staticProperty;
+  set fieldSetter = self::Extension|set#fieldSetter;
+  static set staticFieldSetter = set self::Extension|staticFieldSetter;
+}
+external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
+external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
+external static get Extension|staticField() → core::int;
+external static set Extension|staticField(core::int #externalFieldValue) → void;
+external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
+external static get Extension|staticFinalField() → core::int;
+external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
+static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
+  return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
+external static method Extension|staticMethod() → core::int;
+external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
+external static get Extension|staticGetter() → core::int;
+external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
+external static set Extension|staticSetter(core::int value) → void;
+external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
+external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
+external static get Extension|staticProperty() → core::int;
+external static set Extension|staticProperty(core::int value) → void;
+external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
+external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
+external static get Extension|staticFieldSetter() → core::int;
+external static set Extension|staticFieldSetter(core::int value) → void;
+static method test() → dynamic {
+  core::List<core::int> list = core::_GrowableList::•<core::int>(0);
+  core::int value = self::Extension|get#field<core::int>(list);
+  self::Extension|set#field<core::int>(list, value);
+  value = self::Extension|get#finalField<core::int>(list);
+  value = self::Extension|method<core::int>(list);
+  value = self::Extension|get#getter<core::int>(list);
+  self::Extension|set#setter<core::int>(list, value);
+  value = self::Extension|get#property<core::int>(list);
+  self::Extension|set#property<core::int>(list, value);
+  value = self::Extension|get#fieldSetter<core::int>(list);
+  self::Extension|set#fieldSetter<core::int>(list, value);
+  core::List<core::int> iterable = list;
+  core::num n = self::Extension|get#field<core::num>(iterable);
+  self::Extension|set#field<core::num>(iterable, n);
+  n = self::Extension|get#finalField<core::num>(iterable);
+  n = self::Extension|method<core::num>(iterable);
+  n = self::Extension|get#getter<core::num>(iterable);
+  self::Extension|set#setter<core::num>(iterable, n);
+  n = self::Extension|get#property<core::num>(iterable);
+  self::Extension|set#property<core::num>(iterable, n);
+  n = self::Extension|get#fieldSetter<core::num>(iterable);
+  self::Extension|set#fieldSetter<core::num>(iterable, n);
+  value = self::Extension|staticField;
+  self::Extension|staticField = value;
+  value = self::Extension|staticFinalField;
+  value = self::Extension|staticMethod();
+  value = self::Extension|staticGetter;
+  self::Extension|staticSetter = value;
+  value = self::Extension|staticProperty;
+  self::Extension|staticProperty = value;
+  value = self::Extension|staticFieldSetter;
+  self::Extension|staticFieldSetter = value;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect
@@ -101,9 +101,9 @@
   external static get finalStaticField() → core::int;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@@ -113,9 +113,9 @@
 external static get finalTopLevelField() → core::int;
 external static get constField() → core::int;
 external static set constField(core::int #externalFieldValue) → void;
-external static get Extension|extensionInstanceField() → core::int;
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 external static get Extension|extensionStaticField() → core::int;
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 external static get Extension|finalExtensionStaticField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect
@@ -101,9 +101,9 @@
   external static get finalStaticField() → core::int;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@@ -113,9 +113,9 @@
 external static get finalTopLevelField() → core::int;
 external static get constField() → core::int;
 external static set constField(core::int #externalFieldValue) → void;
-external static get Extension|extensionInstanceField() → core::int;
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 external static get Extension|extensionStaticField() → core::int;
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 external static get Extension|finalExtensionStaticField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect
@@ -101,9 +101,9 @@
   external static get finalStaticField() → core::int;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@@ -113,9 +113,9 @@
 external static get finalTopLevelField() → core::int;
 external static get constField() → core::int;
 external static set constField(core::int #externalFieldValue) → void;
-external static get Extension|extensionInstanceField() → core::int;
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 external static get Extension|extensionStaticField() → core::int;
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 external static get Extension|finalExtensionStaticField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect
index d92b2fe..994b1f9 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect
@@ -21,9 +21,9 @@
   external static get finalStaticField() → core::int;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@@ -33,9 +33,9 @@
 external static get finalTopLevelField() → core::int;
 external static get constField() → core::int;
 external static set constField(core::int #externalFieldValue) → void;
-external static get Extension|extensionInstanceField() → core::int;
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 external static get Extension|extensionStaticField() → core::int;
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 external static get Extension|finalExtensionStaticField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect
@@ -101,9 +101,9 @@
   external static get finalStaticField() → core::int;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@@ -113,9 +113,9 @@
 external static get finalTopLevelField() → core::int;
 external static get constField() → core::int;
 external static set constField(core::int #externalFieldValue) → void;
-external static get Extension|extensionInstanceField() → core::int;
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 external static get Extension|extensionStaticField() → core::int;
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 external static get Extension|finalExtensionStaticField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect
@@ -78,15 +78,15 @@
   external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
-  get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
-  set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
-  get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
+  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
+  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
+  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
   static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
   static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
   static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@@ -101,20 +101,20 @@
 external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
 external static get untypedFinalTopLevelField() → dynamic;
 @#C1
-external static get Extension|extensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
 @#C1
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
 @#C1
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 @#C1
 external static get Extension|extensionStaticField() → core::int;
 @#C1
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 @#C1
 external static get Extension|finalExtensionStaticField() → core::int;
-external static get Extension|untypedExtensionInstanceField() → dynamic;
-external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
-external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
+external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
+external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
+external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
 external static get Extension|untypedExtensionStaticField() → dynamic;
 external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
 external static get Extension|untypedFinalExtensionStaticField() → dynamic;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect
@@ -78,15 +78,15 @@
   external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
-  get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
-  set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
-  get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
+  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
+  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
+  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
   static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
   static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
   static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@@ -101,20 +101,20 @@
 external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
 external static get untypedFinalTopLevelField() → dynamic;
 @#C1
-external static get Extension|extensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
 @#C1
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
 @#C1
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 @#C1
 external static get Extension|extensionStaticField() → core::int;
 @#C1
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 @#C1
 external static get Extension|finalExtensionStaticField() → core::int;
-external static get Extension|untypedExtensionInstanceField() → dynamic;
-external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
-external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
+external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
+external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
+external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
 external static get Extension|untypedExtensionStaticField() → dynamic;
 external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
 external static get Extension|untypedFinalExtensionStaticField() → dynamic;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect
@@ -78,15 +78,15 @@
   external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
-  get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
-  set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
-  get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
+  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
+  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
+  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
   static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
   static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
   static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@@ -101,20 +101,20 @@
 external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
 external static get untypedFinalTopLevelField() → dynamic;
 @#C1
-external static get Extension|extensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
 @#C1
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
 @#C1
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 @#C1
 external static get Extension|extensionStaticField() → core::int;
 @#C1
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 @#C1
 external static get Extension|finalExtensionStaticField() → core::int;
-external static get Extension|untypedExtensionInstanceField() → dynamic;
-external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
-external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
+external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
+external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
+external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
 external static get Extension|untypedExtensionStaticField() → dynamic;
 external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
 external static get Extension|untypedFinalExtensionStaticField() → dynamic;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect
index 99614fc..3b1721d 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect
@@ -76,15 +76,15 @@
   external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
-  get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
-  set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
-  get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
+  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
+  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
+  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
   static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
   static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
   static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@@ -99,20 +99,20 @@
 external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
 external static get untypedFinalTopLevelField() → dynamic;
 @self::Annotation::•()
-external static get Extension|extensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
 @self::Annotation::•()
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
 @self::Annotation::•()
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 @self::Annotation::•()
 external static get Extension|extensionStaticField() → core::int;
 @self::Annotation::•()
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 @self::Annotation::•()
 external static get Extension|finalExtensionStaticField() → core::int;
-external static get Extension|untypedExtensionInstanceField() → dynamic;
-external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
-external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
+external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
+external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
+external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
 external static get Extension|untypedExtensionStaticField() → dynamic;
 external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
 external static get Extension|untypedFinalExtensionStaticField() → dynamic;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect
@@ -78,15 +78,15 @@
   external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
 }
 extension Extension on self::A {
-  get extensionInstanceField = get self::Extension|extensionInstanceField;
-  set extensionInstanceField = set self::Extension|extensionInstanceField;
-  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
   static get extensionStaticField = get self::Extension|extensionStaticField;
   static set extensionStaticField = set self::Extension|extensionStaticField;
   static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
-  get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
-  set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
-  get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
+  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
+  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
+  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
   static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
   static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
   static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@@ -101,20 +101,20 @@
 external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
 external static get untypedFinalTopLevelField() → dynamic;
 @#C1
-external static get Extension|extensionInstanceField() → core::int;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
 @#C1
-external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
 @#C1
-external static get Extension|finalExtensionInstanceField() → core::int;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
 @#C1
 external static get Extension|extensionStaticField() → core::int;
 @#C1
 external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
 @#C1
 external static get Extension|finalExtensionStaticField() → core::int;
-external static get Extension|untypedExtensionInstanceField() → dynamic;
-external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
-external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
+external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
+external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
+external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
 external static get Extension|untypedExtensionStaticField() → dynamic;
 external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
 external static get Extension|untypedFinalExtensionStaticField() → dynamic;
diff --git a/tools/VERSION b/tools/VERSION
index 470204da..4ae6011 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 84
+PRERELEASE 85
 PRERELEASE_PATCH 0
\ No newline at end of file