[cfe] Create explicit internal ast nodes for extension access

This adds explicit internal ast nodes for the various kinds of extension access in order to avoid lowering during body building and to make the encoding directly match the information from the source code.

TEST=existing

Change-Id: Ic831b2871ed0e66221a7ca5dadde4333647c2d3c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/446381
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Erik Ernst <eernst@google.com>
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index 3424847..9295cfd 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -1137,6 +1137,10 @@
     } else {
       Expression value = toValue(node);
       if (!forest.isThrow(node)) {
+        // TODO(johnniwinther): Derive the message position from the [node]
+        // and not the [value].  For instance this occurs for `super()?.foo()`
+        // in an initializer list, pointing to `foo` as expecting an
+        // initializer.
         value = wrapInProblem(
             value, cfe.codeExpectedAnInitializer, value.fileOffset, noLength);
       }
@@ -1161,13 +1165,11 @@
         if (formal.isNamed) {
           (superParametersAsArguments ??= <Object>[]).add(new NamedExpression(
               formal.name,
-              createVariableGet(formal.variable!, formal.fileOffset,
-                  forNullGuardedAccess: false))
+              createVariableGet(formal.variable!, formal.fileOffset))
             ..fileOffset = formal.fileOffset);
         } else {
-          (superParametersAsArguments ??= <Object>[]).add(createVariableGet(
-              formal.variable!, formal.fileOffset,
-              forNullGuardedAccess: false));
+          (superParametersAsArguments ??= <Object>[])
+              .add(createVariableGet(formal.variable!, formal.fileOffset));
         }
       }
     }
@@ -1853,8 +1855,7 @@
           if (formal.isNamed) {
             NamedExpression superParameterAsArgument = new NamedExpression(
                 formal.name,
-                createVariableGet(formal.variable!, formal.fileOffset,
-                    forNullGuardedAccess: false))
+                createVariableGet(formal.variable!, formal.fileOffset))
               ..fileOffset = formal.fileOffset;
             (namedSuperParametersAsArguments ??= <NamedExpression>[])
                 .add(superParameterAsArgument);
@@ -1862,9 +1863,8 @@
             (superParametersAsArguments ??= <Object>[])
                 .add(superParameterAsArgument);
           } else {
-            Expression superParameterAsArgument = createVariableGet(
-                formal.variable!, formal.fileOffset,
-                forNullGuardedAccess: false);
+            Expression superParameterAsArgument =
+                createVariableGet(formal.variable!, formal.fileOffset);
             (positionalSuperParametersAsArguments ??= <Expression>[])
                 .add(superParameterAsArgument);
             (superParametersAsArguments ??= <Object>[])
@@ -1929,11 +1929,9 @@
         if (_context.isEnumClass && libraryFeatures.enhancedEnums.isEnabled) {
           ArgumentsImpl arguments = last.arguments as ArgumentsImpl;
           List<Expression> enumSyntheticArguments = [
-            new VariableGetImpl(function.positionalParameters[0],
-                forNullGuardedAccess: false)
+            new VariableGet(function.positionalParameters[0])
               ..parent = last.arguments,
-            new VariableGetImpl(function.positionalParameters[1],
-                forNullGuardedAccess: false)
+            new VariableGet(function.positionalParameters[1])
               ..parent = last.arguments
           ];
           arguments.positional.insertAll(0, enumSyntheticArguments);
@@ -1981,10 +1979,8 @@
             function.positionalParameters[0].name == "#index" &&
             function.positionalParameters[1].name == "#name");
         (positionalArguments ??= <Expression>[]).insertAll(0, [
-          new VariableGetImpl(function.positionalParameters[0],
-              forNullGuardedAccess: false),
-          new VariableGetImpl(function.positionalParameters[1],
-              forNullGuardedAccess: false)
+          new VariableGet(function.positionalParameters[0]),
+          new VariableGet(function.positionalParameters[1])
         ]);
       }
 
@@ -3227,15 +3223,12 @@
   /// Helper method to create a [VariableGet] of the [variable] using
   /// [charOffset] as the file offset.
   @override
-  VariableGet createVariableGet(VariableDeclaration variable, int charOffset,
-      {bool forNullGuardedAccess = false}) {
+  VariableGet createVariableGet(VariableDeclaration variable, int charOffset) {
     if (!(variable as VariableDeclarationImpl).isLocalFunction &&
         !variable.isWildcard) {
       typeInferrer.assignedVariables.read(variable);
     }
-    return new VariableGetImpl(variable,
-        forNullGuardedAccess: forNullGuardedAccess)
-      ..fileOffset = charOffset;
+    return new VariableGet(variable)..fileOffset = charOffset;
   }
 
   /// Helper method to create a [ReadOnlyAccessGenerator] on the [variable]
@@ -3433,7 +3426,7 @@
                 this,
                 nameToken,
                 extensionBuilder.extension,
-                name,
+                memberName,
                 thisVariable!,
                 thisTypeParameters,
                 getable as MemberBuilder?,
@@ -3516,7 +3509,7 @@
                 this,
                 nameToken,
                 extensionBuilder.extension,
-                name,
+                memberName,
                 thisVariable!,
                 thisTypeParameters,
                 getable as MemberBuilder?,
@@ -6249,59 +6242,28 @@
   }
 
   @override
-  Expression buildExtensionMethodInvocation(
-      int fileOffset, Procedure target, Arguments arguments,
-      {required bool isTearOff}) {
-    List<TypeParameter> typeParameters = target.function.typeParameters;
-    LocatedMessage? argMessage = checkArgumentsForFunction(
-        target.function, arguments, fileOffset, typeParameters,
-        isExtensionMemberInvocation: true);
-    if (argMessage != null) {
-      return buildUnresolvedError(target.name.text, fileOffset,
-          arguments: arguments,
-          candidate: target,
-          message: argMessage,
-          kind: UnresolvedKind.Method);
-    }
-
-    Expression node;
-    if (isTearOff) {
-      node = new ExtensionTearOff(target, arguments);
-    } else {
-      node = new StaticInvocation(target, arguments);
-    }
-    node.fileOffset = fileOffset;
-    return node;
-  }
-
-  @override
   LocatedMessage? checkArgumentsForFunction(FunctionNode function,
       Arguments arguments, int offset, List<TypeParameter> typeParameters,
-      {bool isExtensionMemberInvocation = false}) {
-    int requiredPositionalParameterCountToReport =
-        function.requiredParameterCount;
-    int positionalParameterCountToReport = function.positionalParameters.length;
-    int positionalArgumentCountToReport =
-        forest.argumentsPositional(arguments).length;
-    if (isExtensionMemberInvocation) {
+      {Extension? extension}) {
+    int typeParameterCount = typeParameters.length;
+    int requiredParameterCount = function.requiredParameterCount;
+    int positionalParameterCount = function.positionalParameters.length;
+    int positionalArgumentsCount = arguments.positional.length;
+    if (extension != null) {
       // Extension member invocations have additional synthetic parameter for
       // `this`.
-      --requiredPositionalParameterCountToReport;
-      --positionalParameterCountToReport;
-      --positionalArgumentCountToReport;
+      --requiredParameterCount;
+      --positionalParameterCount;
+      typeParameterCount -= extension.typeParameters.length;
     }
-    if (forest.argumentsPositional(arguments).length <
-        function.requiredParameterCount) {
+    if (positionalArgumentsCount < requiredParameterCount) {
       return cfe.codeTooFewArguments
-          .withArguments(requiredPositionalParameterCountToReport,
-              positionalArgumentCountToReport)
+          .withArguments(requiredParameterCount, positionalArgumentsCount)
           .withLocation(uri, arguments.fileOffset, noLength);
     }
-    if (forest.argumentsPositional(arguments).length >
-        function.positionalParameters.length) {
+    if (positionalArgumentsCount > positionalParameterCount) {
       return cfe.codeTooManyArguments
-          .withArguments(
-              positionalParameterCountToReport, positionalArgumentCountToReport)
+          .withArguments(positionalParameterCount, positionalArgumentsCount)
           .withLocation(uri, arguments.fileOffset, noLength);
     }
     List<NamedExpression> named = forest.argumentsNamed(arguments);
@@ -6329,8 +6291,8 @@
       }
     }
 
-    List<DartType> types = forest.argumentsTypeArguments(arguments);
-    if (typeParameters.length != types.length) {
+    List<DartType> types = arguments.types;
+    if (typeParameterCount != types.length) {
       if (types.length == 0) {
         // Expected `typeParameters.length` type arguments, but none given, so
         // we use type inference.
@@ -6338,7 +6300,7 @@
         // A wrong (non-zero) amount of type arguments given. That's an error.
         // TODO(jensj): Position should be on type arguments instead.
         return cfe.codeTypeArgumentMismatch
-            .withArguments(typeParameters.length)
+            .withArguments(typeParameterCount)
             .withLocation(uri, offset, noLength);
       }
     }
@@ -7808,8 +7770,7 @@
         ///       body;
         ///     }
         elements.syntheticAssignment = lvalue.buildAssignment(
-            new VariableGetImpl(variable, forNullGuardedAccess: false)
-              ..fileOffset = inToken.offset,
+            new VariableGet(variable)..fileOffset = inToken.offset,
             voidContext: true);
       } else if (lvalue is Pattern) {
         /// We are in the case where `lvalue` is a pattern:
@@ -7824,9 +7785,7 @@
         ///     }
         elements.syntheticAssignment = null;
         elements.expressionEffects = forest.createPatternVariableDeclaration(
-            inToken.offset,
-            lvalue,
-            new VariableGetImpl(variable, forNullGuardedAccess: false),
+            inToken.offset, lvalue, new VariableGet(variable),
             isFinal: false);
       } else if (lvalue is InvalidExpression) {
         // Coverage-ignore-block(suite): Not run.
diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart
index 501a280..f072d67 100644
--- a/pkg/front_end/lib/src/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/kernel/expression_generator.dart
@@ -1531,7 +1531,7 @@
   final Extension extension;
 
   /// The original name of the target.
-  final String targetName;
+  final Name targetName;
 
   /// The static [Member] generated for an instance extension member which is
   /// used for performing a read on this subexpression.
@@ -1584,7 +1584,7 @@
       ExpressionGeneratorHelper helper,
       Token token,
       Extension extension,
-      String? targetName,
+      Name targetName,
       VariableDeclaration extensionThis,
       List<TypeParameter>? extensionTypeParameters,
       MemberBuilder? getterBuilder,
@@ -1617,8 +1617,6 @@
       if (setterBuilder is PropertyBuilder) {
         assert(!setterBuilder.isStatic && !setterBuilder.hasConcreteField);
         writeTarget = setterBuilder.writeTarget as Procedure?;
-        // Coverage-ignore-block(suite): Not run.
-        targetName ??= setterBuilder.name;
       } else {
         return unhandled(
             "${setterBuilder.runtimeType}",
@@ -1631,7 +1629,7 @@
         helper,
         token,
         extension,
-        targetName!,
+        targetName,
         readTarget,
         invokeTarget,
         writeTarget,
@@ -1644,12 +1642,16 @@
   String get _debugName => "InstanceExtensionAccessGenerator";
 
   @override
-  String get _plainNameForRead => targetName;
+  String get _plainNameForRead => targetName.text;
 
-  int get _extensionTypeParameterCount => extensionTypeParameters?.length ?? 0;
+  /// Creates an access to the implicit `this` variable.
+  Expression _createThisAccess() =>
+      _helper.createVariableGet(extensionThis, fileOffset);
 
-  List<DartType> _createExtensionTypeArguments() {
-    List<DartType> extensionTypeArguments = const <DartType>[];
+  /// Creates the implicit type arguments for the extension access. These
+  /// are the type parameter type of the extension type parameters.
+  List<DartType>? _createThisTypeArguments() {
+    List<DartType>? extensionTypeArguments;
     if (extensionTypeParameters != null) {
       extensionTypeArguments = [];
       for (TypeParameter typeParameter in extensionTypeParameters!) {
@@ -1661,26 +1663,39 @@
     return extensionTypeArguments;
   }
 
+  /// Returns `true` if performing a read operation is a tear off.
+  ///
+  /// This is the case if [invokeTarget] is non-null, since extension methods
+  /// have both a [readTarget] and an [invokeTarget], whereas extension getters
+  /// only have a [readTarget].
+  bool get isReadTearOff => invokeTarget != null;
+
   @override
   Expression buildSimpleRead() {
     return _createRead();
   }
 
   Expression _createRead() {
+    Procedure? getter = readTarget;
     Expression read;
-    if (readTarget == null) {
+    if (getter == null) {
       read = _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (isReadTearOff) {
+      read = new ExtensionTearOff.implicit(
+          extension: extension,
+          thisTypeArguments: _createThisTypeArguments(),
+          thisAccess: _createThisAccess(),
+          name: targetName,
+          tearOff: getter)
+        ..fileOffset = fileOffset;
     } else {
-      read = _helper.buildExtensionMethodInvocation(
-          fileOffset,
-          readTarget!,
-          _helper.forest.createArgumentsForExtensionMethod(
-              fileOffset,
-              _extensionTypeParameterCount,
-              0,
-              _helper.createVariableGet(extensionThis, fileOffset),
-              extensionTypeArguments: _createExtensionTypeArguments()),
-          isTearOff: invokeTarget != null);
+      read = new ExtensionGet.implicit(
+          extension: extension,
+          thisTypeArguments: _createThisTypeArguments(),
+          thisAccess: _createThisAccess(),
+          name: targetName,
+          getter: getter)
+        ..fileOffset = fileOffset;
     }
     return read;
   }
@@ -1692,28 +1707,45 @@
 
   Expression _createWrite(int offset, Expression value,
       {required bool forEffect}) {
-    Expression write;
-    if (writeTarget == null) {
-      write = _makeInvalidWrite(value: value);
+    Procedure? setter = writeTarget;
+    if (setter == null) {
+      return _makeInvalidWrite(value: value);
     } else {
-      write = new ExtensionSet(
-          extension,
-          _createExtensionTypeArguments(),
-          _helper.createVariableGet(extensionThis, fileOffset),
-          writeTarget!,
-          value,
-          forEffect: forEffect);
+      return new ExtensionSet.implicit(
+          extension: extension,
+          thisTypeArguments: _createThisTypeArguments(),
+          thisAccess: _createThisAccess(),
+          name: targetName,
+          setter: setter,
+          value: value,
+          forEffect: forEffect)
+        ..fileOffset = offset;
     }
-    write.fileOffset = offset;
-    return write;
   }
 
   @override
   Expression buildIfNullAssignment(Expression value, DartType type, int offset,
       {bool voidContext = false}) {
-    return new IfNullSet(
-        _createRead(), _createWrite(fileOffset, value, forEffect: voidContext),
-        forEffect: voidContext)
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Setter);
+    }
+    return new ExtensionIfNullSet.implicit(
+        extension: extension,
+        thisTypeArguments: _createThisTypeArguments(),
+        thisAccess: _createThisAccess(),
+        propertyName: targetName,
+        getter: getter,
+        rhs: value,
+        setter: setter,
+        forEffect: voidContext,
+        readOffset: fileOffset,
+        binaryOffset: offset,
+        writeOffset: fileOffset)
       ..fileOffset = offset;
   }
 
@@ -1723,56 +1755,92 @@
       bool voidContext = false,
       bool isPreIncDec = false,
       bool isPostIncDec = false}) {
-    Expression binary = _helper.forest
-        .createBinary(offset, _createRead(), binaryOperator, value);
-    return _createWrite(fileOffset, binary, forEffect: voidContext);
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Setter);
+    }
+    return new ExtensionCompoundSet.implicit(
+        extension: extension,
+        thisTypeArguments: _createThisTypeArguments(),
+        thisAccess: _createThisAccess(),
+        propertyName: targetName,
+        getter: getter,
+        binaryName: binaryOperator,
+        rhs: value,
+        setter: setter,
+        forEffect: voidContext,
+        readOffset: fileOffset,
+        binaryOffset: offset,
+        writeOffset: fileOffset);
   }
 
   @override
   Expression buildPostfixIncrement(Name binaryOperator,
       {int offset = TreeNode.noOffset, bool voidContext = false}) {
-    Expression value = _forest.createIntLiteral(offset, 1);
-    if (voidContext) {
-      return buildCompoundAssignment(binaryOperator, value,
-          offset: offset, voidContext: voidContext, isPostIncDec: true);
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Setter);
     }
-    VariableDeclarationImpl read =
-        _helper.createVariableDeclarationForValue(_createRead());
-    Expression binary = _helper.forest.createBinary(offset,
-        _helper.createVariableGet(read, fileOffset), binaryOperator, value);
-    VariableDeclarationImpl write = _helper.createVariableDeclarationForValue(
-        _createWrite(fileOffset, binary, forEffect: true));
-    return new PropertyPostIncDec.onReadOnly(read, write)..fileOffset = offset;
+    return new ExtensionPostIncDec.implicit(
+        extension: extension,
+        thisTypeArguments: _createThisTypeArguments(),
+        thisAccess: _createThisAccess(),
+        name: targetName,
+        getter: getter,
+        setter: setter,
+        isInc: binaryOperator == plusName,
+        forEffect: voidContext)
+      ..fileOffset = offset;
   }
 
   @override
   Expression doInvocation(
       int offset, List<TypeBuilder>? typeArguments, ArgumentsImpl arguments,
       {bool isTypeArgumentsInForest = false}) {
-    if (invokeTarget != null) {
-      Expression thisAccess = _helper.createVariableGet(extensionThis, offset);
-      return _helper.buildExtensionMethodInvocation(
-          offset,
-          invokeTarget!,
-          _forest.createArgumentsForExtensionMethod(
-              fileOffset,
-              _extensionTypeParameterCount,
-              invokeTarget!.function.typeParameters.length -
-                  _extensionTypeParameterCount,
-              thisAccess,
-              extensionTypeArguments: _createExtensionTypeArguments(),
-              typeArguments: arguments.types,
-              positionalArguments: arguments.positional,
-              namedArguments: arguments.named,
-              argumentsOriginalOrder: arguments.argumentsOriginalOrder != null
-                  ? [thisAccess, ...arguments.argumentsOriginalOrder!]
-                  : null),
-          isTearOff: false);
+    Procedure? method = invokeTarget;
+    Procedure? getter = readTarget;
+    if (method != null) {
+      Expression thisAccess = _createThisAccess();
+      List<TypeParameter> typeParameters = method.function.typeParameters;
+      LocatedMessage? argMessage = _helper.checkArgumentsForFunction(
+          method.function, arguments, offset, typeParameters,
+          extension: extension);
+      if (argMessage != null) {
+        // Coverage-ignore-block(suite): Not run.
+        return _helper.buildUnresolvedError(targetName.text, fileOffset,
+            arguments: arguments,
+            candidate: method,
+            message: argMessage,
+            kind: UnresolvedKind.Method);
+      }
+      return new ExtensionMethodInvocation.implicit(
+          extension: extension,
+          thisTypeArguments: _createThisTypeArguments(),
+          thisAccess: thisAccess,
+          name: targetName,
+          target: method,
+          arguments: arguments)
+        ..fileOffset = fileOffset;
+    } else if (getter != null) {
+      Expression thisAccess = _createThisAccess();
+      return new ExtensionGetterInvocation.implicit(
+          extension: extension,
+          thisTypeArguments: _createThisTypeArguments(),
+          thisAccess: thisAccess,
+          name: targetName,
+          target: getter,
+          arguments: arguments)
+        ..fileOffset = fileOffset;
     } else {
-      return _helper.forest.createExpressionInvocation(
-          adjustForImplicitCall(_plainNameForRead, offset),
-          buildSimpleRead(),
-          arguments);
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
     }
   }
 
@@ -1953,10 +2021,6 @@
   @override
   String get _plainNameForRead => targetName.text;
 
-  List<DartType> _createExtensionTypeArguments() {
-    return explicitTypeArguments ?? const <DartType>[];
-  }
-
   /// Returns `true` if performing a read operation is a tear off.
   ///
   /// This is the case if [invokeTarget] is non-null, since extension methods
@@ -1966,99 +2030,86 @@
 
   @override
   Expression buildSimpleRead() {
-    if (isNullAware) {
-      VariableDeclarationImpl variable =
-          _helper.createVariableDeclarationForValue(receiver);
-      return new NullAwareExtension(
-          variable,
-          _createRead(_helper.createVariableGet(variable, variable.fileOffset,
-              forNullGuardedAccess: true)))
-        ..fileOffset = fileOffset;
-    } else {
-      return _createRead(receiver);
-    }
+    return _createRead(receiver, isNullAware: isNullAware);
   }
 
-  Expression _createRead(Expression receiver) {
-    Expression read;
-    if (readTarget == null) {
+  Expression _createRead(Expression receiver, {required bool isNullAware}) {
+    Procedure? getter = readTarget;
+    if (getter == null) {
       // Coverage-ignore-block(suite): Not run.
-      read = _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (isReadTearOff) {
+      return new ExtensionTearOff.explicit(
+          extension: extension,
+          explicitTypeArguments: explicitTypeArguments,
+          receiver: receiver,
+          name: targetName,
+          tearOff: getter,
+          isNullAware: isNullAware)
+        ..fileOffset = fileOffset;
     } else {
-      read = _helper.buildExtensionMethodInvocation(
-          fileOffset,
-          readTarget!,
-          _helper.forest.createArgumentsForExtensionMethod(
-              fileOffset, extensionTypeParameterCount, 0, receiver,
-              extensionTypeArguments: _createExtensionTypeArguments(),
-              extensionTypeArgumentOffset: extensionTypeArgumentOffset),
-          isTearOff: isReadTearOff);
+      return new ExtensionGet.explicit(
+          extension: extension,
+          explicitTypeArguments: explicitTypeArguments,
+          receiver: receiver,
+          name: targetName,
+          getter: getter,
+          isNullAware: isNullAware)
+        ..fileOffset = fileOffset;
     }
-    return read;
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext = false}) {
-    if (isNullAware) {
-      VariableDeclarationImpl variable =
-          _helper.createVariableDeclarationForValue(receiver);
-      return new NullAwareExtension(
-          variable,
-          _createWrite(
-              fileOffset,
-              _helper.createVariableGet(variable, variable.fileOffset,
-                  forNullGuardedAccess: true),
-              value,
-              forEffect: voidContext))
-        ..fileOffset = fileOffset;
-    } else {
-      return _createWrite(fileOffset, receiver, value, forEffect: voidContext);
-    }
+    return _createWrite(fileOffset, receiver, value,
+        forEffect: voidContext, isNullAware: isNullAware);
   }
 
   Expression _createWrite(int offset, Expression receiver, Expression value,
-      {required bool forEffect}) {
-    Expression write;
-    if (writeTarget == null) {
+      {required bool forEffect, required bool isNullAware}) {
+    Procedure? setter = writeTarget;
+    if (setter == null) {
       // Coverage-ignore-block(suite): Not run.
-      write = _makeInvalidWrite(value: value);
+      return _makeInvalidWrite(value: value);
     } else {
-      write = new ExtensionSet(
-          extension, explicitTypeArguments, receiver, writeTarget!, value,
-          forEffect: forEffect);
+      return new ExtensionSet.explicit(
+          extension: extension,
+          explicitTypeArguments: explicitTypeArguments,
+          receiver: receiver,
+          name: targetName,
+          setter: setter,
+          value: value,
+          forEffect: forEffect,
+          isNullAware: isNullAware)
+        ..fileOffset = offset;
     }
-    write.fileOffset = offset;
-    return write;
   }
 
   @override
   Expression buildIfNullAssignment(Expression value, DartType type, int offset,
       {bool voidContext = false}) {
-    if (isNullAware) {
-      VariableDeclarationImpl variable =
-          _helper.createVariableDeclarationForValue(receiver);
-      Expression read = _createRead(_helper.createVariableGet(
-          variable, receiver.fileOffset,
-          forNullGuardedAccess: true));
-      Expression write = _createWrite(
-          fileOffset,
-          _helper.createVariableGet(variable, receiver.fileOffset,
-              forNullGuardedAccess: true),
-          value,
-          forEffect: voidContext);
-      return new NullAwareExtension(
-          variable,
-          new IfNullSet(read, write, forEffect: voidContext)
-            ..fileOffset = offset)
-        ..fileOffset = fileOffset;
-    } else {
-      return new IfNullPropertySet(receiver, targetName, value,
-          forEffect: voidContext,
-          readOffset: fileOffset,
-          writeOffset: fileOffset,
-          isNullAware: false)
-        ..fileOffset = offset;
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Setter);
     }
+    return new ExtensionIfNullSet.explicit(
+        extension: extension,
+        explicitTypeArguments: explicitTypeArguments,
+        receiver: receiver,
+        propertyName: targetName,
+        getter: getter,
+        rhs: value,
+        setter: setter,
+        forEffect: voidContext,
+        readOffset: fileOffset,
+        binaryOffset: offset,
+        writeOffset: fileOffset,
+        isNullAware: isNullAware)
+      ..fileOffset = offset;
   }
 
   @override
@@ -2067,117 +2118,96 @@
       bool voidContext = false,
       bool isPreIncDec = false,
       bool isPostIncDec = false}) {
-    if (isNullAware) {
-      VariableDeclarationImpl variable =
-          _helper.createVariableDeclarationForValue(receiver);
-      Expression binary = _helper.forest.createBinary(
-          offset,
-          _createRead(_helper.createVariableGet(variable, receiver.fileOffset,
-              forNullGuardedAccess: true)),
-          binaryOperator,
-          value);
-      Expression write = _createWrite(
-          fileOffset,
-          _helper.createVariableGet(variable, receiver.fileOffset,
-              forNullGuardedAccess: true),
-          binary,
-          forEffect: voidContext);
-      return new NullAwareExtension(variable, write)..fileOffset = offset;
-    } else {
-      return new CompoundExtensionSet(extension, explicitTypeArguments,
-          receiver, targetName, readTarget, binaryOperator, value, writeTarget,
-          forEffect: voidContext,
-          readOffset: fileOffset,
-          binaryOffset: offset,
-          writeOffset: fileOffset)
-        ..fileOffset = offset;
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Setter);
     }
+    return new ExtensionCompoundSet.explicit(
+        extension: extension,
+        explicitTypeArguments: explicitTypeArguments,
+        receiver: receiver,
+        propertyName: targetName,
+        getter: getter,
+        binaryName: binaryOperator,
+        rhs: value,
+        setter: setter,
+        forEffect: voidContext,
+        readOffset: fileOffset,
+        binaryOffset: offset,
+        writeOffset: fileOffset,
+        isNullAware: isNullAware)
+      ..fileOffset = offset;
   }
 
   @override
   Expression buildPostfixIncrement(Name binaryOperator,
       {int offset = TreeNode.noOffset, bool voidContext = false}) {
-    Expression value = _forest.createIntLiteral(offset, 1);
-    if (voidContext) {
-      return buildCompoundAssignment(binaryOperator, value,
-          offset: offset, voidContext: voidContext, isPostIncDec: true);
-    } else if (isNullAware) {
-      VariableDeclarationImpl variable =
-          _helper.createVariableDeclarationForValue(receiver);
-      VariableDeclarationImpl read = _helper.createVariableDeclarationForValue(
-          _createRead(_helper.createVariableGet(variable, receiver.fileOffset,
-              forNullGuardedAccess: true)));
-      Expression binary = _helper.forest.createBinary(offset,
-          _helper.createVariableGet(read, fileOffset), binaryOperator, value);
-      VariableDeclarationImpl write = _helper.createVariableDeclarationForValue(
-          _createWrite(
-              fileOffset,
-              _helper.createVariableGet(variable, receiver.fileOffset,
-                  forNullGuardedAccess: true),
-              binary,
-              forEffect: voidContext)
-            ..fileOffset = fileOffset);
-      return new NullAwareExtension(
-          variable, new LocalPostIncDec(read, write)..fileOffset = offset)
-        ..fileOffset = fileOffset;
-    } else {
-      VariableDeclarationImpl variable =
-          _helper.createVariableDeclarationForValue(receiver);
-      VariableDeclarationImpl read = _helper.createVariableDeclarationForValue(
-          _createRead(
-              _helper.createVariableGet(variable, receiver.fileOffset)));
-      Expression binary = _helper.forest.createBinary(offset,
-          _helper.createVariableGet(read, fileOffset), binaryOperator, value);
-      VariableDeclarationImpl write = _helper.createVariableDeclarationForValue(
-          _createWrite(fileOffset,
-              _helper.createVariableGet(variable, receiver.fileOffset), binary,
-              forEffect: voidContext)
-            ..fileOffset = fileOffset);
-      return new PropertyPostIncDec(variable, read, write)..fileOffset = offset;
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    if (getter == null) {
+      // Coverage-ignore-block(suite): Not run.
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Setter);
     }
+    return new ExtensionPostIncDec.explicit(
+        extension: extension,
+        explicitTypeArguments: explicitTypeArguments,
+        receiver: receiver,
+        name: targetName,
+        getter: getter,
+        setter: setter,
+        isInc: binaryOperator == plusName,
+        forEffect: voidContext,
+        isNullAware: isNullAware)
+      ..fileOffset = offset;
   }
 
   @override
   Expression doInvocation(
       int offset, List<TypeBuilder>? typeArguments, Arguments arguments,
       {bool isTypeArgumentsInForest = false}) {
-    VariableDeclarationImpl? receiverVariable;
-    Expression receiverExpression = receiver;
-    if (isNullAware) {
-      receiverVariable = _helper.createVariableDeclarationForValue(receiver);
-      receiverExpression = _helper.createVariableGet(
-          receiverVariable, receiverVariable.fileOffset,
-          forNullGuardedAccess: true);
-    }
-    Expression invocation;
-    if (invokeTarget != null) {
-      invocation = _helper.buildExtensionMethodInvocation(
-          fileOffset,
-          invokeTarget!,
-          _forest.createArgumentsForExtensionMethod(
-              fileOffset,
-              extensionTypeParameterCount,
-              invokeTarget!.function.typeParameters.length -
-                  extensionTypeParameterCount,
-              receiverExpression,
-              extensionTypeArguments: _createExtensionTypeArguments(),
-              extensionTypeArgumentOffset: extensionTypeArgumentOffset,
-              typeArguments: arguments.types,
-              positionalArguments: arguments.positional,
-              namedArguments: arguments.named),
-          isTearOff: false);
-    } else {
-      invocation = _helper.forest.createExpressionInvocation(
-          adjustForImplicitCall(_plainNameForRead, offset),
-          _createRead(receiverExpression),
-          arguments);
-    }
-    if (isNullAware) {
-      assert(receiverVariable != null);
-      return new NullAwareExtension(receiverVariable!, invocation)
+    Procedure? method = invokeTarget;
+    Procedure? getter = readTarget;
+    if (method != null) {
+      List<TypeParameter> typeParameters = method.function.typeParameters;
+      LocatedMessage? argMessage = _helper.checkArgumentsForFunction(
+          method.function, arguments, offset, typeParameters,
+          extension: extension);
+      if (argMessage != null) {
+        return _helper.buildUnresolvedError(targetName.text, offset,
+            arguments: arguments,
+            candidate: method,
+            message: argMessage,
+            kind: UnresolvedKind.Method);
+      }
+      return new ExtensionMethodInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: explicitTypeArguments,
+          receiver: receiver,
+          name: targetName,
+          target: method,
+          arguments: arguments as ArgumentsImpl,
+          isNullAware: isNullAware,
+          extensionTypeArgumentOffset: extensionTypeArgumentOffset)
+        ..fileOffset = fileOffset;
+    } else if (getter != null) {
+      return new ExtensionGetterInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: explicitTypeArguments,
+          receiver: receiver,
+          name: targetName,
+          target: getter,
+          arguments: arguments as ArgumentsImpl,
+          isNullAware: isNullAware,
+          extensionTypeArgumentOffset: extensionTypeArgumentOffset)
         ..fileOffset = fileOffset;
     } else {
-      return invocation;
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter);
     }
   }
 
@@ -2276,10 +2306,6 @@
         isNullAware: isNullAware);
   }
 
-  List<DartType> _createExtensionTypeArguments() {
-    return explicitTypeArguments ?? const <DartType>[];
-  }
-
   @override
   // Coverage-ignore(suite): Not run.
   String get _plainNameForRead => "[]";
@@ -2290,103 +2316,50 @@
 
   @override
   Expression buildSimpleRead() {
-    if (readTarget == null) {
+    Procedure? getter = readTarget;
+    if (getter == null) {
       // Coverage-ignore-block(suite): Not run.
       return _makeInvalidRead(unresolvedKind: UnresolvedKind.Method);
     }
-    VariableDeclarationImpl? variable;
-    Expression receiverValue;
-    if (isNullAware) {
-      variable = _helper.createVariableDeclarationForValue(receiver);
-      receiverValue = _helper.createVariableGet(variable, fileOffset,
-          forNullGuardedAccess: true);
-    } else {
-      receiverValue = receiver;
-    }
-    Expression result = _helper.buildExtensionMethodInvocation(
-        fileOffset,
-        readTarget!,
-        _forest.createArgumentsForExtensionMethod(
-            fileOffset, extensionTypeParameterCount, 0, receiverValue,
-            extensionTypeArguments: _createExtensionTypeArguments(),
-            extensionTypeArgumentOffset: extensionTypeArgumentOffset,
-            positionalArguments: <Expression>[index]),
-        isTearOff: false);
-    if (isNullAware) {
-      result = new NullAwareMethodInvocation(variable!, result)
-        ..fileOffset = fileOffset;
-    }
-    return result;
+    return new ExtensionIndexGet(
+        extension, explicitTypeArguments, receiver, getter, index,
+        isNullAware: isNullAware)
+      ..fileOffset = fileOffset;
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext = false}) {
-    if (writeTarget == null) {
+    Procedure? setter = writeTarget;
+    if (setter == null) {
       // Coverage-ignore-block(suite): Not run.
       return _makeInvalidWrite(value: value);
     }
-    VariableDeclarationImpl? variable;
-    Expression receiverValue;
-    if (isNullAware) {
-      variable = _helper.createVariableDeclarationForValue(receiver);
-      receiverValue = _helper.createVariableGet(variable, fileOffset,
-          forNullGuardedAccess: true);
-    } else {
-      receiverValue = receiver;
-    }
-    Expression result;
-    if (voidContext) {
-      result = _helper.buildExtensionMethodInvocation(
-          fileOffset,
-          writeTarget!,
-          _forest.createArgumentsForExtensionMethod(
-              fileOffset, extensionTypeParameterCount, 0, receiverValue,
-              extensionTypeArguments: _createExtensionTypeArguments(),
-              extensionTypeArgumentOffset: extensionTypeArgumentOffset,
-              positionalArguments: <Expression>[index, value]),
-          isTearOff: false);
-    } else {
-      result = new ExtensionIndexSet(extension, explicitTypeArguments,
-          receiverValue, writeTarget!, index, value)
-        ..fileOffset = fileOffset;
-    }
-    if (isNullAware) {
-      result = new NullAwareMethodInvocation(variable!, result)
-        ..fileOffset = fileOffset;
-    }
-    return result;
+    return new ExtensionIndexSet(
+        extension, explicitTypeArguments, receiver, setter, index, value,
+        isNullAware: isNullAware, forEffect: voidContext)
+      ..fileOffset = fileOffset;
   }
 
   @override
   Expression buildIfNullAssignment(Expression value, DartType type, int offset,
       {bool voidContext = false}) {
-    VariableDeclarationImpl? variable;
-    Expression receiverValue;
-    if (isNullAware) {
-      variable = _helper.createVariableDeclarationForValue(receiver);
-      receiverValue = _helper.createVariableGet(variable, fileOffset,
-          forNullGuardedAccess: true);
-    } else {
-      receiverValue = receiver;
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Member);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Member);
     }
-    Expression result = new IfNullExtensionIndexSet(
-        extension,
-        explicitTypeArguments,
-        receiverValue,
-        readTarget,
-        writeTarget,
-        index,
-        value,
+
+    return new ExtensionIfNullIndexSet(extension, explicitTypeArguments,
+        receiver, getter, setter, index, value,
         readOffset: fileOffset,
         testOffset: offset,
         writeOffset: fileOffset,
-        forEffect: voidContext)
+        forEffect: voidContext,
+        isNullAware: isNullAware)
       ..fileOffset = offset;
-    if (isNullAware) {
-      result = new NullAwareMethodInvocation(variable!, result)
-        ..fileOffset = fileOffset;
-    }
-    return result;
   }
 
   @override
@@ -2395,34 +2368,30 @@
       bool voidContext = false,
       bool isPreIncDec = false,
       bool isPostIncDec = false}) {
-    VariableDeclarationImpl? variable;
-    Expression receiverValue;
-    if (isNullAware) {
-      variable = _helper.createVariableDeclarationForValue(receiver);
-      receiverValue = _helper.createVariableGet(variable, fileOffset,
-          forNullGuardedAccess: true);
-    } else {
-      receiverValue = receiver;
+    Procedure? getter = readTarget;
+    Procedure? setter = writeTarget;
+    // Coverage-ignore(suite): Not run.
+    if (getter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Member);
+    } else if (setter == null) {
+      return _makeInvalidRead(unresolvedKind: UnresolvedKind.Member);
     }
-    Expression result = new CompoundExtensionIndexSet(
-        extension,
-        explicitTypeArguments,
-        receiverValue,
-        readTarget,
-        writeTarget,
-        index,
-        binaryOperator,
-        value,
+
+    return new ExtensionCompoundIndexSet(
+        extension: extension,
+        explicitTypeArguments: explicitTypeArguments,
+        receiver: receiver,
+        getter: getter,
+        setter: setter,
+        index: index,
+        binaryName: binaryOperator,
+        rhs: value,
         readOffset: fileOffset,
         binaryOffset: offset,
         writeOffset: fileOffset,
         forEffect: voidContext,
-        forPostIncDec: isPostIncDec);
-    if (isNullAware) {
-      result = new NullAwareMethodInvocation(variable!, result)
-        ..fileOffset = fileOffset;
-    }
-    return result;
+        forPostIncDec: isPostIncDec,
+        isNullAware: isNullAware);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/kernel/expression_generator_helper.dart
index 4c920a3..af60f01 100644
--- a/pkg/front_end/lib/src/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/kernel/expression_generator_helper.dart
@@ -95,10 +95,6 @@
       int charOffset = TreeNode.noOffset,
       required bool isConstructorInvocation});
 
-  Expression buildExtensionMethodInvocation(
-      int fileOffset, Procedure target, Arguments arguments,
-      {required bool isTearOff});
-
   Expression buildUnresolvedError(String name, int charOffset,
       {Member candidate,
       bool isSuper,
@@ -111,7 +107,8 @@
       bool errorHasBeenReported});
 
   LocatedMessage? checkArgumentsForFunction(FunctionNode function,
-      Arguments arguments, int offset, List<TypeParameter> typeParameters);
+      Arguments arguments, int offset, List<TypeParameter> typeParameters,
+      {Extension? extension});
 
   Expression wrapInDeferredCheck(
       Expression expression, PrefixBuilder prefix, int charOffset);
@@ -170,8 +167,7 @@
 
   /// Creates a [VariableGet] of the [variable] using [charOffset] as the file
   /// offset of the created node.
-  Expression createVariableGet(VariableDeclaration variable, int charOffset,
-      {bool forNullGuardedAccess = false});
+  Expression createVariableGet(VariableDeclaration variable, int charOffset);
 
   /// Registers that [variable] is assigned to.
   ///
diff --git a/pkg/front_end/lib/src/kernel/forest.dart b/pkg/front_end/lib/src/kernel/forest.dart
index c4c4530..7201ebe 100644
--- a/pkg/front_end/lib/src/kernel/forest.dart
+++ b/pkg/front_end/lib/src/kernel/forest.dart
@@ -52,28 +52,6 @@
     }
   }
 
-  Arguments createArgumentsForExtensionMethod(
-      int fileOffset,
-      int extensionTypeParameterCount,
-      int typeParameterCount,
-      Expression receiver,
-      {List<DartType> extensionTypeArguments = const <DartType>[],
-      int? extensionTypeArgumentOffset,
-      List<DartType> typeArguments = const <DartType>[],
-      List<Expression> positionalArguments = const <Expression>[],
-      List<NamedExpression> namedArguments = const <NamedExpression>[],
-      List<Object?>? argumentsOriginalOrder}) {
-    return new ArgumentsImpl.forExtensionMethod(
-        extensionTypeParameterCount, typeParameterCount, receiver,
-        extensionTypeArguments: extensionTypeArguments,
-        extensionTypeArgumentOffset: extensionTypeArgumentOffset,
-        typeArguments: typeArguments,
-        positionalArguments: positionalArguments,
-        namedArguments: namedArguments,
-        argumentsOriginalOrder: argumentsOriginalOrder)
-      ..fileOffset = fileOffset;
-  }
-
   ArgumentsImpl createArgumentsEmpty(int fileOffset) {
     return createArguments(fileOffset, <Expression>[]);
   }
@@ -731,8 +709,7 @@
   }
 
   VariableGet createVariableGet(int fileOffset, VariableDeclaration variable) {
-    return new VariableGetImpl(variable, forNullGuardedAccess: false)
-      ..fileOffset = fileOffset;
+    return new VariableGet(variable)..fileOffset = fileOffset;
   }
 
   EqualsExpression createEquals(
diff --git a/pkg/front_end/lib/src/kernel/internal_ast.dart b/pkg/front_end/lib/src/kernel/internal_ast.dart
index 904a458..7dab1a2 100644
--- a/pkg/front_end/lib/src/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/kernel/internal_ast.dart
@@ -428,6 +428,13 @@
         _extensionTypeArgumentOffset = null,
         super(positional, types: types, named: named);
 
+  ArgumentsImpl.empty()
+      : _explicitTypeArgumentCount = 0,
+        _extensionTypeArgumentOffset = -1,
+        _explicitExtensionTypeArgumentCount = 0,
+        _extensionTypeParameterCount = 0,
+        super.empty();
+
   ArgumentsImpl.forExtensionMethod(int extensionTypeParameterCount,
       int typeParameterCount, Expression receiver,
       {List<DartType> extensionTypeArguments = const <DartType>[],
@@ -632,7 +639,7 @@
     } else {
       printer.write('new ');
     }
-    printer.writeClassName(target.enclosingClass!.reference);
+    printer.writeClassName(target.enclosingClass?.reference);
     printer.writeTypeArguments(arguments.types);
     if (target.name.text.isNotEmpty) {
       printer.write('.');
@@ -941,68 +948,6 @@
   }
 }
 
-/// Internal expression representing a null-aware method invocation.
-///
-/// A null-aware method invocation of the form `a?.b(...)` is encoded as:
-///
-///     let v = a in v == null ? null : v.b(...)
-///
-class NullAwareMethodInvocation extends InternalExpression {
-  /// The synthetic variable whose initializer hold the receiver.
-  VariableDeclarationImpl variable;
-
-  /// The expression that invokes the method on [variable].
-  Expression invocation;
-
-  NullAwareMethodInvocation(this.variable, this.invocation) {
-    variable.parent = this;
-    invocation.parent = this;
-  }
-
-  @override
-  ExpressionInferenceResult acceptInference(
-      InferenceVisitorImpl visitor, DartType typeContext) {
-    return visitor.visitNullAwareMethodInvocation(this, typeContext);
-  }
-
-  @override
-  String toString() {
-    return "NullAwareMethodInvocation(${toStringInternal()})";
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void toTextInternal(AstPrinter printer) {
-    Expression methodInvocation = invocation;
-    if (methodInvocation is InstanceInvocation) {
-      Expression receiver = methodInvocation.receiver;
-      if (receiver is VariableGet && receiver.variable == variable) {
-        // Special-case the usual use of this node.
-        printer.writeExpression(variable.initializer!);
-        printer.write('?.');
-        printer.writeInterfaceMemberName(
-            methodInvocation.interfaceTargetReference, methodInvocation.name);
-        printer.writeArguments(methodInvocation.arguments);
-        return;
-      }
-    } else if (methodInvocation is DynamicInvocation) {
-      Expression receiver = methodInvocation.receiver;
-      if (receiver is VariableGet && receiver.variable == variable) {
-        // Special-case the usual use of this node.
-        printer.writeExpression(variable.initializer!);
-        printer.write('?.');
-        printer.writeName(methodInvocation.name);
-        printer.writeArguments(methodInvocation.arguments);
-        return;
-      }
-    }
-    printer.write('let ');
-    printer.writeVariableDeclaration(variable);
-    printer.write(' in null-aware ');
-    printer.writeExpression(methodInvocation);
-  }
-}
-
 /// Front end specific implementation of [ReturnStatement].
 class ReturnStatementImpl extends ReturnStatement {
   final bool isArrow;
@@ -1157,22 +1102,6 @@
   }
 }
 
-/// Front end specific implementation of [VariableGet].
-class VariableGetImpl extends VariableGet {
-  // TODO(johnniwinther): Remove the need for this by encoding all null aware
-  // expressions explicitly.
-  final bool forNullGuardedAccess;
-
-  VariableGetImpl(VariableDeclaration variable,
-      {required this.forNullGuardedAccess})
-      : super(variable);
-
-  @override
-  String toString() {
-    return "VariableGetImpl(${toStringInternal()})";
-  }
-}
-
 /// Front end specific implementation of [LoadLibrary].
 class LoadLibraryImpl extends LoadLibrary {
   final Arguments? arguments;
@@ -1340,6 +1269,171 @@
 ///
 /// An compound extension assignment of the form
 ///
+///     Extension(receiver).propertyName ??= rhs
+///
+/// is, if used for value, encoded as the expression:
+///
+///     let receiverVariable = receiver in
+///       let valueVariable =
+///           Extension|get#propertyName(receiverVariable) in
+///         valueVariable == null
+///           ? let rhsVariable = rhs in
+///             let writeVariable in
+///                 Extension|set#propertyName(receiverVariable, rhsVariable) in
+///               rhsVariable
+///           : valueVariable
+///
+/// and if used for effect as:
+///
+///     let receiverVariable = receiver in
+///       Extension|get#propertyName(receiverVariable) == null
+///         ? Extension|set#propertyName(receiverVariable, rhs)
+///         : null
+///
+class ExtensionIfNullSet extends InternalExpression {
+  /// The extension in which the [getter] and [setter] are declared.
+  final Extension extension;
+
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a ??= b` or
+  /// implied as in `a ??= b` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
+
+  /// The receiver used for the read/write operations.
+  Expression receiver;
+
+  /// The name of property.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name propertyName;
+
+  /// The member used for the read operation.
+  final Member getter;
+
+  /// The right-hand side of the binary operation.
+  Expression rhs;
+
+  /// The member used for the write operation.
+  final Member setter;
+
+  /// If `true`, the expression is only need for effect and not for its value.
+  final bool forEffect;
+
+  /// The file offset for the read operation.
+  final int readOffset;
+
+  /// The file offset for the binary operation.
+  final int binaryOffset;
+
+  /// The file offset for the write operation.
+  final int writeOffset;
+
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?.a ??= b`.
+  final bool isNullAware;
+
+  /// `true` if the extension access is explicit, i.e. `E(o).a ??= b` and
+  /// not implicit like `a ??= b` inside the extension `E`.
+  final bool _isExplicit;
+
+  ExtensionIfNullSet.explicit(
+      {required Extension extension,
+      required List<DartType>? explicitTypeArguments,
+      required Expression receiver,
+      required Name propertyName,
+      required Procedure getter,
+      required Expression rhs,
+      required Procedure setter,
+      required bool forEffect,
+      required int readOffset,
+      required int binaryOffset,
+      required int writeOffset,
+      required bool isNullAware})
+      : this._(extension, explicitTypeArguments, receiver, propertyName, getter,
+            rhs, setter,
+            forEffect: forEffect,
+            readOffset: readOffset,
+            binaryOffset: binaryOffset,
+            writeOffset: writeOffset,
+            isNullAware: isNullAware,
+            isExplicit: true);
+
+  ExtensionIfNullSet.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name propertyName,
+      required Procedure getter,
+      required Expression rhs,
+      required Procedure setter,
+      required bool forEffect,
+      required int readOffset,
+      required int binaryOffset,
+      required int writeOffset})
+      : this._(extension, thisTypeArguments, thisAccess, propertyName, getter,
+            rhs, setter,
+            forEffect: forEffect,
+            readOffset: readOffset,
+            binaryOffset: binaryOffset,
+            writeOffset: writeOffset,
+            isNullAware: false,
+            isExplicit: false);
+
+  ExtensionIfNullSet._(this.extension, this.knownTypeArguments, this.receiver,
+      this.propertyName, this.getter, this.rhs, this.setter,
+      {required this.forEffect,
+      required this.readOffset,
+      required this.binaryOffset,
+      required this.writeOffset,
+      required this.isNullAware,
+      required bool isExplicit})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
+    rhs.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitorImpl visitor, DartType typeContext) {
+    return visitor.visitExtensionIfNullSet(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(propertyName);
+    printer.write(' ??= ');
+    printer.writeExpression(rhs);
+  }
+
+  @override
+  String toString() {
+    return "ExtensionIfNullSet(${toStringInternal()})";
+  }
+}
+
+/// Internal expression representing an compound extension assignment.
+///
+/// An compound extension assignment of the form
+///
 ///     Extension(receiver).propertyName += rhs
 ///
 /// is, if used for value, encoded as the expression:
@@ -1357,24 +1451,25 @@
 ///         Extension|set#propertyName(receiverVariable,
 ///           Extension|get#propertyName(receiverVariable) + rhs)
 ///
-/// If [readOnlyReceiver] is `true` the [receiverVariable] is not created
-/// and the [receiver] is used directly.
-class CompoundExtensionSet extends InternalExpression {
-  /// The extension in which the [setter] is declared.
+class ExtensionCompoundSet extends InternalExpression {
+  /// The extension in which the [getter] and [setter] are declared.
   final Extension extension;
 
-  /// The explicit type arguments for the type parameters declared in
-  /// [extension].
-  final List<DartType>? explicitTypeArguments;
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a += b` or
+  /// implied as in `a += b` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
 
   /// The receiver used for the read/write operations.
   Expression receiver;
 
-  /// The name of the property accessed by the read/write operations.
+  /// The name of property.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
   final Name propertyName;
 
   /// The member used for the read operation.
-  final Member? getter;
+  final Member getter;
 
   /// The binary operation performed on the getter result and [rhs].
   final Name binaryName;
@@ -1383,7 +1478,7 @@
   Expression rhs;
 
   /// The member used for the write operation.
-  final Member? setter;
+  final Member setter;
 
   /// If `true`, the expression is only need for effect and not for its value.
   final bool forEffect;
@@ -1397,19 +1492,71 @@
   /// The file offset for the write operation.
   final int writeOffset;
 
-  CompoundExtensionSet(
-      this.extension,
-      this.explicitTypeArguments,
-      this.receiver,
-      this.propertyName,
-      this.getter,
-      this.binaryName,
-      this.rhs,
-      this.setter,
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?.a += b`.
+  final bool isNullAware;
+
+  /// `true` if the extension access is explicit, i.e. `E(o).a += b` and
+  /// not implicit like `a += b` inside the extension `E`.
+  final bool _isExplicit;
+
+  ExtensionCompoundSet.explicit(
+      {required Extension extension,
+      required List<DartType>? explicitTypeArguments,
+      required Expression receiver,
+      required Name propertyName,
+      required Procedure getter,
+      required Name binaryName,
+      required Expression rhs,
+      required Procedure setter,
+      required bool forEffect,
+      required int readOffset,
+      required int binaryOffset,
+      required int writeOffset,
+      required bool isNullAware})
+      : this._(extension, explicitTypeArguments, receiver, propertyName, getter,
+            binaryName, rhs, setter,
+            forEffect: forEffect,
+            readOffset: readOffset,
+            binaryOffset: binaryOffset,
+            writeOffset: writeOffset,
+            isNullAware: isNullAware,
+            isExplicit: true);
+
+  ExtensionCompoundSet.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name propertyName,
+      required Procedure getter,
+      required Name binaryName,
+      required Expression rhs,
+      required Procedure setter,
+      required bool forEffect,
+      required int readOffset,
+      required int binaryOffset,
+      required int writeOffset})
+      : this._(extension, thisTypeArguments, thisAccess, propertyName, getter,
+            binaryName, rhs, setter,
+            forEffect: forEffect,
+            readOffset: readOffset,
+            binaryOffset: binaryOffset,
+            writeOffset: writeOffset,
+            isNullAware: false,
+            isExplicit: false);
+
+  ExtensionCompoundSet._(this.extension, this.knownTypeArguments, this.receiver,
+      this.propertyName, this.getter, this.binaryName, this.rhs, this.setter,
       {required this.forEffect,
       required this.readOffset,
       required this.binaryOffset,
-      required this.writeOffset}) {
+      required this.writeOffset,
+      required this.isNullAware,
+      required bool isExplicit})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
     receiver.parent = this;
     rhs.parent = this;
   }
@@ -1417,12 +1564,37 @@
   @override
   ExpressionInferenceResult acceptInference(
       InferenceVisitorImpl visitor, DartType typeContext) {
-    return visitor.visitCompoundExtensionSet(this, typeContext);
+    return visitor.visitExtensionCompoundSet(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(propertyName);
+    printer.write(' ');
+    printer.writeName(binaryName);
+    printer.write('= ');
+    printer.writeExpression(rhs);
   }
 
   @override
   String toString() {
-    return "CompoundExtensionSet(${toStringInternal()})";
+    return "ExtensionCompoundSet(${toStringInternal()})";
   }
 }
 
@@ -1539,6 +1711,131 @@
   }
 }
 
+/// Internal expression representing an post-inc/dec expression on an explicit
+/// extension member access.
+///
+/// An post-inc/dec expression of the form `E(o).a++` is encoded as the
+/// expression:
+///
+///     let v1 = o in let v2 = E|a(v1) in let v3 = E|a(v1, v2 + 1) in v2
+///
+class ExtensionPostIncDec extends InternalExpression {
+  /// The extension in which the [getter] and [setter] are declared.
+  final Extension extension;
+
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a++` or
+  /// implied as in `a++` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
+
+  /// The receiver used for the read/write operations.
+  final Expression receiver;
+
+  /// The name of property.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered methods.
+  final Name name;
+
+  /// The [Procedure] used for the read of the property.
+  final Procedure getter;
+
+  /// The [Procedure] used for the write of the property.
+  final Procedure setter;
+
+  /// `true` if this is a post increment expression, i.e. `E(o).a++` as opposed
+  /// to `E(o).a--`.
+  final bool isInc;
+
+  /// `true` if the expression is for effect only, i.e. that the resulting value
+  /// is not used.
+  final bool forEffect;
+
+  /// `true` if the access is null-aware, i.e. of the form `E(o)?.b++`.
+  final bool isNullAware;
+
+  /// `true` if this an explicit extension access, i.e. `E(o).a++` as opposed
+  /// to the implicit access of `a++` occurring within the extension `E`.
+  final bool _isExplicit;
+
+  ExtensionPostIncDec.explicit(
+      {required Extension extension,
+      required List<DartType>? explicitTypeArguments,
+      required Expression receiver,
+      required Name name,
+      required Procedure getter,
+      required Procedure setter,
+      required bool isInc,
+      required bool forEffect,
+      required isNullAware})
+      : this._(extension, explicitTypeArguments, receiver, name, getter, setter,
+            isInc: isInc,
+            forEffect: forEffect,
+            isNullAware: isNullAware,
+            isExplicit: true);
+
+  ExtensionPostIncDec.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name name,
+      required Procedure getter,
+      required Procedure setter,
+      required bool isInc,
+      required bool forEffect})
+      : this._(extension, thisTypeArguments, thisAccess, name, getter, setter,
+            isInc: isInc,
+            forEffect: forEffect,
+            isNullAware: false,
+            isExplicit: false);
+
+  ExtensionPostIncDec._(this.extension, this.knownTypeArguments, this.receiver,
+      this.name, this.getter, this.setter,
+      {required bool this.isInc,
+      required this.forEffect,
+      required this.isNullAware,
+      required bool isExplicit})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            // Coverage-ignore(suite): Not run.
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitorImpl visitor, DartType typeContext) {
+    return visitor.visitExtensionPostIncDec(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(name);
+    printer.write(isInc ? '++' : '--');
+  }
+
+  @override
+  String toString() {
+    return "ExtensionPostIncDec(${toStringInternal()})";
+  }
+}
+
 /// Internal expression representing an local variable post inc/dec expression.
 ///
 /// An local variable post inc/dec expression of the form `a++` is encoded as
@@ -1745,21 +2042,87 @@
   }
 }
 
+/// Internal expression representing an extension index get expression.
+///
+/// An extension index set expression of the form `Extension(o)[a]` used
+/// for value is encoded as the expression:
+///
+///     Extension|[](o, a)
+///
+/// using [StaticInvocation].
+///
+class ExtensionIndexGet extends InternalExpression {
+  /// The extension in which the [getter] is declared.
+  final Extension extension;
+
+  /// The explicit type arguments for the type parameters declared in
+  /// [extension].
+  final List<DartType>? explicitTypeArguments;
+
+  /// The receiver of the extension access.
+  Expression receiver;
+
+  /// The [] procedure.
+  Procedure getter;
+
+  /// The index expression of the operation.
+  Expression index;
+
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?[a]`.
+  final bool isNullAware;
+
+  ExtensionIndexGet(this.extension, this.explicitTypeArguments, this.receiver,
+      this.getter, this.index, {required this.isNullAware})
+      : assert(explicitTypeArguments == null ||
+            explicitTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
+    index.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitorImpl visitor, DartType typeContext) {
+    return visitor.visitExtensionIndexGet(this, typeContext);
+  }
+
+  @override
+  String toString() {
+    return "ExtensionIndexGet(${toStringInternal()})";
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.write(extension.name);
+    if (explicitTypeArguments != null) {
+      printer.writeTypeArguments(explicitTypeArguments!);
+    }
+    printer.write('(');
+    printer.writeExpression(receiver);
+    printer.write(')');
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('[');
+    printer.writeExpression(index);
+    printer.write(']');
+  }
+}
+
 /// Internal expression representing an extension index set expression.
 ///
 /// An extension index set expression of the form `Extension(o)[a] = b` used
 /// for value is encoded as the expression:
 ///
-///     let receiverVariable = o
-///     let indexVariable = a in
 ///     let valueVariable = b in '
 ///     let writeVariable =
-///         receiverVariable.[]=(indexVariable, valueVariable) in
+///         Extension|[]=(o, a, valueVariable) in
 ///           valueVariable
 ///
 /// An extension index set expression used for effect is encoded as
 ///
-///    o.[]=(a, b)
+///    Extension|[]=(o, a, b)
 ///
 /// using [StaticInvocation].
 ///
@@ -1774,8 +2137,8 @@
   /// The receiver of the extension access.
   Expression receiver;
 
-  /// The []= member.
-  Member setter;
+  /// The []= procedure.
+  Procedure setter;
 
   /// The index expression of the operation.
   Expression index;
@@ -1783,8 +2146,16 @@
   /// The value expression of the operation.
   Expression value;
 
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?[a] = b`.
+  final bool isNullAware;
+
+  /// If `true`, the expression is only need for effect and not for its value.
+  final bool forEffect;
+
   ExtensionIndexSet(this.extension, this.explicitTypeArguments, this.receiver,
-      this.setter, this.index, this.value)
+      this.setter, this.index, this.value,
+      {required this.isNullAware, required this.forEffect})
       : assert(explicitTypeArguments == null ||
             explicitTypeArguments.length == extension.typeParameters.length) {
     receiver.parent = this;
@@ -1812,7 +2183,11 @@
     }
     printer.write('(');
     printer.writeExpression(receiver);
-    printer.write(')[');
+    printer.write(')');
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('[');
     printer.writeExpression(index);
     printer.write('] = ');
     printer.writeExpression(value);
@@ -1955,9 +2330,9 @@
   }
 }
 
-/// Internal expression representing an if-null super index set expression.
+/// Internal expression representing an if-null extension index set expression.
 ///
-/// An if-null super index set expression of the form `super[a] ??= b` is, if
+/// An if-null super index set expression of the form `E(o)[a] ??= b` is, if
 /// used for value, encoded as the expression:
 ///
 ///     let v1 = a in
@@ -1974,19 +2349,23 @@
 ///     let v2 = super.[](v1) in
 ///        v2 == null ? super.[]=(v1, b) : null
 ///
-class IfNullExtensionIndexSet extends InternalExpression {
+class ExtensionIfNullIndexSet extends InternalExpression {
+  /// The extension in which the [getter] and [setter] are declared.
   final Extension extension;
 
-  final List<DartType>? explicitTypeArguments;
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a()` or
+  /// implied as in `a()` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
 
   /// The extension receiver;
   Expression receiver;
 
   /// The [] member;
-  Member? getter;
+  Member getter;
 
   /// The []= member;
-  Member? setter;
+  Member setter;
 
   /// The index expression of the operation.
   Expression index;
@@ -2006,14 +2385,19 @@
   /// If `true`, the expression is only need for effect and not for its value.
   final bool forEffect;
 
-  IfNullExtensionIndexSet(this.extension, this.explicitTypeArguments,
+  /// `true` if the invocation is null-aware, i.e. of the form
+  /// `E(o)?[a] ??= b`.
+  final bool isNullAware;
+
+  ExtensionIfNullIndexSet(this.extension, this.knownTypeArguments,
       this.receiver, this.getter, this.setter, this.index, this.value,
       {required this.readOffset,
       required this.testOffset,
       required this.writeOffset,
-      required this.forEffect})
-      : assert(explicitTypeArguments == null ||
-            explicitTypeArguments.length == extension.typeParameters.length) {
+      required this.forEffect,
+      required this.isNullAware})
+      : assert(knownTypeArguments == null ||
+            knownTypeArguments.length == extension.typeParameters.length) {
     receiver.parent = this;
     index.parent = this;
     value.parent = this;
@@ -2022,12 +2406,12 @@
   @override
   ExpressionInferenceResult acceptInference(
       InferenceVisitorImpl visitor, DartType typeContext) {
-    return visitor.visitIfNullExtensionIndexSet(this, typeContext);
+    return visitor.visitExtensionIfNullIndexSet(this, typeContext);
   }
 
   @override
   String toString() {
-    return "IfNullExtensionIndexSet(${toStringInternal()})";
+    return "ExtensionIfNullIndexSet(${toStringInternal()})";
   }
 }
 
@@ -2323,18 +2707,22 @@
 ///         receiverVariable.[]=(indexVariable,
 ///             receiverVariable.[](indexVariable) + b)
 ///
-class CompoundExtensionIndexSet extends InternalExpression {
+class ExtensionCompoundIndexSet extends InternalExpression {
+  /// The extension in which the [getter] and [setter] are declared.
   final Extension extension;
 
+  /// The explicit type arguments for the type parameters declared in
+  /// [extension], if provided.
   final List<DartType>? explicitTypeArguments;
 
+  /// The receiver used for the read/write operations.
   Expression receiver;
 
   /// The [] member.
-  Member? getter;
+  Member getter;
 
   /// The []= member.
-  Member? setter;
+  Member setter;
 
   /// The index expression of the operation.
   Expression index;
@@ -2360,20 +2748,25 @@
   /// If `true`, the expression is a post-fix inc/dec expression.
   final bool forPostIncDec;
 
-  CompoundExtensionIndexSet(
-      this.extension,
-      this.explicitTypeArguments,
-      this.receiver,
-      this.getter,
-      this.setter,
-      this.index,
-      this.binaryName,
-      this.rhs,
-      {required this.readOffset,
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?[a] += b`.
+  final bool isNullAware;
+
+  ExtensionCompoundIndexSet(
+      {required this.extension,
+      required this.explicitTypeArguments,
+      required this.receiver,
+      required this.getter,
+      required this.setter,
+      required this.index,
+      required this.binaryName,
+      required this.rhs,
+      required this.readOffset,
       required this.binaryOffset,
       required this.writeOffset,
       required this.forEffect,
-      required this.forPostIncDec})
+      required this.forPostIncDec,
+      required this.isNullAware})
       : assert(explicitTypeArguments == null ||
             explicitTypeArguments.length == extension.typeParameters.length) {
     receiver.parent = this;
@@ -2385,12 +2778,136 @@
   @override
   ExpressionInferenceResult acceptInference(
       InferenceVisitorImpl visitor, DartType typeContext) {
-    return visitor.visitCompoundExtensionIndexSet(this, typeContext);
+    return visitor.visitExtensionCompoundIndexSet(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.write(extension.name);
+    if (explicitTypeArguments != null) {
+      printer.writeTypeArguments(explicitTypeArguments!);
+    }
+    printer.write('(');
+    printer.writeExpression(receiver);
+    printer.write(')');
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('[');
+    printer.writeExpression(index);
+    printer.write(']');
+    if (forPostIncDec) {
+      printer.write(binaryName == plusName ? '++' : '--');
+    } else {
+      printer.write(' ');
+      printer.writeName(binaryName);
+      printer.write('= ');
+      printer.writeExpression(rhs);
+    }
   }
 
   @override
   String toString() {
-    return "CompoundExtensionIndexSet(${toStringInternal()})";
+    return "ExtensionCompoundIndexSet(${toStringInternal()})";
+  }
+}
+
+/// Internal expression representing a read of an explicit extension getter,
+/// for instance `E(o).a` or `a` from within the extension `E`.
+///
+/// An extension get of the form `E(o).a` is encoded as the static
+/// invocation:
+///
+///     E|a(o)
+///
+class ExtensionGet extends InternalExpression {
+  /// The extension in which the [getter] is declared.
+  final Extension extension;
+
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a` or
+  /// implied as in `a` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
+
+  /// The receiver for the read.
+  Expression receiver;
+
+  /// The name of getter.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name name;
+
+  /// The extension member called for the assignment.
+  Procedure getter;
+
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?.a`.
+  final bool isNullAware;
+
+  /// `true` if the extension access is explicit, i.e. `E(o).a` and
+  /// not implicit like `a` inside the extension `E`.
+  final bool _isExplicit;
+
+  ExtensionGet.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name name,
+      required Procedure getter})
+      : this._(extension, thisTypeArguments, thisAccess, name, getter,
+            isNullAware: false, isExplicit: false);
+
+  ExtensionGet.explicit(
+      {required Extension extension,
+      required List<DartType>? explicitTypeArguments,
+      required Expression receiver,
+      required Name name,
+      required Procedure getter,
+      required bool isNullAware})
+      : this._(extension, explicitTypeArguments, receiver, name, getter,
+            isNullAware: isNullAware, isExplicit: true);
+
+  ExtensionGet._(this.extension, this.knownTypeArguments, this.receiver,
+      this.name, this.getter,
+      {required this.isNullAware, required bool isExplicit})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitorImpl visitor, DartType typeContext) {
+    return visitor.visitExtensionGet(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(name);
+  }
+
+  @override
+  String toString() {
+    return "ExtensionGet(${toStringInternal()})";
   }
 }
 
@@ -2416,15 +2933,24 @@
 ///
 // TODO(johnniwinther): Rename read-only to side-effect-free.
 class ExtensionSet extends InternalExpression {
+  /// The extension in which the [setter] is declared.
   final Extension extension;
 
-  final List<DartType>? explicitTypeArguments;
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a = b` or
+  /// implied as in `a = b` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
 
   /// The receiver for the assignment.
   Expression receiver;
 
+  /// The name of setter.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name name;
+
   /// The extension member called for the assignment.
-  Procedure target;
+  Procedure setter;
 
   /// The right-hand side value of the assignment.
   Expression value;
@@ -2433,10 +2959,46 @@
   /// value.
   final bool forEffect;
 
-  ExtensionSet(this.extension, this.explicitTypeArguments, this.receiver,
-      this.target, this.value, {required this.forEffect})
-      : assert(explicitTypeArguments == null ||
-            explicitTypeArguments.length == extension.typeParameters.length) {
+  /// `true` if the access is null-aware, i.e. of the form
+  /// `Extension(o)?.a = b`.
+  final bool isNullAware;
+
+  /// `true` if the extension access is explicit, i.e. `E(o).a = b` and
+  /// not implicit like `a = b` inside the extension `E`.
+  final bool _isExplicit;
+
+  ExtensionSet.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name name,
+      required Procedure setter,
+      required Expression value,
+      required bool forEffect})
+      : this._(extension, thisTypeArguments, thisAccess, name, setter, value,
+            forEffect: forEffect, isNullAware: false, isExplicit: false);
+
+  ExtensionSet.explicit(
+      {required Extension extension,
+      required List<DartType>? explicitTypeArguments,
+      required Expression receiver,
+      required Name name,
+      required Procedure setter,
+      required Expression value,
+      required bool forEffect,
+      required bool isNullAware})
+      : this._(extension, explicitTypeArguments, receiver, name, setter, value,
+            forEffect: forEffect, isNullAware: isNullAware, isExplicit: true);
+
+  ExtensionSet._(this.extension, this.knownTypeArguments, this.receiver,
+      this.name, this.setter, this.value,
+      {required this.forEffect,
+      required this.isNullAware,
+      required bool isExplicit})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
     receiver.parent = this;
     value.parent = this;
   }
@@ -2448,71 +3010,360 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(name);
+    printer.write(' = ');
+    printer.writeExpression(value);
+  }
+
+  @override
   String toString() {
     return "ExtensionSet(${toStringInternal()})";
   }
 }
 
-/// Internal expression representing an null-aware extension expression.
+/// Internal expression representing an invocation of an extension method.
 ///
-/// An null-aware extension expression of the form `Extension(receiver)?.target`
-/// is encoded as the expression:
+/// An extension get of the form `receiver.target(arguments)` is encoded as the
+/// static invocation:
 ///
-///     let variable = receiver in
-///       variable == null ? null : expression
+///     target(receiver, arguments)
 ///
-/// where `expression` is an encoding of `receiverVariable.target`.
-class NullAwareExtension extends InternalExpression {
-  VariableDeclarationImpl variable;
-  Expression expression;
+class ExtensionMethodInvocation extends InternalExpression {
+  /// The extension in which the [method] is declared.
+  final Extension extension;
 
-  NullAwareExtension(this.variable, this.expression) {
-    variable.parent = this;
-    expression.parent = this;
-  }
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a()` or
+  /// implied as in `a()` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
 
-  @override
-  ExpressionInferenceResult acceptInference(
-      InferenceVisitorImpl visitor, DartType typeContext) {
-    return visitor.visitNullAwareExtension(this, typeContext);
-  }
+  /// The receiver for the invocation.
+  Expression receiver;
 
-  @override
-  String toString() {
-    return "NullAwareExtension(${toStringInternal()})";
-  }
-}
+  /// The name of method.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name name;
 
-/// Internal representation of a read of an extension instance member.
-///
-/// A read of an extension instance member `o.foo` is encoded as the
-/// [StaticInvocation]
-///
-///     extension|foo(o)
-///
-/// where `extension|foo` is the top level method created for reading the
-/// `foo` member. If `foo` is an extension instance method, then `extension|foo`
-/// the special tear-off function created for extension instance methods.
-/// Otherwise `extension|foo` is the top level method corresponding to the
-/// extension instance getter being read.
-class ExtensionTearOff extends InternalExpression {
-  /// The top-level method that is that target for the read operation.
-  Procedure target;
+  /// The extension method called for the assignment.
+  Procedure method;
 
-  /// The arguments provided to the top-level method.
-  Arguments arguments;
+  /// The arguments provided to the method.
+  ArgumentsImpl arguments;
 
-  ExtensionTearOff(this.target, this.arguments) {
+  /// `true` if the extension access is explicit, i.e. `E(o).a()` and
+  /// not implicit like `a()` inside the extension `E`.
+  final bool _isExplicit;
+
+  /// `true` if the invocation is null-aware, i.e. of the form
+  /// `Extension(o)?.a()`.
+  final bool isNullAware;
+
+  final int extensionTypeArgumentOffset;
+
+  ExtensionMethodInvocation.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name name,
+      required Procedure target,
+      required ArgumentsImpl arguments})
+      : this._(extension, thisAccess, name, target, arguments,
+            isExplicit: false,
+            knownTypeArguments: thisTypeArguments,
+            extensionTypeArgumentOffset: -1,
+            isNullAware: false);
+
+  ExtensionMethodInvocation.explicit(
+      {required Extension extension,
+      required Expression receiver,
+      required Name name,
+      required Procedure target,
+      required ArgumentsImpl arguments,
+      required List<DartType>? explicitTypeArguments,
+      required int extensionTypeArgumentOffset,
+      required bool isNullAware})
+      : this._(extension, receiver, name, target, arguments,
+            isExplicit: true,
+            knownTypeArguments: explicitTypeArguments,
+            extensionTypeArgumentOffset: extensionTypeArgumentOffset,
+            isNullAware: isNullAware);
+
+  ExtensionMethodInvocation._(
+      this.extension, this.receiver, this.name, this.method, this.arguments,
+      {required this.knownTypeArguments,
+      required bool isExplicit,
+      required this.isNullAware,
+      required this.extensionTypeArgumentOffset})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
     arguments.parent = this;
   }
 
   @override
   ExpressionInferenceResult acceptInference(
       InferenceVisitorImpl visitor, DartType typeContext) {
+    return visitor.visitExtensionMethodInvocation(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(name);
+    printer.writeArguments(arguments);
+  }
+
+  @override
+  String toString() {
+    return "ExtensionMethodInvocation(${toStringInternal()})";
+  }
+}
+
+/// Internal expression representing an invocation of an explicit extension
+/// method, for instance `E(o).a()` or `a()` from within the extension `E`.
+///
+/// An extension get of the form `E(o).a(b)` is encoded as the static
+/// invocation:
+///
+///     E|a(o, b)
+///
+class ExtensionGetterInvocation extends InternalExpression {
+  /// The extension in which the [getter] is declared.
+  final Extension extension;
+
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a()` or
+  /// implied as in `a()` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
+
+  /// The receiver for the invocation.
+  Expression receiver;
+
+  /// The name of getter.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name name;
+
+  /// The extension getter called for the assignment.
+  Procedure getter;
+
+  /// The arguments provided to the getter.
+  ArgumentsImpl arguments;
+
+  /// `true` if the extension access is explicit, i.e. `E(o).a()` and
+  /// not implicit like `a()` inside the extension `E`.
+  final bool _isExplicit;
+
+  /// `true` if the invocation is null-aware, i.e. of the form
+  /// `Extension(o)?.a()`.
+  final bool isNullAware;
+
+  final int extensionTypeArgumentOffset;
+
+  ExtensionGetterInvocation.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name name,
+      required Procedure target,
+      required ArgumentsImpl arguments})
+      : this._(extension, thisAccess, name, target, arguments,
+            isExplicit: false,
+            knownTypeArguments: thisTypeArguments,
+            extensionTypeArgumentOffset: -1,
+            isNullAware: false);
+
+  ExtensionGetterInvocation.explicit(
+      {required Extension extension,
+      required Expression receiver,
+      required Name name,
+      required Procedure target,
+      required ArgumentsImpl arguments,
+      required List<DartType>? explicitTypeArguments,
+      required int extensionTypeArgumentOffset,
+      required bool isNullAware})
+      : this._(extension, receiver, name, target, arguments,
+            isExplicit: true,
+            knownTypeArguments: explicitTypeArguments,
+            extensionTypeArgumentOffset: extensionTypeArgumentOffset,
+            isNullAware: isNullAware);
+
+  ExtensionGetterInvocation._(
+      this.extension, this.receiver, this.name, this.getter, this.arguments,
+      {required this.knownTypeArguments,
+      required bool isExplicit,
+      required this.isNullAware,
+      required this.extensionTypeArgumentOffset})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
+    arguments.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitorImpl visitor, DartType typeContext) {
+    return visitor.visitExtensionGetterInvocation(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(name);
+    printer.writeArguments(arguments);
+  }
+
+  @override
+  String toString() {
+    return "ExtensionGetterInvocation(${toStringInternal()})";
+  }
+}
+
+/// Internal representation of a tear-foo of an extension instance method.
+///
+/// A tear-off of an extension instance member `o.foo()` is encoded as the
+/// [StaticInvocation]
+///
+///     extension|get#foo(o)
+///
+/// where `extension|get#foo` is the top level method created for tearing off
+/// the `foo` method.
+class ExtensionTearOff extends InternalExpression {
+  /// The extension in which the [method] is declared.
+  final Extension extension;
+
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a` or
+  /// implied as in `a` from within the extension `E`.
+  final List<DartType>? knownTypeArguments;
+
+  /// The receiver for the tear-off.
+  Expression receiver;
+
+  /// The name of method.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name name;
+
+  /// The top-level method that is that target for the read operation.
+  Procedure tearOff;
+
+  /// `true` if the access is null-aware, i.e. of the form `Extension(o)?.a`.
+  final bool isNullAware;
+
+  /// `true` if the extension access is explicit, i.e. `E(o).a` and
+  /// not implicit like `a` inside the extension `E`.
+  final bool _isExplicit;
+
+  ExtensionTearOff.implicit(
+      {required Extension extension,
+      required List<DartType>? thisTypeArguments,
+      required Expression thisAccess,
+      required Name name,
+      required Procedure tearOff})
+      : this._(extension, thisTypeArguments, thisAccess, name, tearOff,
+            isNullAware: false, isExplicit: false);
+
+  ExtensionTearOff.explicit(
+      {required Extension extension,
+      required List<DartType>? explicitTypeArguments,
+      required Expression receiver,
+      required Name name,
+      required Procedure tearOff,
+      required bool isNullAware})
+      : this._(extension, explicitTypeArguments, receiver, name, tearOff,
+            isNullAware: isNullAware, isExplicit: true);
+
+  ExtensionTearOff._(this.extension, this.knownTypeArguments, this.receiver,
+      this.name, this.tearOff,
+      {required this.isNullAware, required bool isExplicit})
+      : _isExplicit = isExplicit,
+        assert(knownTypeArguments == null ||
+            extension.typeParameters.isNotEmpty &&
+                knownTypeArguments.length == extension.typeParameters.length) {
+    receiver.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+      InferenceVisitorImpl visitor, DartType typeContext) {
     return visitor.visitExtensionTearOff(this, typeContext);
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (_isExplicit) {
+      printer.write(extension.name);
+      if (knownTypeArguments != null) {
+        printer.writeTypeArguments(knownTypeArguments!);
+      }
+      printer.write('(');
+      printer.writeExpression(receiver);
+      printer.write(')');
+    } else {
+      printer.writeExpression(receiver);
+    }
+    if (isNullAware) {
+      printer.write('?');
+    }
+    printer.write('.');
+    printer.writeName(name);
+  }
+
+  @override
   String toString() {
     return "ExtensionTearOff(${toStringInternal()})";
   }
diff --git a/pkg/front_end/lib/src/source/source_library_builder.dart b/pkg/front_end/lib/src/source/source_library_builder.dart
index 376b5ad..86b2087 100644
--- a/pkg/front_end/lib/src/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/source/source_library_builder.dart
@@ -1446,6 +1446,7 @@
 
   void checkBoundsInStaticInvocation(
       StaticInvocation node,
+      Name targetName,
       TypeEnvironment typeEnvironment,
       Uri fileUri,
       TypeArgumentsInfo typeArgumentsInfo) {
@@ -1475,11 +1476,10 @@
         targetReceiver =
             new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
       }
-      String targetName = node.target.name.text;
       _reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
           typeArgumentsInfo: typeArgumentsInfo,
           targetReceiver: targetReceiver,
-          targetName: targetName);
+          targetName: targetName.text);
     }
   }
 
diff --git a/pkg/front_end/lib/src/type_inference/for_in.dart b/pkg/front_end/lib/src/type_inference/for_in.dart
index 5f67c57..4e889ba 100644
--- a/pkg/front_end/lib/src/type_inference/for_in.dart
+++ b/pkg/front_end/lib/src/type_inference/for_in.dart
@@ -248,13 +248,17 @@
 
   @override
   DartType computeElementType(InferenceVisitorBase visitor) {
+    DartType receiverContextType =
+        visitor.computeExplicitExtensionReceiverContextType(
+            extensionSet.extension, extensionSet.knownTypeArguments);
+
     ExpressionInferenceResult receiverResult = visitor.inferExpression(
-        extensionSet.receiver, const UnknownType(),
+        extensionSet.receiver, receiverContextType,
         isVoidAllowed: false);
 
     List<DartType> extensionTypeArguments =
         visitor.computeExtensionTypeArgument(extensionSet.extension,
-            extensionSet.explicitTypeArguments, receiverResult.inferredType,
+            extensionSet.knownTypeArguments, receiverResult.inferredType,
             treeNodeForTesting: extensionSet);
 
     DartType receiverType = visitor.getExtensionReceiverType(
@@ -262,7 +266,7 @@
 
     ObjectAccessTarget target = new ExtensionAccessTarget(
         receiverType,
-        extensionSet.target,
+        extensionSet.setter,
         null,
         ClassMemberKind.Setter,
         extensionTypeArguments);
diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart
index 365b74f..4ff4f42 100644
--- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart
@@ -1175,42 +1175,132 @@
 
   ExpressionInferenceResult visitExtensionTearOff(
       ExtensionTearOff node, DartType typeContext) {
-    FunctionType calleeType =
-        node.target.function.computeFunctionType(Nullability.nonNullable);
-    TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
-    InvocationInferenceResult result = inferInvocation(
-        this,
-        typeContext,
-        node.fileOffset,
-        new InvocationTargetFunctionType(calleeType),
-        node.arguments as ArgumentsImpl,
-        staticTarget: node.target);
-    StaticInvocation replacement =
-        new StaticInvocation(node.target, node.arguments);
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.tearOff, null, ClassMemberKind.Method, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    StaticInvocation replacement = createStaticInvocation(
+        node.tearOff,
+        new Arguments([receiver], types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
     libraryBuilder.checkBoundsInStaticInvocation(
-        replacement, typeSchemaEnvironment, helper.uri, typeArgumentsInfo);
+        replacement,
+        node.name,
+        typeSchemaEnvironment,
+        helper.uri,
+        node.knownTypeArguments != null
+            ? const NoneInferredTypeArgumentsInfo()
+            : const AllInferredTypeArgumentsInfo());
+
     return instantiateTearOff(
-        result.inferredType, typeContext, result.applyResult(replacement));
+        target.getReturnType(this), typeContext, replacement);
+  }
+
+  ExpressionInferenceResult visitExtensionGet(
+      ExtensionGet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.getter, null, ClassMemberKind.Getter, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    DartType resultType = target.getGetterType(this);
+
+    StaticInvocation replacement = createStaticInvocation(
+        node.getter,
+        new Arguments([receiver], types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
+    libraryBuilder.checkBoundsInStaticInvocation(
+        replacement,
+        node.name,
+        typeSchemaEnvironment,
+        helper.uri,
+        node.knownTypeArguments != null
+            ? const NoneInferredTypeArgumentsInfo()
+            : const AllInferredTypeArgumentsInfo());
+
+    return new ExpressionInferenceResult(resultType, replacement);
   }
 
   ExpressionInferenceResult visitExtensionSet(
       ExtensionSet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
     ExpressionInferenceResult receiverResult = inferExpression(
-        node.receiver, const UnknownType(),
+        node.receiver, receiverContextType,
         isVoidAllowed: false);
 
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
     List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
-        node.extension, node.explicitTypeArguments, receiverResult.inferredType,
+        node.extension, node.knownTypeArguments, receiverType,
         treeNodeForTesting: node);
-
-    DartType receiverType =
+    DartType extensionOnType =
         getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.setter, null, ClassMemberKind.Setter, extensionTypeArguments);
 
-    Expression receiver =
-        ensureAssignableResult(receiverType, receiverResult).expression;
-
-    ObjectAccessTarget target = new ExtensionAccessTarget(receiverType,
-        node.target, null, ClassMemberKind.Setter, extensionTypeArguments);
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
 
     DartType valueType = target.getSetterType(this);
 
@@ -1234,12 +1324,21 @@
       receiverVariable = createVariable(receiver, receiverResult.inferredType);
       receiver = createVariableGet(receiverVariable);
     }
-    Expression assignment = new StaticInvocation(
-        node.target,
-        new Arguments(<Expression>[receiver, value],
-            types: extensionTypeArguments)
-          ..fileOffset = node.fileOffset)
-      ..fileOffset = node.fileOffset;
+
+    StaticInvocation assignment = createStaticInvocation(
+        node.setter,
+        new Arguments([receiver, value], types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
+    libraryBuilder.checkBoundsInStaticInvocation(
+        assignment,
+        node.name,
+        typeSchemaEnvironment,
+        helper.uri,
+        node.knownTypeArguments != null
+            ? const NoneInferredTypeArgumentsInfo()
+            : const AllInferredTypeArgumentsInfo());
 
     Expression replacement;
     if (node.forEffect) {
@@ -1260,27 +1359,38 @@
     return new ExpressionInferenceResult(valueResult.inferredType, replacement);
   }
 
-  ExpressionInferenceResult visitCompoundExtensionSet(
-      CompoundExtensionSet node, DartType typeContext) {
+  ExpressionInferenceResult visitExtensionPostIncDec(
+      ExtensionPostIncDec node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
     ExpressionInferenceResult receiverResult = inferExpression(
-        node.receiver, const UnknownType(),
+        node.receiver, receiverContextType,
         isVoidAllowed: false);
 
-    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
-        node.extension, node.explicitTypeArguments, receiverResult.inferredType,
-        treeNodeForTesting: node);
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
 
-    DartType receiverType =
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+    DartType extensionOnType =
         getExtensionReceiverType(node.extension, extensionTypeArguments);
 
-    Expression receiver =
-        ensureAssignableResult(receiverType, receiverResult).expression;
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
 
     VariableDeclaration? receiverVariable;
     Expression readReceiver;
     Expression writeReceiver;
     if (isPureExpression(receiver)) {
-      // Coverage-ignore-block(suite): Not run.
       readReceiver = receiver;
       writeReceiver = clonePureExpression(receiver);
     } else {
@@ -1289,34 +1399,358 @@
       writeReceiver = createVariableGet(receiverVariable);
     }
 
-    ObjectAccessTarget readTarget = node.getter == null
-        ? const ObjectAccessTarget.missing()
-        : new ExtensionAccessTarget(receiverType, node.getter!, null,
-            ClassMemberKind.Getter, extensionTypeArguments);
+    ObjectAccessTarget readTarget = new ExtensionAccessTarget(extensionOnType,
+        node.getter, null, ClassMemberKind.Getter, extensionTypeArguments);
+    ObjectAccessTarget writeTarget = new ExtensionAccessTarget(extensionOnType,
+        node.setter, null, ClassMemberKind.Setter, extensionTypeArguments);
+
+    StaticInvocation read = createStaticInvocation(
+        node.getter,
+        new Arguments([readReceiver], types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
+    libraryBuilder.checkBoundsInStaticInvocation(
+        read,
+        node.name,
+        typeSchemaEnvironment,
+        helper.uri,
+        node.knownTypeArguments != null
+            ? const NoneInferredTypeArgumentsInfo()
+            : const AllInferredTypeArgumentsInfo());
+
+    Expression value = read;
+
+    DartType readType = readTarget.getGetterType(this);
+    DartType valueType = writeTarget.getSetterType(this);
+
+    VariableDeclaration? valueVariable;
+    if (node.forEffect) {
+      // No need for value variable.
+    } else {
+      valueVariable = createVariable(value, valueType);
+      value = createVariableGet(valueVariable);
+    }
+
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.fileOffset,
+        valueType,
+        value,
+        readType,
+        node.isInc ? plusName : minusName,
+        createIntLiteral(coreTypes, 1, fileOffset: node.fileOffset),
+        null);
+
+    binaryResult =
+        ensureAssignableResult(valueType, binaryResult, isVoidAllowed: true);
+    Expression result = binaryResult.expression;
+
+    StaticInvocation write = createStaticInvocation(
+        node.setter,
+        new Arguments([writeReceiver, result], types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
+    Expression replacement;
+    if (node.forEffect) {
+      assert(valueVariable == null);
+      replacement = write;
+    } else {
+      assert(valueVariable != null);
+      VariableDeclaration writeVariable =
+          createVariable(write, const VoidType());
+      replacement = createLet(valueVariable!,
+          createLet(writeVariable, createVariableGet(valueVariable)));
+    }
+    if (receiverVariable != null) {
+      replacement = createLet(receiverVariable, replacement);
+    }
+    replacement.fileOffset = node.fileOffset;
+    return new ExpressionInferenceResult(valueType, replacement);
+  }
+
+  ExpressionInferenceResult visitExtensionGetterInvocation(
+      ExtensionGetterInvocation node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.getter, null, ClassMemberKind.Getter, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    DartType getterType = target.getGetterType(this);
+
+    StaticInvocation getterAccess = createStaticInvocation(
+        node.getter,
+        new Arguments([receiver], types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
+    return inferMethodInvocation(this, node.fileOffset, getterAccess,
+        getterType, callName, node.arguments, typeContext,
+        isExpressionInvocation: true, isImplicitCall: true);
+  }
+
+  ExpressionInferenceResult visitExtensionMethodInvocation(
+      ExtensionMethodInvocation node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.method, null, ClassMemberKind.Method, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    ArgumentsImpl extensionInvocationArguments =
+        createExtensionInvocationArgument(target, receiver, node.arguments);
+
+    InvocationTargetType invocationTargetType = target.getFunctionType(this);
+    TypeArgumentsInfo typeArgumentsInfo =
+        getTypeArgumentsInfo(extensionInvocationArguments);
+    InvocationInferenceResult result = inferInvocation(this, typeContext,
+        node.fileOffset, invocationTargetType, extensionInvocationArguments,
+        staticTarget: node.method,
+        receiverType: receiverType,
+        isExtensionMemberInvocation: true);
+
+    StaticInvocation replacement = createStaticInvocation(
+        node.method, extensionInvocationArguments,
+        fileOffset: node.fileOffset);
+
+    libraryBuilder.checkBoundsInStaticInvocation(replacement, node.name,
+        typeSchemaEnvironment, helper.uri, typeArgumentsInfo);
+
+    return new ExpressionInferenceResult(
+        result.inferredType, result.applyResult(replacement));
+  }
+
+  ExpressionInferenceResult visitExtensionIfNullSet(
+      ExtensionIfNullSet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    VariableDeclaration? receiverVariable;
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiverVariable = createVariable(receiver, receiverType);
+      createNullAwareGuard(receiverVariable);
+      receiverType = nonNullReceiverType;
+    } else if (!isPureExpression(receiver)) {
+      receiverVariable = createVariable(receiver, receiverType);
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    instrumentation?.record(uriForInstrumentation, node.receiver.fileOffset,
+        'type', new InstrumentationValueForType(receiverType));
+
+    Expression readReceiver;
+    Expression writeReceiver;
+    if (receiverVariable != null) {
+      readReceiver =
+          createVariableGet(receiverVariable, promotedType: receiverType);
+      writeReceiver =
+          createVariableGet(receiverVariable, promotedType: receiverType);
+    } else {
+      readReceiver = receiver;
+      writeReceiver = clonePureExpression(receiver);
+    }
+
+    ExpressionInferenceResult readResult = _computePropertyGet(node.readOffset,
+            readReceiver, receiverType, node.propertyName, const UnknownType(),
+            isThisReceiver: node.receiver is ThisExpression)
+        .expressionInferenceResult;
+
+    Expression read = readResult.expression;
+    DartType readType = readResult.inferredType;
+
+    flowAnalysis.ifNullExpression_rightBegin(
+        read, new SharedTypeView(readType));
+
+    ObjectAccessTarget writeTarget = findInterfaceMember(
+        receiverType, node.propertyName, receiver.fileOffset,
+        isSetter: true, instrumented: true, includeExtensionMethods: true);
+    DartType writeContext = writeTarget.getSetterType(this);
+    ExpressionInferenceResult rhsResult =
+        inferExpression(node.rhs, writeContext, isVoidAllowed: true);
+    flowAnalysis.ifNullExpression_end();
+
+    rhsResult = ensureAssignableResult(writeContext, rhsResult);
+    Expression rhs = rhsResult.expression;
+
+    DartType writeType = rhsResult.inferredType;
+    ExpressionInferenceResult writeResult = _computePropertySet(
+        node.writeOffset,
+        writeReceiver,
+        receiverType,
+        node.propertyName,
+        writeTarget,
+        rhs,
+        forEffect: node.forEffect,
+        valueType: writeType);
+    Expression write = writeResult.expression;
+
+    DartType nonNullableReadType = readType.toNonNull();
+    DartType inferredType = _analyzeIfNullTypes(
+        nonNullableReadType: nonNullableReadType,
+        rhsType: writeType,
+        typeContext: typeContext);
+
+    Expression replacement;
+    if (node.forEffect) {
+      // Encode `o.a ??= b` as:
+      //
+      //     let v1 = o in v1.a == null ? v1.a = b : null
+      //
+      Expression equalsNull =
+          createEqualsNull(read, fileOffset: node.fileOffset);
+      replacement = _createConditionalExpression(
+          node.fileOffset,
+          equalsNull,
+          write,
+          new NullLiteral()..fileOffset = node.fileOffset,
+          computeNullable(inferredType));
+    } else {
+      // Encode `o.a ??= b` as:
+      //
+      //     let v1 = o in let v2 = v1.a in v2 == null ? v1.a = b : v2
+      //
+      VariableDeclaration readVariable = createVariable(read, readType);
+      Expression equalsNull = createEqualsNull(createVariableGet(readVariable),
+          fileOffset: node.fileOffset);
+      VariableGet variableGet = createVariableGet(readVariable);
+      if (!identical(nonNullableReadType, readType)) {
+        variableGet.promotedType = nonNullableReadType;
+      }
+      ConditionalExpression conditional = _createConditionalExpression(
+          node.fileOffset, equalsNull, write, variableGet, inferredType);
+      replacement = createLet(readVariable, conditional);
+    }
+    if (receiverVariable != null) {
+      if (!node.isNullAware) {
+        // When the node is null-aware, the receiver variable is used as a
+        // null-aware guard and is automatically inserted by the shorting
+        // system. Otherwise, we have to manually insert the receiver variable
+        // here.
+        replacement = createLet(receiverVariable, replacement);
+      }
+    }
+
+    return new ExpressionInferenceResult(inferredType, replacement);
+  }
+
+  ExpressionInferenceResult visitExtensionCompoundSet(
+      ExtensionCompoundSet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.knownTypeArguments, receiverType,
+        treeNodeForTesting: node);
+
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    VariableDeclaration? receiverVariable;
+    Expression readReceiver;
+    Expression writeReceiver;
+    if (isPureExpression(receiver)) {
+      readReceiver = receiver;
+      writeReceiver = clonePureExpression(receiver);
+    } else {
+      receiverVariable = createVariable(receiver, receiverType);
+      readReceiver = createVariableGet(receiverVariable);
+      writeReceiver = createVariableGet(receiverVariable);
+    }
+
+    ObjectAccessTarget readTarget = new ExtensionAccessTarget(receiverType,
+        node.getter, null, ClassMemberKind.Getter, extensionTypeArguments);
 
     DartType readType = readTarget.getGetterType(this);
 
-    Expression read;
-    if (readTarget.isMissing) {
-      // Coverage-ignore-block(suite): Not run.
-      read = createMissingPropertyGet(
-          node.readOffset, readType, node.propertyName,
-          receiver: readReceiver);
-    } else {
-      assert(readTarget.isExtensionMember);
-      read = new StaticInvocation(
-          readTarget.member as Procedure,
-          new Arguments(<Expression>[
-            readReceiver,
-          ], types: readTarget.receiverTypeArguments)
-            ..fileOffset = node.readOffset)
-        ..fileOffset = node.readOffset;
-    }
+    Expression read = new StaticInvocation(
+        readTarget.member as Procedure,
+        new Arguments(<Expression>[
+          readReceiver,
+        ], types: readTarget.receiverTypeArguments)
+          ..fileOffset = node.readOffset)
+      ..fileOffset = node.readOffset;
 
-    ObjectAccessTarget writeTarget = node.setter == null
-        ? const ObjectAccessTarget.missing()
-        : new ExtensionAccessTarget(receiverType, node.setter!, null,
-            ClassMemberKind.Setter, extensionTypeArguments);
+    ObjectAccessTarget writeTarget = new ExtensionAccessTarget(receiverType,
+        node.setter, null, ClassMemberKind.Setter, extensionTypeArguments);
 
     DartType valueType = writeTarget.getSetterType(this);
 
@@ -1341,22 +1775,14 @@
       value = createVariableGet(valueVariable);
     }
 
-    Expression write;
-    if (writeTarget.isMissing) {
-      write = createMissingPropertySet(
-          node.writeOffset, writeReceiver, readType, node.propertyName, value,
-          forEffect: node.forEffect);
-    } else {
-      assert(writeTarget.isExtensionMember);
-      write = new StaticInvocation(
-          writeTarget.member as Procedure,
-          new Arguments(<Expression>[
-            writeReceiver,
-            value,
-          ], types: writeTarget.receiverTypeArguments)
-            ..fileOffset = node.writeOffset)
-        ..fileOffset = node.writeOffset;
-    }
+    Expression write = new StaticInvocation(
+        writeTarget.member as Procedure,
+        new Arguments(<Expression>[
+          writeReceiver,
+          value,
+        ], types: writeTarget.receiverTypeArguments)
+          ..fileOffset = node.writeOffset)
+      ..fileOffset = node.writeOffset;
 
     Expression replacement;
     if (node.forEffect) {
@@ -2107,9 +2533,12 @@
       if (!identical(nonNullT1, t1)) {
         variableGet.promotedType = nonNullT1;
       }
-      ConditionalExpression conditional = new ConditionalExpression(
-          equalsNull, rhsResult.expression, variableGet, inferredType)
-        ..fileOffset = node.fileOffset;
+      ConditionalExpression conditional = _createConditionalExpression(
+          node.fileOffset,
+          equalsNull,
+          rhsResult.expression,
+          variableGet,
+          inferredType);
       replacement = new Let(variable, conditional)
         ..fileOffset = node.fileOffset;
     }
@@ -5527,8 +5956,8 @@
           staticTarget: node.target);
       StaticInvocation invocation =
           new StaticInvocation(member, node.arguments);
-      libraryBuilder.checkBoundsInStaticInvocation(
-          invocation, typeSchemaEnvironment, helper.uri, typeArgumentsInfo);
+      libraryBuilder.checkBoundsInStaticInvocation(invocation, member.name,
+          typeSchemaEnvironment, helper.uri, typeArgumentsInfo);
       return new ExpressionInferenceResult(
           result.inferredType, result.applyResult(invocation));
     } else {
@@ -5585,26 +6014,6 @@
     return new ExpressionInferenceResult(nonNullableResultType, node);
   }
 
-  ExpressionInferenceResult visitNullAwareMethodInvocation(
-      NullAwareMethodInvocation node, DartType typeContext) {
-    inferSyntheticVariable(node.variable, continueNullShorting: true);
-    createNullAwareGuard(node.variable);
-    ExpressionInferenceResult invocationResult =
-        inferExpression(node.invocation, typeContext, isVoidAllowed: true);
-    return new ExpressionInferenceResult(
-        invocationResult.inferredType, invocationResult.expression);
-  }
-
-  ExpressionInferenceResult visitNullAwareExtension(
-      NullAwareExtension node, DartType typeContext) {
-    inferSyntheticVariable(node.variable);
-    createNullAwareGuard(node.variable);
-    ExpressionInferenceResult expressionResult =
-        inferExpression(node.expression, typeContext);
-    return new ExpressionInferenceResult(
-        expressionResult.inferredType, expressionResult.expression);
-  }
-
   ExpressionInferenceResult visitStaticPostIncDec(
       StaticPostIncDec node, DartType typeContext) {
     inferSyntheticVariable(node.read);
@@ -6120,31 +6529,100 @@
     return new ExpressionInferenceResult(inferredType, replacement);
   }
 
-  ExpressionInferenceResult visitExtensionIndexSet(
-      ExtensionIndexSet node, DartType typeContext) {
+  ExpressionInferenceResult visitExtensionIndexGet(
+      ExtensionIndexGet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.explicitTypeArguments);
+
     ExpressionInferenceResult receiverResult = inferExpression(
-        node.receiver, const UnknownType(),
+        node.receiver, receiverContextType,
         isVoidAllowed: false);
 
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
     List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
-        node.extension, node.explicitTypeArguments, receiverResult.inferredType,
+        node.extension, node.explicitTypeArguments, receiverType,
         treeNodeForTesting: node);
-
-    DartType receiverType =
+    DartType extensionOnType =
         getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.getter, null, ClassMemberKind.Method, extensionTypeArguments);
 
-    Expression receiver =
-        ensureAssignableResult(receiverType, receiverResult).expression;
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
+
+    DartType indexType = target.getIndexKeyType(this);
+    DartType resultType = target.getReturnType(this);
+
+    ExpressionInferenceResult indexResult =
+        inferExpression(node.index, indexType, isVoidAllowed: true);
+
+    Expression index =
+        ensureAssignableResult(indexType, indexResult).expression;
+
+    StaticInvocation replacement = createStaticInvocation(
+        node.getter,
+        new Arguments(<Expression>[receiver, index],
+            types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
+
+    libraryBuilder.checkBoundsInStaticInvocation(
+        replacement,
+        indexSetName,
+        typeSchemaEnvironment,
+        helper.uri,
+        node.explicitTypeArguments != null
+            ? const NoneInferredTypeArgumentsInfo()
+            : const AllInferredTypeArgumentsInfo());
+
+    return new ExpressionInferenceResult(resultType, replacement);
+  }
+
+  ExpressionInferenceResult visitExtensionIndexSet(
+      ExtensionIndexSet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.explicitTypeArguments);
+
+    ExpressionInferenceResult receiverResult = inferExpression(
+        node.receiver, receiverContextType,
+        isVoidAllowed: false);
+
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
+        node.extension, node.explicitTypeArguments, receiverType,
+        treeNodeForTesting: node);
+    DartType extensionOnType =
+        getExtensionReceiverType(node.extension, extensionTypeArguments);
+    ObjectAccessTarget target = new ExtensionAccessTarget(extensionOnType,
+        node.setter, null, ClassMemberKind.Method, extensionTypeArguments);
+
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
 
     VariableDeclaration? receiverVariable;
-    if (!isPureExpression(receiver)) {
+    if (!node.forEffect && !isPureExpression(receiver)) {
       receiverVariable = createVariable(receiver, receiverType);
       receiver = createVariableGet(receiverVariable);
     }
 
-    ObjectAccessTarget target = new ExtensionAccessTarget(receiverType,
-        node.setter, null, ClassMemberKind.Method, extensionTypeArguments);
-
     DartType indexType = target.getIndexKeyType(this);
     DartType valueType = target.getIndexSetValueType(this);
 
@@ -6160,8 +6638,10 @@
     Expression value = valueResult.expression;
 
     VariableDeclaration? valueVariable;
-    Expression returnedValue;
-    if (isPureExpression(value)) {
+    Expression? returnedValue;
+    if (node.forEffect) {
+      // Returned value is not needed.
+    } else if (isPureExpression(value)) {
       returnedValue = clonePureExpression(value);
     } else {
       valueVariable = createVariable(value, valueResult.inferredType);
@@ -6173,12 +6653,29 @@
     // the type of the value parameter.
     DartType inferredType = valueResult.inferredType;
 
-    Expression assignment = _computeIndexSet(node.fileOffset, receiver,
-        receiverType, target, index, indexType, value, valueType);
+    StaticInvocation assignment = createStaticInvocation(
+        node.setter,
+        new Arguments(<Expression>[receiver, index, value],
+            types: extensionTypeArguments)
+          ..fileOffset = node.fileOffset,
+        fileOffset: node.fileOffset);
 
-    VariableDeclaration assignmentVariable =
-        createVariable(assignment, const VoidType());
-    Expression replacement = createLet(assignmentVariable, returnedValue);
+    libraryBuilder.checkBoundsInStaticInvocation(
+        assignment,
+        indexSetName,
+        typeSchemaEnvironment,
+        helper.uri,
+        node.explicitTypeArguments != null
+            ? const NoneInferredTypeArgumentsInfo()
+            : const AllInferredTypeArgumentsInfo());
+
+    Expression replacement = assignment;
+    if (returnedValue != null) {
+      assert(!node.forEffect);
+      VariableDeclaration assignmentVariable =
+          createVariable(assignment, const VoidType());
+      replacement = createLet(assignmentVariable, returnedValue);
+    }
     if (valueVariable != null) {
       replacement = createLet(valueVariable, replacement);
     }
@@ -6505,21 +7002,34 @@
     return new ExpressionInferenceResult(inferredType, replacement);
   }
 
-  ExpressionInferenceResult visitIfNullExtensionIndexSet(
-      IfNullExtensionIndexSet node, DartType typeContext) {
+  ExpressionInferenceResult visitExtensionIfNullIndexSet(
+      ExtensionIfNullIndexSet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.knownTypeArguments);
+
     ExpressionInferenceResult receiverResult = inferExpression(
-        node.receiver, const UnknownType(),
+        node.receiver, receiverContextType,
         isVoidAllowed: false);
 
     List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
-        node.extension, node.explicitTypeArguments, receiverResult.inferredType,
+        node.extension, node.knownTypeArguments, receiverResult.inferredType,
         treeNodeForTesting: node);
 
-    DartType receiverType =
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
+    DartType extensionOnType =
         getExtensionReceiverType(node.extension, extensionTypeArguments);
 
-    Expression receiver =
-        ensureAssignableResult(receiverType, receiverResult).expression;
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
 
     VariableDeclaration? receiverVariable;
     Expression readReceiver;
@@ -6533,17 +7043,13 @@
       writeReceiver = createVariableGet(receiverVariable);
     }
 
-    ObjectAccessTarget readTarget = node.getter != null
-        ? new ExtensionAccessTarget(receiverType, node.getter!, null,
-            ClassMemberKind.Method, extensionTypeArguments)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget readTarget = new ExtensionAccessTarget(receiverType,
+        node.getter, null, ClassMemberKind.Method, extensionTypeArguments);
 
     DartType readIndexType = readTarget.getIndexKeyType(this);
 
-    ObjectAccessTarget writeTarget = node.setter != null
-        ? new ExtensionAccessTarget(receiverType, node.setter!, null,
-            ClassMemberKind.Method, extensionTypeArguments)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget writeTarget = new ExtensionAccessTarget(receiverType,
+        node.setter, null, ClassMemberKind.Method, extensionTypeArguments);
 
     DartType writeIndexType = writeTarget.getIndexKeyType(this);
     DartType valueType = writeTarget.getIndexSetValueType(this);
@@ -6627,12 +7133,12 @@
       assert(valueVariable == null);
       Expression equalsNull =
           createEqualsNull(read, fileOffset: node.testOffset);
-      replacement = new ConditionalExpression(
+      replacement = _createConditionalExpression(
+          node.testOffset,
           equalsNull,
           write,
           new NullLiteral()..fileOffset = node.testOffset,
-          computeNullable(inferredType))
-        ..fileOffset = node.testOffset;
+          computeNullable(inferredType));
     } else {
       // Encode `Extension(o)[a] ??= b` as:
       //
@@ -6659,9 +7165,8 @@
       if (valueVariable != null) {
         result = createLet(valueVariable, result);
       }
-      ConditionalExpression conditional = new ConditionalExpression(
-          equalsNull, result, readVariableGet, inferredType)
-        ..fileOffset = node.fileOffset;
+      ConditionalExpression conditional = _createConditionalExpression(
+          node.fileOffset, equalsNull, result, readVariableGet, inferredType);
       replacement = createLet(readVariable, conditional);
     }
     if (indexVariable != null) {
@@ -7963,26 +8468,37 @@
         node.forPostIncDec ? readType : binaryType, replacement);
   }
 
-  ExpressionInferenceResult visitCompoundExtensionIndexSet(
-      CompoundExtensionIndexSet node, DartType typeContext) {
+  ExpressionInferenceResult visitExtensionCompoundIndexSet(
+      ExtensionCompoundIndexSet node, DartType typeContext) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+        node.extension, node.explicitTypeArguments);
+
     ExpressionInferenceResult receiverResult = inferExpression(
-        node.receiver, const UnknownType(),
+        node.receiver, receiverContextType,
         isVoidAllowed: false);
 
+    Expression receiver = receiverResult.expression;
+    DartType receiverType = receiverResult.inferredType;
+
+    if (node.isNullAware) {
+      DartType nonNullReceiverType = receiverType.toNonNull();
+      receiver =
+          _createNonNullReceiver(receiver, receiverType, nonNullReceiverType);
+      receiverType = nonNullReceiverType;
+    }
+
     List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
-        node.extension, node.explicitTypeArguments, receiverResult.inferredType,
+        node.extension, node.explicitTypeArguments, receiverType,
         treeNodeForTesting: node);
 
-    DartType receiverType =
+    DartType extensionOnType =
         getExtensionReceiverType(node.extension, extensionTypeArguments);
 
-    ObjectAccessTarget readTarget = node.getter != null
-        ? new ExtensionAccessTarget(receiverType, node.getter!, null,
-            ClassMemberKind.Method, extensionTypeArguments)
-        : const ObjectAccessTarget.missing();
+    receiver = ensureAssignable(extensionOnType, receiverType, receiver);
+    receiverType = extensionOnType;
 
-    Expression receiver =
-        ensureAssignableResult(receiverType, receiverResult).expression;
+    ObjectAccessTarget readTarget = new ExtensionAccessTarget(receiverType,
+        node.getter, null, ClassMemberKind.Method, extensionTypeArguments);
 
     VariableDeclaration? receiverVariable;
     Expression readReceiver;
@@ -8037,10 +8553,8 @@
       left = read;
     }
 
-    ObjectAccessTarget writeTarget = node.setter != null
-        ? new ExtensionAccessTarget(receiverType, node.setter!, null,
-            ClassMemberKind.Method, extensionTypeArguments)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget writeTarget = new ExtensionAccessTarget(receiverType,
+        node.setter, null, ClassMemberKind.Method, extensionTypeArguments);
 
     DartType writeIndexType = writeTarget.getIndexKeyType(this);
 
@@ -8682,7 +9196,7 @@
         node.arguments as ArgumentsImpl,
         staticTarget: node.target);
     libraryBuilder.checkBoundsInStaticInvocation(
-        node, typeSchemaEnvironment, helper.uri, typeArgumentsInfo);
+        node, node.name, typeSchemaEnvironment, helper.uri, typeArgumentsInfo);
     return new ExpressionInferenceResult(
         result.inferredType, result.applyResult(node));
   }
@@ -9492,26 +10006,12 @@
         return result;
       }
     }
-    if (node is! VariableGetImpl) {
-      // Coverage-ignore-block(suite): Not run.
-      // This node is created as part of a lowering and doesn't need inference.
-      return new ExpressionInferenceResult(
-          node.promotedType ?? node.variable.type, node);
-    }
     VariableDeclarationImpl variable = node.variable as VariableDeclarationImpl;
     DartType? promotedType;
     DartType declaredOrInferredType = variable.lateType ?? variable.type;
     if (isExtensionThis(variable)) {
       flowAnalysis.thisOrSuper(node, new SharedTypeView(variable.type),
           isSuper: true);
-    } else if (node.forNullGuardedAccess) {
-      DartType nonNullableType = variable.type.toNonNull();
-      if (nonNullableType != variable.type) {
-        promotedType = nonNullableType;
-      }
-      // It's still necessary to inform flow analysis about the read so that it
-      // can track field promotions.
-      flowAnalysis.variableRead(node, variable);
     } else if (!variable.isLocalFunction) {
       // Don't promote local functions.
       promotedType =
diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
index d37d340..a38339a 100644
--- a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
@@ -949,6 +949,29 @@
   /// on [extension] with the static [receiverType]. If [explicitTypeArguments]
   /// are provided, these are returned, otherwise type arguments are inferred
   /// using [receiverType].
+  DartType computeExplicitExtensionReceiverContextType(
+      Extension extension, List<DartType>? explicitTypeArguments) {
+    if (extension.typeParameters.isEmpty) {
+      assert(explicitTypeArguments == null);
+      return extension.onType;
+    } else {
+      List<DartType> typeArguments;
+      if (explicitTypeArguments != null) {
+        assert(explicitTypeArguments.length == extension.typeParameters.length);
+        typeArguments = explicitTypeArguments;
+      } else {
+        typeArguments = new List.filled(
+            extension.typeParameters.length, const UnknownType());
+      }
+      return Substitution.fromPairs(extension.typeParameters, typeArguments)
+          .substituteType(extension.onType);
+    }
+  }
+
+  /// Computes the type arguments for an access to an extension instance member
+  /// on [extension] with the static [receiverType]. If [explicitTypeArguments]
+  /// are provided, these are returned, otherwise type arguments are inferred
+  /// using [receiverType].
   List<DartType> computeExtensionTypeArgument(
     Extension extension,
     List<DartType>? explicitTypeArguments,
@@ -1641,7 +1664,6 @@
     DartType? receiverType,
     bool skipTypeArgumentInference = false,
     bool isConst = false,
-    bool isImplicitExtensionMember = false,
     bool isImplicitCall = false,
     Member? staticTarget,
     bool isExtensionMemberInvocation = false,
@@ -1663,7 +1685,6 @@
         receiverType: receiverType,
         skipTypeArgumentInference: skipTypeArgumentInference,
         isConst: isConst,
-        isImplicitExtensionMember: isImplicitExtensionMember,
       );
     }
     return _inferInvocation(
@@ -1678,7 +1699,6 @@
       receiverType: receiverType,
       skipTypeArgumentInference: skipTypeArgumentInference,
       isConst: isConst,
-      isImplicitExtensionMember: isImplicitExtensionMember,
       isImplicitCall: isImplicitCall,
       staticTarget: staticTarget,
       isExtensionMemberInvocation: isExtensionMemberInvocation,
@@ -1698,7 +1718,6 @@
     DartType? receiverType,
     bool skipTypeArgumentInference = false,
     bool isConst = false,
-    bool isImplicitExtensionMember = false,
     bool isImplicitCall = false,
     Member? staticTarget,
   }) {
@@ -1723,7 +1742,6 @@
       hoistedExpressions,
       skipTypeArgumentInference: skipTypeArgumentInference,
       receiverType: receiverType,
-      isImplicitExtensionMember: isImplicitExtensionMember,
       isImplicitCall: isImplicitCall,
       staticTarget: staticTarget,
       isExtensionMemberInvocation: true,
@@ -1796,7 +1814,6 @@
     DartType? receiverType,
     bool skipTypeArgumentInference = false,
     bool isConst = false,
-    bool isImplicitExtensionMember = false,
     required bool isImplicitCall,
     Member? staticTarget,
     bool isExtensionMemberInvocation = false,
@@ -1994,12 +2011,20 @@
         formalType = getNamedParameterType(calleeType, namedArgument.name);
         argumentExpression = namedArgument.value;
       }
-      if (isExpression && isImplicitExtensionMember && index == 0) {
+      if (isExpression && isExtensionMemberInvocation && index == 0) {
         assert(
           receiverType != null,
           "No receiver type provided for implicit extension member "
           "invocation.",
         );
+        Expression expression = _hoist(
+          argumentExpression,
+          receiverType!,
+          hoistedExpressions,
+        );
+        formalTypes.add(formalType);
+        actualTypes.add(receiverType);
+        arguments.positional[index] = expression..parent = arguments;
         continue;
       }
       Expression unparenthesizedExpression = argumentExpression;
@@ -2014,9 +2039,7 @@
             argumentExpression: argumentExpression,
             unparenthesizedExpression: unparenthesizedExpression,
             isNamed: !isExpression,
-            evaluationOrderIndex: isImplicitExtensionMember
-                ? evaluationOrderIndex - 1
-                : evaluationOrderIndex,
+            evaluationOrderIndex: evaluationOrderIndex,
             index: index,
           ),
         );
@@ -2221,9 +2244,9 @@
       }) argumentHandlingCallback,
     ) {
       // Argument counts and names match. Compare types.
-      int positionalShift = isImplicitExtensionMember ? 1 : 0;
       int positionalIndex = 0;
       int namedIndex = 0;
+      int overallArgumentIndex = 0;
       for (int i = 0; i < formalTypes.length; i++) {
         DartType formalType = formalTypes[i];
         DartType expectedType = instantiator != null
@@ -2233,10 +2256,9 @@
         Expression expression;
         NamedExpression? namedExpression;
         bool coerceExpression;
-        Object? argumentInEvaluationOrder =
-            argumentsEvaluationOrder[i + positionalShift];
+        Object? argumentInEvaluationOrder = argumentsEvaluationOrder[i];
         if (argumentInEvaluationOrder is Expression) {
-          expression = arguments.positional[positionalShift + positionalIndex];
+          expression = arguments.positional[positionalIndex];
           coerceExpression = !arguments.positionalAreSuperParameters;
         } else {
           namedExpression = arguments.named[namedIndex];
@@ -2246,17 +2268,19 @@
               ) ??
               false);
         }
-
-        argumentHandlingCallback(
-          actualType: actualType,
-          expectedType: expectedType,
-          formalType: formalType,
-          argumentExpression: expression,
-          namedArgumentExpression: namedExpression,
-          coerceExpression: coerceExpression,
-          positionalArgumentIndex: positionalShift + positionalIndex,
-          overallArgumentIndex: i,
-        );
+        if (!(isExtensionMemberInvocation && positionalIndex == 0)) {
+          argumentHandlingCallback(
+            actualType: actualType,
+            expectedType: expectedType,
+            formalType: formalType,
+            argumentExpression: expression,
+            namedArgumentExpression: namedExpression,
+            coerceExpression: coerceExpression,
+            positionalArgumentIndex: positionalIndex,
+            overallArgumentIndex: overallArgumentIndex,
+          );
+          overallArgumentIndex++;
+        }
 
         if (namedExpression == null) {
           positionalIndex++;
@@ -2668,11 +2692,34 @@
     }
   }
 
-  StaticInvocation transformExtensionMethodInvocation(
+  ArgumentsImpl createExtensionInvocationArgument(
+      ObjectAccessTarget target, Expression receiver, ArgumentsImpl arguments) {
+    assert(
+      target.isExtensionMember ||
+          target.isNullableExtensionMember ||
+          target.isExtensionTypeMember ||
+          target.isNullableExtensionTypeMember,
+    );
+    Procedure procedure = target.member as Procedure;
+    return new ArgumentsImpl.forExtensionMethod(
+        target.receiverTypeArguments.length,
+        procedure.function.typeParameters.length -
+            target.receiverTypeArguments.length,
+        receiver,
+        extensionTypeArguments: target.receiverTypeArguments,
+        positionalArguments: arguments.positional,
+        namedArguments: arguments.named,
+        typeArguments: arguments.types,
+        argumentsOriginalOrder: arguments.argumentsOriginalOrder != null
+            ? [receiver, ...arguments.argumentsOriginalOrder!]
+            : null)
+      ..fileOffset = arguments.fileOffset;
+  }
+
+  StaticInvocation createExtensionInvocation(
     int fileOffset,
     ObjectAccessTarget target,
-    Expression receiver,
-    Arguments arguments,
+    ArgumentsImpl arguments,
   ) {
     assert(
       target.isExtensionMember ||
@@ -2683,16 +2730,7 @@
     Procedure procedure = target.member as Procedure;
     return createStaticInvocation(
       procedure,
-      new ArgumentsImpl.forExtensionMethod(
-        target.receiverTypeArguments.length,
-        procedure.function.typeParameters.length -
-            target.receiverTypeArguments.length,
-        receiver,
-        extensionTypeArguments: target.receiverTypeArguments,
-        positionalArguments: arguments.positional,
-        namedArguments: arguments.named,
-        typeArguments: arguments.types,
-      )..fileOffset = arguments.fileOffset,
+      arguments,
       fileOffset: fileOffset,
     );
   }
@@ -2829,11 +2867,13 @@
     InvocationTargetType invocationTargetType = target.getFunctionType(this);
 
     if (target.declarationMethodKind == ClassMemberKind.Getter) {
-      StaticInvocation staticInvocation = transformExtensionMethodInvocation(
+      ArgumentsImpl extensionInvocationArguments =
+          createExtensionInvocationArgument(
+              target, receiver, new ArgumentsImpl.empty());
+      StaticInvocation staticInvocation = createExtensionInvocation(
         fileOffset,
         target,
-        receiver,
-        new Arguments.empty(),
+        extensionInvocationArguments,
       );
       ExpressionInferenceResult result = inferMethodInvocation(
         visitor,
@@ -2874,26 +2914,27 @@
 
       return result;
     } else {
-      StaticInvocation staticInvocation = transformExtensionMethodInvocation(
-        fileOffset,
-        target,
-        receiver,
-        arguments,
-      );
+      ArgumentsImpl extensionInvocationArguments =
+          createExtensionInvocationArgument(target, receiver, arguments);
       InvocationInferenceResult result = inferInvocation(
         visitor,
         typeContext,
         fileOffset,
         invocationTargetType,
-        staticInvocation.arguments as ArgumentsImpl,
+        extensionInvocationArguments,
         hoistedExpressions: hoistedExpressions,
         receiverType: receiverType,
-        isImplicitExtensionMember: true,
         isImplicitCall: isImplicitCall,
         isExtensionMemberInvocation: true,
       );
+      StaticInvocation staticInvocation = createExtensionInvocation(
+        fileOffset,
+        target,
+        extensionInvocationArguments,
+      );
       libraryBuilder.checkBoundsInStaticInvocation(
         staticInvocation,
+        name,
         typeSchemaEnvironment,
         helper.uri,
         getTypeArgumentsInfo(arguments),
@@ -4160,7 +4201,6 @@
       arguments,
       isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
       receiverType: receiverType,
-      isImplicitExtensionMember: false,
     );
     DartType inferredType = result.inferredType;
     if (methodName.text == '==') {
diff --git a/pkg/front_end/lib/src/type_inference/object_access_target.dart b/pkg/front_end/lib/src/type_inference/object_access_target.dart
index 576c090..9a668af 100644
--- a/pkg/front_end/lib/src/type_inference/object_access_target.dart
+++ b/pkg/front_end/lib/src/type_inference/object_access_target.dart
@@ -1106,7 +1106,8 @@
       // Coverage-ignore(suite): Not run.
       case ClassMemberKind.Method:
       case ClassMemberKind.Getter:
-        throw unexpected('$this', 'getSetterType', -1, null);
+        throw new UnsupportedError(
+            'Unexpected declaration kind $declarationMethodKind on $this.');
     }
   }
 
diff --git a/pkg/front_end/lib/src/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/type_inference/type_inferrer.dart
index a987e10..b8ea73e 100644
--- a/pkg/front_end/lib/src/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/type_inference/type_inferrer.dart
@@ -239,16 +239,15 @@
         in redirectingFactoryFunction.positionalParameters) {
       flowAnalysis.declare(parameter, new SharedTypeView(parameter.type),
           initialized: true);
-      positionalArguments
-          .add(new VariableGetImpl(parameter, forNullGuardedAccess: false));
+      positionalArguments.add(new VariableGet(parameter));
     }
     List<NamedExpression> namedArguments = <NamedExpression>[];
     for (VariableDeclaration parameter
         in redirectingFactoryFunction.namedParameters) {
       flowAnalysis.declare(parameter, new SharedTypeView(parameter.type),
           initialized: true);
-      namedArguments.add(new NamedExpression(parameter.name!,
-          new VariableGetImpl(parameter, forNullGuardedAccess: false)));
+      namedArguments.add(
+          new NamedExpression(parameter.name!, new VariableGet(parameter)));
     }
     // If arguments are created using [ArgumentsImpl], and the
     // type arguments are omitted, they are to be inferred.
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index 859ffaa..cfefc10 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -87,12 +87,11 @@
     _testPropertySet();
     _testReturnStatementImpl();
     _testVariableDeclarationImpl();
-    _testVariableGetImpl();
     _testLoadLibraryImpl();
     _testLoadLibraryTearOff();
     _testIfNullPropertySet();
     _testIfNullSet();
-    _testCompoundExtensionSet();
+    _testExtensionCompoundSet();
     _testCompoundPropertySet();
     _testPropertyPostIncDec();
     _testLocalPostIncDec();
@@ -101,6 +100,12 @@
     _testIndexGet();
     _testIndexSet();
     _testSuperIndexSet();
+    _testExtensionGet();
+    _testExtensionSet();
+    _testExtensionGetterInvocation();
+    _testExtensionMethodInvocation();
+    _testExtensionPostIncDec();
+    _testExtensionIndexGet();
     _testExtensionIndexSet();
     _testIfNullIndexSet();
     _testIfNullSuperIndexSet();
@@ -108,9 +113,8 @@
     _testCompoundIndexSet();
     _testNullAwareCompoundSet();
     _testCompoundSuperIndexSet();
-    _testCompoundExtensionIndexSet();
+    _testExtensionCompoundIndexSet();
     _testExtensionSet();
-    _testNullAwareExtension();
     _testPropertySetImpl();
     _testExtensionTearOff();
     _testEqualsExpression();
@@ -825,19 +829,6 @@
 late dynamic foo = 0;''');
 }
 
-void _testVariableGetImpl() {
-  VariableDeclaration variable = new VariableDeclaration('foo');
-  testExpression(new VariableGetImpl(variable, forNullGuardedAccess: false), '''
-foo''');
-  testExpression(new VariableGetImpl(variable, forNullGuardedAccess: true), '''
-foo''');
-  testExpression(
-      new VariableGetImpl(variable, forNullGuardedAccess: false)
-        ..promotedType = const VoidType(),
-      '''
-foo{void}''');
-}
-
 void _testLoadLibraryImpl() {
   Library library = new Library(dummyUri, fileUri: dummyUri);
   LibraryDependency dependency =
@@ -907,7 +898,114 @@
 foo ?? foo = 1''');
 }
 
-void _testCompoundExtensionSet() {}
+void _testExtensionCompoundSet() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure getter = new Procedure(
+      new Name('E|get#foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  Procedure setter = new Procedure(
+      new Name('E|set#foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(setter);
+
+  testExpression(
+      new ExtensionCompoundSet.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          propertyName: name,
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('-'),
+          rhs: new IntLiteral(1),
+          isNullAware: false,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1),
+      '''
+Extension(0).foo -= 1''');
+
+  testExpression(
+      new ExtensionCompoundSet.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          propertyName: name,
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          rhs: new IntLiteral(1),
+          isNullAware: true,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1),
+      '''
+Extension(0)?.foo += 1''');
+
+  testExpression(
+      new ExtensionCompoundSet.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          propertyName: name,
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          rhs: new IntLiteral(1),
+          isNullAware: false,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1),
+      '''
+Extension<void>(0).foo += 1''');
+
+  testExpression(
+      new ExtensionCompoundSet.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          propertyName: name,
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('-'),
+          rhs: new IntLiteral(1),
+          isNullAware: true,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1),
+      '''
+Extension<void>(0)?.foo -= 1''');
+
+  testExpression(
+      new ExtensionCompoundSet.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          propertyName: name,
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          rhs: new IntLiteral(1),
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1),
+      '''
+0.foo += 1''');
+}
 
 void _testCompoundPropertySet() {
   testExpression(
@@ -956,6 +1054,47 @@
 
 void _testSuperIndexSet() {}
 
+void _testExtensionIndexGet() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Procedure getter = new Procedure(
+      new Name(''), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(getter);
+
+  testExpression(
+      new ExtensionIndexGet(
+          extension, null, new IntLiteral(0), getter, new IntLiteral(1),
+          isNullAware: false),
+      '''
+Extension(0)[1]''');
+
+  testExpression(
+      new ExtensionIndexGet(
+          extension, null, new IntLiteral(0), getter, new IntLiteral(1),
+          isNullAware: true),
+      '''
+Extension(0)?[1]''');
+
+  testExpression(
+      new ExtensionIndexGet(extension, [const VoidType()], new IntLiteral(0),
+          getter, new IntLiteral(1),
+          isNullAware: false),
+      '''
+Extension<void>(0)[1]''');
+
+  testExpression(
+      new ExtensionIndexGet(extension, [const VoidType()], new IntLiteral(0),
+          getter, new IntLiteral(1),
+          isNullAware: true),
+      '''
+Extension<void>(0)?[1]''');
+}
+
 void _testExtensionIndexSet() {
   Library library = new Library(dummyUri, fileUri: dummyUri);
   Extension extension = new Extension(
@@ -970,15 +1109,31 @@
 
   testExpression(
       new ExtensionIndexSet(extension, null, new IntLiteral(0), setter,
-          new IntLiteral(1), new IntLiteral(2)),
+          new IntLiteral(1), new IntLiteral(2),
+          isNullAware: false, forEffect: true),
       '''
 Extension(0)[1] = 2''');
 
   testExpression(
+      new ExtensionIndexSet(extension, null, new IntLiteral(0), setter,
+          new IntLiteral(1), new IntLiteral(2),
+          isNullAware: true, forEffect: false),
+      '''
+Extension(0)?[1] = 2''');
+
+  testExpression(
       new ExtensionIndexSet(extension, [const VoidType()], new IntLiteral(0),
-          setter, new IntLiteral(1), new IntLiteral(2)),
+          setter, new IntLiteral(1), new IntLiteral(2),
+          isNullAware: false, forEffect: false),
       '''
 Extension<void>(0)[1] = 2''');
+
+  testExpression(
+      new ExtensionIndexSet(extension, [const VoidType()], new IntLiteral(0),
+          setter, new IntLiteral(1), new IntLiteral(2),
+          isNullAware: true, forEffect: true),
+      '''
+Extension<void>(0)?[1] = 2''');
 }
 
 void _testIfNullIndexSet() {}
@@ -1103,15 +1258,648 @@
 
 void _testCompoundSuperIndexSet() {}
 
-void _testCompoundExtensionIndexSet() {}
+void _testExtensionCompoundIndexSet() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Procedure getter = new Procedure(
+      new Name('[]'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  Procedure setter = new Procedure(
+      new Name('[]='), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(setter);
 
-void _testExtensionSet() {}
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('-'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(2),
+          isNullAware: false,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: false),
+      '''
+Extension(0)[1] -= 2''');
 
-void _testNullAwareExtension() {}
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(2),
+          isNullAware: true,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: false),
+      '''
+Extension(0)?[1] += 2''');
+
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('-'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(1),
+          isNullAware: false,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: true),
+      '''
+Extension(0)[1]--''');
+
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(1),
+          isNullAware: true,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: true),
+      '''
+Extension(0)?[1]++''');
+
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(2),
+          isNullAware: false,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: false),
+      '''
+Extension<void>(0)[1] += 2''');
+
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('-'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(2),
+          isNullAware: true,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: false),
+      '''
+Extension<void>(0)?[1] -= 2''');
+
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('+'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(1),
+          isNullAware: false,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: true),
+      '''
+Extension<void>(0)[1]++''');
+
+  testExpression(
+      new ExtensionCompoundIndexSet(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          getter: getter,
+          setter: setter,
+          binaryName: new Name('-'),
+          index: new IntLiteral(1),
+          rhs: new IntLiteral(1),
+          isNullAware: true,
+          forEffect: false,
+          readOffset: -1,
+          binaryOffset: -1,
+          writeOffset: -1,
+          forPostIncDec: true),
+      '''
+Extension<void>(0)?[1]--''');
+}
+
+void _testExtensionGet() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure getter = new Procedure(new Name('Extension|get#foo'),
+      ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(getter);
+
+  testExpression(
+      new ExtensionGet.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          isNullAware: false),
+      '''
+Extension(0).foo''');
+
+  testExpression(
+      new ExtensionGet.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          isNullAware: true),
+      '''
+Extension(0)?.foo''');
+
+  testExpression(
+      new ExtensionGet.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          isNullAware: false),
+      '''
+Extension<void>(0).foo''');
+
+  testExpression(
+      new ExtensionGet.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          isNullAware: true),
+      '''
+Extension<void>(0)?.foo''');
+
+  testExpression(
+      new ExtensionGet.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          name: name,
+          getter: getter),
+      '''
+0.foo''');
+}
+
+void _testExtensionGetterInvocation() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure method = new Procedure(
+      new Name('Extension|foo'), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(method);
+
+  testExpression(
+      new ExtensionGetterInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: false),
+      '''
+Extension(0).foo(1)''');
+
+  testExpression(
+      new ExtensionGetterInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: true),
+      '''
+Extension(0)?.foo(1)''');
+
+  testExpression(
+      new ExtensionGetterInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: false),
+      '''
+Extension<void>(0).foo(1)''');
+
+  testExpression(
+      new ExtensionGetterInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: true),
+      '''
+Extension<void>(0)?.foo(1)''');
+
+  testExpression(
+      new ExtensionGetterInvocation.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)])),
+      '''
+0.foo(1)''');
+}
+
+void _testExtensionMethodInvocation() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure method = new Procedure(
+      new Name('Extension|foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(method);
+
+  testExpression(
+      new ExtensionMethodInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: false),
+      '''
+Extension(0).foo(1)''');
+
+  testExpression(
+      new ExtensionMethodInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: true),
+      '''
+Extension(0)?.foo(1)''');
+
+  testExpression(
+      new ExtensionMethodInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: false),
+      '''
+Extension<void>(0).foo(1)''');
+
+  testExpression(
+      new ExtensionMethodInvocation.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          extensionTypeArgumentOffset: -1,
+          receiver: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)]),
+          isNullAware: true),
+      '''
+Extension<void>(0)?.foo(1)''');
+
+  testExpression(
+      new ExtensionMethodInvocation.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          name: name,
+          target: method,
+          arguments: new ArgumentsImpl([new IntLiteral(1)])),
+      '''
+0.foo(1)''');
+}
+
+void _testExtensionPostIncDec() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure getter = new Procedure(
+      new Name('Extension|foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  Procedure setter = new Procedure(
+      new Name('Extension|foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(getter);
+  library.addProcedure(setter);
+
+  testExpression(
+      new ExtensionPostIncDec.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          setter: setter,
+          forEffect: false,
+          isInc: true,
+          isNullAware: false),
+      '''
+Extension(0).foo++''');
+
+  testExpression(
+      new ExtensionPostIncDec.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          setter: setter,
+          forEffect: false,
+          isInc: false,
+          isNullAware: true),
+      '''
+Extension(0)?.foo--''');
+
+  testExpression(
+      new ExtensionPostIncDec.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          setter: setter,
+          forEffect: false,
+          isInc: false,
+          isNullAware: false),
+      '''
+Extension<void>(0).foo--''');
+
+  testExpression(
+      new ExtensionPostIncDec.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          setter: setter,
+          forEffect: false,
+          isInc: true,
+          isNullAware: true),
+      '''
+Extension<void>(0)?.foo++''');
+
+  testExpression(
+      new ExtensionPostIncDec.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          name: name,
+          getter: getter,
+          setter: setter,
+          forEffect: false,
+          isInc: true),
+      '''
+0.foo++''');
+}
+
+void _testExtensionSet() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure setter = new Procedure(new Name('Extension|set#foo'),
+      ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(setter);
+
+  testExpression(
+      new ExtensionSet.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          setter: setter,
+          value: new IntLiteral(1),
+          isNullAware: false,
+          forEffect: true),
+      '''
+Extension(0).foo = 1''');
+
+  testExpression(
+      new ExtensionSet.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          setter: setter,
+          value: new IntLiteral(1),
+          isNullAware: true,
+          forEffect: false),
+      '''
+Extension(0)?.foo = 1''');
+
+  testExpression(
+      new ExtensionSet.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          setter: setter,
+          value: new IntLiteral(1),
+          isNullAware: false,
+          forEffect: false),
+      '''
+Extension<void>(0).foo = 1''');
+
+  testExpression(
+      new ExtensionSet.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          setter: setter,
+          value: new IntLiteral(1),
+          isNullAware: true,
+          forEffect: true),
+      '''
+Extension<void>(0)?.foo = 1''');
+
+  testExpression(
+      new ExtensionSet.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          name: name,
+          setter: setter,
+          value: new IntLiteral(1),
+          forEffect: true),
+      '''
+0.foo = 1''');
+}
 
 void _testPropertySetImpl() {}
 
-void _testExtensionTearOff() {}
+void _testExtensionTearOff() {
+  Library library = new Library(dummyUri, fileUri: dummyUri);
+  Extension extension = new Extension(
+      name: 'Extension',
+      typeParameters: [new TypeParameter('T')],
+      fileUri: dummyUri);
+  library.addExtension(extension);
+  Name name = new Name('foo');
+  Procedure tearOff = new Procedure(new Name('Extension|get#foo'),
+      ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri);
+  library.addProcedure(tearOff);
+
+  testExpression(
+      new ExtensionTearOff.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          tearOff: tearOff,
+          isNullAware: false),
+      '''
+Extension(0).foo''');
+
+  testExpression(
+      new ExtensionTearOff.explicit(
+          extension: extension,
+          explicitTypeArguments: null,
+          receiver: new IntLiteral(0),
+          name: name,
+          tearOff: tearOff,
+          isNullAware: true),
+      '''
+Extension(0)?.foo''');
+
+  testExpression(
+      new ExtensionTearOff.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          tearOff: tearOff,
+          isNullAware: false),
+      '''
+Extension<void>(0).foo''');
+
+  testExpression(
+      new ExtensionTearOff.explicit(
+          extension: extension,
+          explicitTypeArguments: [const VoidType()],
+          receiver: new IntLiteral(0),
+          name: name,
+          tearOff: tearOff,
+          isNullAware: true),
+      '''
+Extension<void>(0)?.foo''');
+
+  testExpression(
+      new ExtensionTearOff.implicit(
+          extension: extension,
+          thisTypeArguments: [
+            new TypeParameterType(
+                extension.typeParameters.single, Nullability.undetermined)
+          ],
+          thisAccess: new IntLiteral(0),
+          name: name,
+          tearOff: tearOff),
+      '''
+0.foo''');
+}
 
 void _testEqualsExpression() {
   testExpression(
diff --git a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.expect
index f977eb6..6f2babf 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.expect
@@ -186,8 +186,8 @@
     ;
   method method() → dynamic {
     this.{self::C::new}{core::int};
-    self::E|call<dynamic>(this.{self::C::new}{core::int});
-    self::E|call<core::int>(this.{self::C::new}{core::int});
+    let final core::int #t1 = this.{self::C::new}{core::int} in self::E|call<dynamic>(#t1);
+    let final core::int #t2 = this.{self::C::new}{core::int} in self::E|call<core::int>(#t2);
     this.{self::C::new} = 87;
   }
 }
@@ -208,7 +208,7 @@
   return d{dynamic}.new;
 static method test() → dynamic {
   new self::C::•().{self::C::new}{core::int};
-  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  let final core::int #t3 = new self::C::•().{self::C::new}{core::int} in self::E|call<dynamic>(#t3);
   new self::C::•().{self::C::new} = 87;
   self::C c = new self::C::•();
   c.{self::C::new}{core::int};
@@ -217,27 +217,27 @@
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
-  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
-  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
-  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
-  let final dynamic #t4 = foo in block {
-    #t4{dynamic}.new;
-  } =>#t4;
-  let final dynamic #t5 = foo in block {
-    #t5{dynamic}.new();
-  } =>#t5;
-  let final dynamic #t6 = foo in block {
-    #t6{dynamic}.new<core::int>();
-  } =>#t6;
+  let final dynamic #t4 = foo in #t4 == null ?{dynamic} null : #t4{dynamic}.new;
+  let final dynamic #t5 = foo in #t5 == null ?{dynamic} null : #t5{dynamic}.new();
+  let final dynamic #t6 = foo in #t6 == null ?{dynamic} null : #t6{dynamic}.new<core::int>();
+  let final dynamic #t7 = foo in block {
+    #t7{dynamic}.new;
+  } =>#t7;
+  let final dynamic #t8 = foo in block {
+    #t8{dynamic}.new();
+  } =>#t8;
+  let final dynamic #t9 = foo in block {
+    #t9{dynamic}.new<core::int>();
+  } =>#t9;
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
   self::new;
   self::E|call<dynamic>(self::new);
   self::E|call<core::int>(self::new);
-  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
-  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
-  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  let final dynamic #t10 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t11 = CheckLibraryIsLoaded(prefix2) in let final core::int #t12 = self::c.{self::C::new}{core::int} in self::E|call<dynamic>(#t12);
+  let final dynamic #t13 = CheckLibraryIsLoaded(prefix2) in let final core::int #t14 = self::c.{self::C::new}{core::int} in self::E|call<core::int>(#t14);
   self::E|get#new(0);
   self::E|call<dynamic>(self::E|get#new(0));
   self::E|call<core::int>(self::E|get#new(0));
diff --git a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.modular.expect
index f977eb6..6f2babf 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.modular.expect
@@ -186,8 +186,8 @@
     ;
   method method() → dynamic {
     this.{self::C::new}{core::int};
-    self::E|call<dynamic>(this.{self::C::new}{core::int});
-    self::E|call<core::int>(this.{self::C::new}{core::int});
+    let final core::int #t1 = this.{self::C::new}{core::int} in self::E|call<dynamic>(#t1);
+    let final core::int #t2 = this.{self::C::new}{core::int} in self::E|call<core::int>(#t2);
     this.{self::C::new} = 87;
   }
 }
@@ -208,7 +208,7 @@
   return d{dynamic}.new;
 static method test() → dynamic {
   new self::C::•().{self::C::new}{core::int};
-  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  let final core::int #t3 = new self::C::•().{self::C::new}{core::int} in self::E|call<dynamic>(#t3);
   new self::C::•().{self::C::new} = 87;
   self::C c = new self::C::•();
   c.{self::C::new}{core::int};
@@ -217,27 +217,27 @@
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
-  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
-  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
-  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
-  let final dynamic #t4 = foo in block {
-    #t4{dynamic}.new;
-  } =>#t4;
-  let final dynamic #t5 = foo in block {
-    #t5{dynamic}.new();
-  } =>#t5;
-  let final dynamic #t6 = foo in block {
-    #t6{dynamic}.new<core::int>();
-  } =>#t6;
+  let final dynamic #t4 = foo in #t4 == null ?{dynamic} null : #t4{dynamic}.new;
+  let final dynamic #t5 = foo in #t5 == null ?{dynamic} null : #t5{dynamic}.new();
+  let final dynamic #t6 = foo in #t6 == null ?{dynamic} null : #t6{dynamic}.new<core::int>();
+  let final dynamic #t7 = foo in block {
+    #t7{dynamic}.new;
+  } =>#t7;
+  let final dynamic #t8 = foo in block {
+    #t8{dynamic}.new();
+  } =>#t8;
+  let final dynamic #t9 = foo in block {
+    #t9{dynamic}.new<core::int>();
+  } =>#t9;
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
   self::new;
   self::E|call<dynamic>(self::new);
   self::E|call<core::int>(self::new);
-  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
-  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
-  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  let final dynamic #t10 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t11 = CheckLibraryIsLoaded(prefix2) in let final core::int #t12 = self::c.{self::C::new}{core::int} in self::E|call<dynamic>(#t12);
+  let final dynamic #t13 = CheckLibraryIsLoaded(prefix2) in let final core::int #t14 = self::c.{self::C::new}{core::int} in self::E|call<core::int>(#t14);
   self::E|get#new(0);
   self::E|call<dynamic>(self::E|get#new(0));
   self::E|call<core::int>(self::E|get#new(0));
diff --git a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.transformed.expect
index f977eb6..6f2babf 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.strong.transformed.expect
@@ -186,8 +186,8 @@
     ;
   method method() → dynamic {
     this.{self::C::new}{core::int};
-    self::E|call<dynamic>(this.{self::C::new}{core::int});
-    self::E|call<core::int>(this.{self::C::new}{core::int});
+    let final core::int #t1 = this.{self::C::new}{core::int} in self::E|call<dynamic>(#t1);
+    let final core::int #t2 = this.{self::C::new}{core::int} in self::E|call<core::int>(#t2);
     this.{self::C::new} = 87;
   }
 }
@@ -208,7 +208,7 @@
   return d{dynamic}.new;
 static method test() → dynamic {
   new self::C::•().{self::C::new}{core::int};
-  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  let final core::int #t3 = new self::C::•().{self::C::new}{core::int} in self::E|call<dynamic>(#t3);
   new self::C::•().{self::C::new} = 87;
   self::C c = new self::C::•();
   c.{self::C::new}{core::int};
@@ -217,27 +217,27 @@
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
-  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
-  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
-  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
-  let final dynamic #t4 = foo in block {
-    #t4{dynamic}.new;
-  } =>#t4;
-  let final dynamic #t5 = foo in block {
-    #t5{dynamic}.new();
-  } =>#t5;
-  let final dynamic #t6 = foo in block {
-    #t6{dynamic}.new<core::int>();
-  } =>#t6;
+  let final dynamic #t4 = foo in #t4 == null ?{dynamic} null : #t4{dynamic}.new;
+  let final dynamic #t5 = foo in #t5 == null ?{dynamic} null : #t5{dynamic}.new();
+  let final dynamic #t6 = foo in #t6 == null ?{dynamic} null : #t6{dynamic}.new<core::int>();
+  let final dynamic #t7 = foo in block {
+    #t7{dynamic}.new;
+  } =>#t7;
+  let final dynamic #t8 = foo in block {
+    #t8{dynamic}.new();
+  } =>#t8;
+  let final dynamic #t9 = foo in block {
+    #t9{dynamic}.new<core::int>();
+  } =>#t9;
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
   self::new;
   self::E|call<dynamic>(self::new);
   self::E|call<core::int>(self::new);
-  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
-  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
-  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  let final dynamic #t10 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t11 = CheckLibraryIsLoaded(prefix2) in let final core::int #t12 = self::c.{self::C::new}{core::int} in self::E|call<dynamic>(#t12);
+  let final dynamic #t13 = CheckLibraryIsLoaded(prefix2) in let final core::int #t14 = self::c.{self::C::new}{core::int} in self::E|call<core::int>(#t14);
   self::E|get#new(0);
   self::E|call<dynamic>(self::E|get#new(0));
   self::E|call<core::int>(self::E|get#new(0));
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect
index b888a84..da2bf04 100644
--- a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect
@@ -49,8 +49,8 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///main.dart:9:22 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
-Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:11:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
-Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:12:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
+Evaluated: VariableGet @ org-dartlang-testcase:///main.dart:11:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
+Evaluated: VariableGet @ org-dartlang-testcase:///main.dart:12:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
 Extra constant evaluation: evaluated: 21, effectively constant: 3
 
 
diff --git a/pkg/front_end/testcases/dot_shorthands/cascade_property.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/cascade_property.dart.strong.transformed.expect
index 0956290..9450cc1 100644
--- a/pkg/front_end/testcases/dot_shorthands/cascade_property.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dot_shorthands/cascade_property.dart.strong.transformed.expect
@@ -33,7 +33,7 @@
 }
 
 Extra constant evaluation status:
-Evaluated: VariableGetImpl @ org-dartlang-testcase:///cascade_property.dart:8:17 -> InstanceConstant(const Color{_Enum.index: 1, _Enum._name: "blue"})
+Evaluated: VariableGet @ org-dartlang-testcase:///cascade_property.dart:8:17 -> InstanceConstant(const Color{_Enum.index: 1, _Enum._name: "blue"})
 Evaluated: VariableGet @ org-dartlang-testcase:///cascade_property.dart:8:17 -> InstanceConstant(const Color{_Enum.index: 1, _Enum._name: "blue"})
 Extra constant evaluation: evaluated: 10, effectively constant: 2
 
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart b/pkg/front_end/testcases/extensions/check_bounds.dart
index aff6aa0..35a04c5 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart
@@ -11,8 +11,13 @@
 class Class<T extends A> {}
 
 extension Extension<T extends B> on Class<T> {
+  get property => 0;
+  set property(_) {}
   method() {}
   genericMethod<S extends B>(S s) {}
+  genericMethod2<S extends B>() {}
+  operator[](_) {}
+  operator[]=(_,_) {}
 }
 
 main() {}
@@ -22,36 +27,67 @@
   Class<B> classB = new Class<B>();
 
   classA.method(); // Error: Expect method not found.
+  classA.method; // Error: Expect method not found.
+  classA.property; // Error: Expect getter not found.
+  classA.property = null; // Error: Expect setter not found.
+  classA[0]; // Error: Expect index get not found.
+  classA[0] = null; // Error: Expect index set not found.
   Extension(classA).method(); // Error: Expect bounds mismatch.
+  Extension(classA).method; // Error: Expect bounds mismatch.
+  Extension(classA).property; // Error: Expect bounds mismatch.
+  Extension(classA).property = null; // Error: Expect bounds mismatch.
+  Extension(classA)[0]; // Error: Expect bounds mismatch.
+  Extension(classA)[0] = null; // Error: Expect bounds mismatch.
   Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-  Extension<B>(classB).method();
+  Extension<A>(classA).method; // Error: Expect bounds mismatch.
+  Extension<A>(classA).property; // Error: Expect bounds mismatch.
+  Extension<A>(classA).property = null; // Error: Expect bounds mismatch.
+  Extension<A>(classA)[0]; // Error: Expect bounds mismatch.
+  Extension<A>(classA)[0] = null; // Error: Expect bounds mismatch.
+  Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+  Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-  Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-  Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-  Extension<B>(classB).genericMethod<B>(a);
+
 
   classB.method();
-  Extension(classB).method();
-  Extension<A>(classB).method(); // Error: Expect bounds mismatch.
+  classB.method;
+  classB.property;
+  classB.property = null;
   Extension<B>(classB).method();
+  Extension<B>(classB).method;
+  Extension<B>(classB).property;
+  Extension<B>(classB).property = null;
+  Extension<B>(classB)[0];
+  Extension<B>(classB)[0] = null;
+  Extension<B>(classB).genericMethod();
+  Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+  Extension<B>(classB).genericMethod<A>(a); // Error: Argument type mismatch.
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
 
   classB.genericMethod(a); // Error: Expect bounds mismatch.
   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
-  classB.genericMethod<B>(a);
+  classB.genericMethod<B>(a); // Error: Argument type mismatch
+  Extension(classB).method();
+  Extension(classB).method;
+  Extension(classB).property;
+  Extension(classB).property = null;
+  Extension(classB)[0];
+  Extension(classB)[0] = null;
+  Extension(classB).genericMethod();
   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-  Extension(classB).genericMethod<B>(a);
+  Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
 }
 
 final A a = new A();
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect
index 1c84fb7..032422a 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect
@@ -2,549 +2,685 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Error: Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:99:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field3 = Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field4 = Extension<B>(classA).method();
 //                             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                                  ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:112:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field13 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:117:38: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field16 = Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//                 ^
+//                                      ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:121:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field19 = classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field20 = classB.genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:89:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:125:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                       ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field23 = Extension(classB).genericMethod<B>(a);
 //                                                    ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:100:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:136:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field29 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:34: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
+//                                  ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:37: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
+//                                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:37: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension<B>(classB).genericMethod();
+//                                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:81:34: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(classB).genericMethod();
+//                                  ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:29:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   classA.method(); // Error: Expect method not found.
 //          ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:25:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:10: Error: The getter 'method' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'method'.
+//   classA.method; // Error: Expect method not found.
+//          ^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:10: Error: The getter 'property' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   classA.property; // Error: Expect getter not found.
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:32:10: Error: The setter 'property' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   classA.property = null; // Error: Expect setter not found.
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:9: Error: The operator '[]' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   classA[0]; // Error: Expect index get not found.
+//         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:34:9: Error: The operator '[]=' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   classA[0] = null; // Error: Expect index set not found.
+//         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:35:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).method(); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:26:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:36:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).method; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:37:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).property; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:38:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).property = null; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:39:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA)[0]; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA)[0] = null; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:28:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:42:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).method; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart: Context: This is the type variable whose bound isn't conformed to.
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'property'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).property; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'property'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).property = null; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on '[]='.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA)[0]; // Error: Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:46:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on '[]='.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA)[0] = null; // Error: Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:28:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:29:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:29:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:30:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:34:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:35:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod<B>(a);
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   classB.genericMethod(a); // Error: Expect bounds mismatch.
-//                        ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
-//          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   classB.genericMethod<B>(a);
-//                           ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:46:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                   ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension(classB).genericMethod<B>(a);
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:49:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
 // pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
 // pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod<B>(a);
+//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:69:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Error: Argument type mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod(a); // Error: Expect bounds mismatch.
+//                        ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:73:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:74:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a); // Error: Argument type mismatch
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:82:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                   ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:83:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:88:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:89:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:90:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
 //                                         ^
 //
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
@@ -554,24 +690,24 @@
 //   classA.method();
 //          ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).method(); // Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).method(); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -584,24 +720,24 @@
 //   Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -620,33 +756,33 @@
 //   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -656,12 +792,12 @@
 //   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -672,13 +808,13 @@
 //   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -688,12 +824,12 @@
 //   Extension<B>(classB).genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).method(); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -704,13 +840,13 @@
 //   classB.genericMethod(a); // Expect bounds mismatch.
 //                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   classB.genericMethod<A>(a); // Expect bounds mismatch.
 //          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -726,13 +862,13 @@
 //   Extension(classB).genericMethod(a); // Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -748,33 +884,33 @@
 //   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -784,12 +920,12 @@
 //   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -800,13 +936,13 @@
 //   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -836,77 +972,83 @@
     ;
 }
 extension Extension<T extends self::B> on self::Class<T> {
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
   method method = self::Extension|method;
   method tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   method tearoff genericMethod = self::Extension|get#genericMethod;
+  method genericMethod2 = self::Extension|genericMethod2;
+  method tearoff genericMethod2 = self::Extension|get#genericMethod2;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
 }
 static final field self::A a = new self::A::•();
 static final field self::Class<self::A> classA = new self::Class::•<self::A>();
 static final field self::Class<self::B> classB = new self::Class::•<self::B>();
-static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
 final field1 = classA.method(); // Error: Expect method not found.
                       ^^^^^^" in self::classA{<unresolved>}.method();
-static final field dynamic field2 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field2 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
                          ^" in self::classA as{TypeError} self::Class<self::B>);
 static final field dynamic field3 = self::Extension|method<self::A>(self::classA);
-static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field4 = Extension<B>(classA).method();
                             ^" in self::classA as{TypeError} self::Class<self::B>);
-static final field dynamic field5 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field5 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
-                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                                ^" in self::a as{TypeError} self::B);
-static final field dynamic field6 = self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field6 = self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
                          ^" in self::classA as{TypeError} self::Class<self::B>, self::a);
-static final field dynamic field7 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field7 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                                   ^" in self::a as{TypeError} self::B);
-static final field dynamic field8 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field8 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                                   ^" in self::a as{TypeError} self::B);
 static final field dynamic field9 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
-static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                           ^" in self::a as{TypeError} self::B);
-static final field dynamic field11 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field11 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field12 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field13 = Extension<B>(classB).genericMethod<B>(a);
@@ -915,169 +1057,265 @@
 static final field dynamic field15 = self::Extension|method<self::B>(self::classB);
 static final field dynamic field16 = self::Extension|method<self::A>(self::classB);
 static final field dynamic field17 = self::Extension|method<self::B>(self::classB);
-static final field dynamic field18 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field18 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in self::a as{TypeError} self::B);
 static final field dynamic field19 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field20 = classB.genericMethod<B>(a);
                                         ^" in self::a as{TypeError} self::B);
-static final field dynamic field21 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field21 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                                 ^" in self::a as{TypeError} self::B);
 static final field dynamic field22 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field23 = Extension(classB).genericMethod<B>(a);
                                                    ^" in self::a as{TypeError} self::B);
-static final field dynamic field24 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field24 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field25 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
-static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                           ^" in self::a as{TypeError} self::B);
-static final field dynamic field27 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field27 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field28 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field29 = Extension<B>(classB).genericMethod<B>(a);
                                                       ^" in self::a as{TypeError} self::B);
+static extension-member method Extension|get#property<T extends self::B>(lowered final self::Class<self::Extension|get#property::T> #this) → dynamic
+  return 0;
+static extension-member method Extension|set#property<T extends self::B>(lowered final self::Class<self::Extension|set#property::T> #this, wildcard dynamic _#wc0#formal) → void {}
 static extension-member method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic {}
 static extension-member method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
   return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
 static extension-member method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic {}
 static extension-member method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
   return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
+static extension-member method Extension|genericMethod2<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod2::T> #this) → dynamic {}
+static extension-member method Extension|get#genericMethod2<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod2::T> #this) → <S extends self::B>() → dynamic
+  return <S extends self::B>() → dynamic => self::Extension|genericMethod2<self::Extension|get#genericMethod2::T, S>(#this);
+static extension-member method Extension|[]<T extends self::B>(lowered final self::Class<self::Extension|[]::T> #this, wildcard dynamic _#wc1#formal) → dynamic {}
+static extension-member method Extension|[]=<T extends self::B>(lowered final self::Class<self::Extension|[]=::T> #this, wildcard dynamic _#wc2#formal, wildcard dynamic _#wc3#formal) → void {}
 static method main() → dynamic {}
 static method test(self::A a) → dynamic {
   self::Class<self::A> classA = new self::Class::•<self::A>();
   self::Class<self::B> classB = new self::Class::•<self::B>();
-  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:29:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method(); // Error: Expect method not found.
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:25:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:10: Error: The getter 'method' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'method'.
+  classA.method; // Error: Expect method not found.
+         ^^^^^^" in classA{<unresolved>}.method;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:31:10: Error: The getter 'property' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  classA.property; // Error: Expect getter not found.
+         ^^^^^^^^" in classA{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:32:10: Error: The setter 'property' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  classA.property = null; // Error: Expect setter not found.
+         ^^^^^^^^" in classA.{<unresolved>}property = null;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:9: Error: The operator '[]' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  classA[0]; // Error: Expect index get not found.
+        ^" in classA{<unresolved>}.[](0);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:34:9: Error: The operator '[]=' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  classA[0] = null; // Error: Expect index set not found.
+        ^" in classA{<unresolved>}.[]=(0, null);
+  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:35:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).method(); // Error: Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|get#method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).method; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|get#property<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:37:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).property; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|set#property<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:38:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).property = null; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, null);
+  self::Extension|[]<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:39:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA)[0]; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, 0);
+  self::Extension|[]=<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:40:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA)[0] = null; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, 0, null);
   self::Extension|method<self::A>(classA);
-  self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:28:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|get#method<self::A>(classA);
+  self::Extension|get#property<self::A>(classA);
+  self::Extension|set#property<self::A>(classA, null);
+  self::Extension|[]<self::A>(classA, 0);
+  self::Extension|[]=<self::A>(classA, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:47:34: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
+                                 ^";
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
-            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:28:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:29:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:49:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>, a);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:50:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:50:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:31:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:37: Error: Too few positional arguments: 1 required, 0 given.
+  Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
+                                    ^";
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::A, self::A>(classA, a);
-  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:34:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|[]<self::B>(classB, 0);
+  self::Extension|[]=<self::B>(classB, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:37: Error: Too few positional arguments: 1 required, 0 given.
+  Extension<B>(classB).genericMethod();
+                                    ^";
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:68:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:70:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|method<self::B>(classB);
-  self::Extension|method<self::B>(classB);
-  self::Extension|method<self::A>(classB);
-  self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   classB.genericMethod(a); // Error: Expect bounds mismatch.
                        ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:74:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  classB.genericMethod<B>(a);
+  classB.genericMethod<B>(a); // Error: Argument type mismatch
                           ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:46:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|[]<self::B>(classB, 0);
+  self::Extension|[]=<self::B>(classB, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:81:34: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(classB).genericMethod();
+                                 ^";
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:82:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension(classB).genericMethod<B>(a);
+  Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
                                      ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:49:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:85:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::A, self::A>(classB, a);
-  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:87:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:88:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
                                         ^" in a as{TypeError} self::B);
 }
 static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic {
@@ -1089,7 +1327,7 @@
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method();
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -1097,7 +1335,7 @@
             ^" in classA as{TypeError} self::Class<self::B>);
   self::Extension|method<self::A>(classA);
   self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -1107,13 +1345,13 @@
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>, a);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.modular.expect
index 1c84fb7..032422a 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.modular.expect
@@ -2,549 +2,685 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Error: Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:99:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field3 = Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field4 = Extension<B>(classA).method();
 //                             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                                  ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:112:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field13 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:117:38: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field16 = Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//                 ^
+//                                      ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:121:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field19 = classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field20 = classB.genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:89:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:125:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                       ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field23 = Extension(classB).genericMethod<B>(a);
 //                                                    ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:100:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:136:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field29 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:34: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
+//                                  ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:37: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
+//                                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:37: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension<B>(classB).genericMethod();
+//                                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:81:34: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(classB).genericMethod();
+//                                  ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:29:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   classA.method(); // Error: Expect method not found.
 //          ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:25:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:10: Error: The getter 'method' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'method'.
+//   classA.method; // Error: Expect method not found.
+//          ^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:10: Error: The getter 'property' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   classA.property; // Error: Expect getter not found.
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:32:10: Error: The setter 'property' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   classA.property = null; // Error: Expect setter not found.
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:9: Error: The operator '[]' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   classA[0]; // Error: Expect index get not found.
+//         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:34:9: Error: The operator '[]=' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   classA[0] = null; // Error: Expect index set not found.
+//         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:35:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).method(); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:26:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:36:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).method; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:37:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).property; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:38:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).property = null; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:39:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA)[0]; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA)[0] = null; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:28:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:42:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).method; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart: Context: This is the type variable whose bound isn't conformed to.
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'property'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).property; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'property'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).property = null; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on '[]='.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA)[0]; // Error: Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:46:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on '[]='.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA)[0] = null; // Error: Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:28:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:29:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:29:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:30:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:34:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:35:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod<B>(a);
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   classB.genericMethod(a); // Error: Expect bounds mismatch.
-//                        ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
-//          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   classB.genericMethod<B>(a);
-//                           ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:46:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                   ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension(classB).genericMethod<B>(a);
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:49:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
 // pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
 // pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod<B>(a);
+//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:69:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Error: Argument type mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod(a); // Error: Expect bounds mismatch.
+//                        ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:73:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:74:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a); // Error: Argument type mismatch
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:82:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                   ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:83:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:88:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:89:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:90:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
 //                                         ^
 //
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
@@ -554,24 +690,24 @@
 //   classA.method();
 //          ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).method(); // Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).method(); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -584,24 +720,24 @@
 //   Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -620,33 +756,33 @@
 //   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -656,12 +792,12 @@
 //   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -672,13 +808,13 @@
 //   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -688,12 +824,12 @@
 //   Extension<B>(classB).genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).method(); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -704,13 +840,13 @@
 //   classB.genericMethod(a); // Expect bounds mismatch.
 //                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   classB.genericMethod<A>(a); // Expect bounds mismatch.
 //          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -726,13 +862,13 @@
 //   Extension(classB).genericMethod(a); // Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -748,33 +884,33 @@
 //   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -784,12 +920,12 @@
 //   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -800,13 +936,13 @@
 //   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -836,77 +972,83 @@
     ;
 }
 extension Extension<T extends self::B> on self::Class<T> {
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
   method method = self::Extension|method;
   method tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   method tearoff genericMethod = self::Extension|get#genericMethod;
+  method genericMethod2 = self::Extension|genericMethod2;
+  method tearoff genericMethod2 = self::Extension|get#genericMethod2;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
 }
 static final field self::A a = new self::A::•();
 static final field self::Class<self::A> classA = new self::Class::•<self::A>();
 static final field self::Class<self::B> classB = new self::Class::•<self::B>();
-static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
 final field1 = classA.method(); // Error: Expect method not found.
                       ^^^^^^" in self::classA{<unresolved>}.method();
-static final field dynamic field2 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field2 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
                          ^" in self::classA as{TypeError} self::Class<self::B>);
 static final field dynamic field3 = self::Extension|method<self::A>(self::classA);
-static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field4 = Extension<B>(classA).method();
                             ^" in self::classA as{TypeError} self::Class<self::B>);
-static final field dynamic field5 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field5 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
-                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                                ^" in self::a as{TypeError} self::B);
-static final field dynamic field6 = self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field6 = self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
                          ^" in self::classA as{TypeError} self::Class<self::B>, self::a);
-static final field dynamic field7 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field7 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                                   ^" in self::a as{TypeError} self::B);
-static final field dynamic field8 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field8 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                                   ^" in self::a as{TypeError} self::B);
 static final field dynamic field9 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
-static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                           ^" in self::a as{TypeError} self::B);
-static final field dynamic field11 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field11 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field12 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field13 = Extension<B>(classB).genericMethod<B>(a);
@@ -915,169 +1057,265 @@
 static final field dynamic field15 = self::Extension|method<self::B>(self::classB);
 static final field dynamic field16 = self::Extension|method<self::A>(self::classB);
 static final field dynamic field17 = self::Extension|method<self::B>(self::classB);
-static final field dynamic field18 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field18 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in self::a as{TypeError} self::B);
 static final field dynamic field19 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field20 = classB.genericMethod<B>(a);
                                         ^" in self::a as{TypeError} self::B);
-static final field dynamic field21 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field21 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                                 ^" in self::a as{TypeError} self::B);
 static final field dynamic field22 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field23 = Extension(classB).genericMethod<B>(a);
                                                    ^" in self::a as{TypeError} self::B);
-static final field dynamic field24 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field24 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field25 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
-static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                           ^" in self::a as{TypeError} self::B);
-static final field dynamic field27 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field27 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field28 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field29 = Extension<B>(classB).genericMethod<B>(a);
                                                       ^" in self::a as{TypeError} self::B);
+static extension-member method Extension|get#property<T extends self::B>(lowered final self::Class<self::Extension|get#property::T> #this) → dynamic
+  return 0;
+static extension-member method Extension|set#property<T extends self::B>(lowered final self::Class<self::Extension|set#property::T> #this, wildcard dynamic _#wc0#formal) → void {}
 static extension-member method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic {}
 static extension-member method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
   return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
 static extension-member method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic {}
 static extension-member method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
   return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
+static extension-member method Extension|genericMethod2<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod2::T> #this) → dynamic {}
+static extension-member method Extension|get#genericMethod2<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod2::T> #this) → <S extends self::B>() → dynamic
+  return <S extends self::B>() → dynamic => self::Extension|genericMethod2<self::Extension|get#genericMethod2::T, S>(#this);
+static extension-member method Extension|[]<T extends self::B>(lowered final self::Class<self::Extension|[]::T> #this, wildcard dynamic _#wc1#formal) → dynamic {}
+static extension-member method Extension|[]=<T extends self::B>(lowered final self::Class<self::Extension|[]=::T> #this, wildcard dynamic _#wc2#formal, wildcard dynamic _#wc3#formal) → void {}
 static method main() → dynamic {}
 static method test(self::A a) → dynamic {
   self::Class<self::A> classA = new self::Class::•<self::A>();
   self::Class<self::B> classB = new self::Class::•<self::B>();
-  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:29:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method(); // Error: Expect method not found.
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:25:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:10: Error: The getter 'method' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'method'.
+  classA.method; // Error: Expect method not found.
+         ^^^^^^" in classA{<unresolved>}.method;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:31:10: Error: The getter 'property' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  classA.property; // Error: Expect getter not found.
+         ^^^^^^^^" in classA{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:32:10: Error: The setter 'property' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  classA.property = null; // Error: Expect setter not found.
+         ^^^^^^^^" in classA.{<unresolved>}property = null;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:9: Error: The operator '[]' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  classA[0]; // Error: Expect index get not found.
+        ^" in classA{<unresolved>}.[](0);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:34:9: Error: The operator '[]=' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  classA[0] = null; // Error: Expect index set not found.
+        ^" in classA{<unresolved>}.[]=(0, null);
+  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:35:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).method(); // Error: Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|get#method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).method; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|get#property<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:37:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).property; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|set#property<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:38:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).property = null; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, null);
+  self::Extension|[]<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:39:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA)[0]; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, 0);
+  self::Extension|[]=<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:40:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA)[0] = null; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, 0, null);
   self::Extension|method<self::A>(classA);
-  self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:28:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|get#method<self::A>(classA);
+  self::Extension|get#property<self::A>(classA);
+  self::Extension|set#property<self::A>(classA, null);
+  self::Extension|[]<self::A>(classA, 0);
+  self::Extension|[]=<self::A>(classA, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:47:34: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
+                                 ^";
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
-            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:28:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:29:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:49:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>, a);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:50:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:50:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:31:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:37: Error: Too few positional arguments: 1 required, 0 given.
+  Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
+                                    ^";
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::A, self::A>(classA, a);
-  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:34:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|[]<self::B>(classB, 0);
+  self::Extension|[]=<self::B>(classB, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:37: Error: Too few positional arguments: 1 required, 0 given.
+  Extension<B>(classB).genericMethod();
+                                    ^";
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:68:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:70:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|method<self::B>(classB);
-  self::Extension|method<self::B>(classB);
-  self::Extension|method<self::A>(classB);
-  self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   classB.genericMethod(a); // Error: Expect bounds mismatch.
                        ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:74:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  classB.genericMethod<B>(a);
+  classB.genericMethod<B>(a); // Error: Argument type mismatch
                           ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:46:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|[]<self::B>(classB, 0);
+  self::Extension|[]=<self::B>(classB, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:81:34: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(classB).genericMethod();
+                                 ^";
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:82:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension(classB).genericMethod<B>(a);
+  Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
                                      ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:49:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:85:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::A, self::A>(classB, a);
-  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:87:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:88:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
                                         ^" in a as{TypeError} self::B);
 }
 static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic {
@@ -1089,7 +1327,7 @@
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method();
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -1097,7 +1335,7 @@
             ^" in classA as{TypeError} self::Class<self::B>);
   self::Extension|method<self::A>(classA);
   self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -1107,13 +1345,13 @@
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>, a);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.outline.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.outline.expect
index df01422..ef7edce 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.outline.expect
@@ -2,277 +2,277 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Error: Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:99:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field3 = Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field4 = Extension<B>(classA).method();
 //                             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                                  ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:112:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field13 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:117:38: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field16 = Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//                 ^
+//                                      ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:121:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field19 = classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field20 = classB.genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:89:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:125:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                       ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field23 = Extension(classB).genericMethod<B>(a);
 //                                                    ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:100:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:136:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field29 = Extension<B>(classB).genericMethod<B>(a);
@@ -295,10 +295,16 @@
     ;
 }
 extension Extension<T extends self::B> on self::Class<T> {
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
   method method = self::Extension|method;
   method tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   method tearoff genericMethod = self::Extension|get#genericMethod;
+  method genericMethod2 = self::Extension|genericMethod2;
+  method tearoff genericMethod2 = self::Extension|get#genericMethod2;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
 }
 static final field self::A a;
 static final field self::Class<self::A> classA;
@@ -332,6 +338,10 @@
 static final field dynamic field27;
 static final field dynamic field28;
 static final field dynamic field29;
+static extension-member method Extension|get#property<T extends self::B>(lowered final self::Class<self::Extension|get#property::T> #this) → dynamic
+  ;
+static extension-member method Extension|set#property<T extends self::B>(lowered final self::Class<self::Extension|set#property::T> #this, wildcard dynamic _#wc0#formal) → void
+  ;
 static extension-member method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic
   ;
 static extension-member method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
@@ -340,6 +350,14 @@
   ;
 static extension-member method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
   return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
+static extension-member method Extension|genericMethod2<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod2::T> #this) → dynamic
+  ;
+static extension-member method Extension|get#genericMethod2<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod2::T> #this) → <S extends self::B>() → dynamic
+  return <S extends self::B>() → dynamic => self::Extension|genericMethod2<self::Extension|get#genericMethod2::T, S>(#this);
+static extension-member method Extension|[]<T extends self::B>(lowered final self::Class<self::Extension|[]::T> #this, wildcard dynamic _#wc1#formal) → dynamic
+  ;
+static extension-member method Extension|[]=<T extends self::B>(lowered final self::Class<self::Extension|[]=::T> #this, wildcard dynamic _#wc2#formal, wildcard dynamic _#wc3#formal) → void
+  ;
 static method main() → dynamic
   ;
 static method test(self::A a) → dynamic
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect
index 1c84fb7..032422a 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect
@@ -2,549 +2,685 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Error: Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:99:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field3 = Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field4 = Extension<B>(classA).method();
 //                             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:66:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:102:34: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                                  ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                          ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:104:37: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                ^
+//                                     ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:106:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:108:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:112:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field13 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:117:38: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field16 = Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//                 ^
+//                                      ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:121:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // final field19 = classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field20 = classB.genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:89:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:125:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                       ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field23 = Extension(classB).genericMethod<B>(a);
 //                                                    ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:128:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:130:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                           ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:132:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//     ^
+//                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
 //                                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:100:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:136:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // final field29 = Extension<B>(classB).genericMethod<B>(a);
 //                                                       ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:34: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
+//                                  ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:37: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
+//                                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:37: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension<B>(classB).genericMethod();
+//                                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:81:34: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(classB).genericMethod();
+//                                  ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:3: Context: Found this candidate, but the arguments don't match.
+//   genericMethod<S extends B>(S s) {}
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:29:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   classA.method(); // Error: Expect method not found.
 //          ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:25:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:10: Error: The getter 'method' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'method'.
+//   classA.method; // Error: Expect method not found.
+//          ^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:10: Error: The getter 'property' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   classA.property; // Error: Expect getter not found.
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:32:10: Error: The setter 'property' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   classA.property = null; // Error: Expect setter not found.
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:9: Error: The operator '[]' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   classA[0]; // Error: Expect index get not found.
+//         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:34:9: Error: The operator '[]=' isn't defined for the type 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   classA[0] = null; // Error: Expect index set not found.
+//         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:35:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).method(); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:26:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:36:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).method; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:37:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).property; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:38:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).property = null; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:39:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA)[0]; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA)[0] = null; // Error: Expect bounds mismatch.
+//             ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).method(); // Error: Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:28:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:42:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).method; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart: Context: This is the type variable whose bound isn't conformed to.
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'property'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).property; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'property'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).property = null; // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on '[]='.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA)[0]; // Error: Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:46:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on '[]='.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA)[0] = null; // Error: Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:28:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:29:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:29:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:30:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:34:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:35:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod<B>(a);
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).method(); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   classB.genericMethod(a); // Error: Expect bounds mismatch.
-//                        ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
-//          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   classB.genericMethod<B>(a);
-//                           ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:46:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                   ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension(classB).genericMethod<B>(a);
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:49:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//                                      ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//                                         ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
 // pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
 // pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//   Extension<B>(classB).genericMethod<B>(a);
+//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:69:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Error: Argument type mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod(a); // Error: Expect bounds mismatch.
+//                        ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:73:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   classB.genericMethod<A>(a); // Error: Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:74:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a); // Error: Argument type mismatch
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:82:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                   ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:83:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:88:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:89:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Error: Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:90:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
 //                                         ^
 //
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
@@ -554,24 +690,24 @@
 //   classA.method();
 //          ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).method(); // Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).method(); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -584,24 +720,24 @@
 //   Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
 //             ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -620,33 +756,33 @@
 //   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -656,12 +792,12 @@
 //   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -672,13 +808,13 @@
 //   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -688,12 +824,12 @@
 //   Extension<B>(classB).genericMethod<B>(a);
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).method(); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -704,13 +840,13 @@
 //   classB.genericMethod(a); // Expect bounds mismatch.
 //                        ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   classB.genericMethod<A>(a); // Expect bounds mismatch.
 //          ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -726,13 +862,13 @@
 //   Extension(classB).genericMethod(a); // Expect bounds mismatch.
 //                                   ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                     ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -748,33 +884,33 @@
 //   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
-//   ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -784,12 +920,12 @@
 //   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
 //                                         ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
-//   ^
+//                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
@@ -800,13 +936,13 @@
 //   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                                      ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/extensions/check_bounds.dart:17:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
@@ -836,77 +972,83 @@
     ;
 }
 extension Extension<T extends self::B> on self::Class<T> {
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
   method method = self::Extension|method;
   method tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   method tearoff genericMethod = self::Extension|get#genericMethod;
+  method genericMethod2 = self::Extension|genericMethod2;
+  method tearoff genericMethod2 = self::Extension|get#genericMethod2;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
 }
 static final field self::A a = new self::A::•();
 static final field self::Class<self::A> classA = new self::Class::•<self::A>();
 static final field self::Class<self::B> classB = new self::Class::•<self::B>();
-static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:97:23: Error: The method 'method' isn't defined for the type 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
 final field1 = classA.method(); // Error: Expect method not found.
                       ^^^^^^" in self::classA{<unresolved>}.method();
-static final field dynamic field2 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:62:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field2 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field2 = Extension(classA).method(); // Error: Expect bounds mismatch.
                          ^" in self::classA as{TypeError} self::Class<self::B>);
 static final field dynamic field3 = self::Extension|method<self::A>(self::classA);
-static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:100:29: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field4 = Extension<B>(classA).method();
                             ^" in self::classA as{TypeError} self::Class<self::B>);
-static final field dynamic field5 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:65:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field5 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
-                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:65:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:48: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field5 = Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                                ^" in self::a as{TypeError} self::B);
-static final field dynamic field6 = self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:66:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field6 = self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:102:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field6 = Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
                          ^" in self::classA as{TypeError} self::Class<self::B>, self::a);
-static final field dynamic field7 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:26: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+static final field dynamic field7 = self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:103:26: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+                         ^" in self::classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:103:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field7 = Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                                   ^" in self::a as{TypeError} self::B);
-static final field dynamic field8 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:68:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field8 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:104:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field8 = Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                                   ^" in self::a as{TypeError} self::B);
 static final field dynamic field9 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
-static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:108:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                           ^" in self::a as{TypeError} self::B);
-static final field dynamic field11 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:74:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field11 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:110:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field12 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:113:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field13 = Extension<B>(classB).genericMethod<B>(a);
@@ -915,169 +1057,265 @@
 static final field dynamic field15 = self::Extension|method<self::B>(self::classB);
 static final field dynamic field16 = self::Extension|method<self::A>(self::classB);
 static final field dynamic field17 = self::Extension|method<self::B>(self::classB);
-static final field dynamic field18 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field18 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:120:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field18 = classB.genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in self::a as{TypeError} self::B);
 static final field dynamic field19 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:122:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field20 = classB.genericMethod<B>(a);
                                         ^" in self::a as{TypeError} self::B);
-static final field dynamic field21 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:87:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field21 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:123:49: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field21 = Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                                 ^" in self::a as{TypeError} self::B);
 static final field dynamic field22 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:126:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field23 = Extension(classB).genericMethod<B>(a);
                                                    ^" in self::a as{TypeError} self::B);
-static final field dynamic field24 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:92:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field24 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:128:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field25 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
-static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:132:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                           ^" in self::a as{TypeError} self::B);
-static final field dynamic field27 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:98:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field27 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:134:40: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
     Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                        ^" in self::a as{TypeError} self::B);
 static final field dynamic field28 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
-static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:137:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 final field29 = Extension<B>(classB).genericMethod<B>(a);
                                                       ^" in self::a as{TypeError} self::B);
+static extension-member method Extension|get#property<T extends self::B>(lowered final self::Class<self::Extension|get#property::T> #this) → dynamic
+  return 0;
+static extension-member method Extension|set#property<T extends self::B>(lowered final self::Class<self::Extension|set#property::T> #this, wildcard dynamic _#wc0#formal) → void {}
 static extension-member method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic {}
 static extension-member method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
   return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
 static extension-member method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic {}
 static extension-member method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
   return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
+static extension-member method Extension|genericMethod2<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod2::T> #this) → dynamic {}
+static extension-member method Extension|get#genericMethod2<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod2::T> #this) → <S extends self::B>() → dynamic
+  return <S extends self::B>() → dynamic => self::Extension|genericMethod2<self::Extension|get#genericMethod2::T, S>(#this);
+static extension-member method Extension|[]<T extends self::B>(lowered final self::Class<self::Extension|[]::T> #this, wildcard dynamic _#wc1#formal) → dynamic {}
+static extension-member method Extension|[]=<T extends self::B>(lowered final self::Class<self::Extension|[]=::T> #this, wildcard dynamic _#wc2#formal, wildcard dynamic _#wc3#formal) → void {}
 static method main() → dynamic {}
 static method test(self::A a) → dynamic {
   self::Class<self::A> classA = new self::Class::•<self::A>();
   self::Class<self::B> classB = new self::Class::•<self::B>();
-  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:29:10: Error: The method 'method' isn't defined for the type 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method(); // Error: Expect method not found.
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:25:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:10: Error: The getter 'method' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'method'.
+  classA.method; // Error: Expect method not found.
+         ^^^^^^" in classA{<unresolved>}.method;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:31:10: Error: The getter 'property' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  classA.property; // Error: Expect getter not found.
+         ^^^^^^^^" in classA{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:32:10: Error: The setter 'property' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  classA.property = null; // Error: Expect setter not found.
+         ^^^^^^^^" in classA.{<unresolved>}property = null;
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:9: Error: The operator '[]' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  classA[0]; // Error: Expect index get not found.
+        ^" in classA{<unresolved>}.[](0);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:34:9: Error: The operator '[]=' isn't defined for the type 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  classA[0] = null; // Error: Expect index set not found.
+        ^" in classA{<unresolved>}.[]=(0, null);
+  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:35:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).method(); // Error: Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|get#method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).method; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|get#property<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:37:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).property; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>);
+  self::Extension|set#property<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:38:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).property = null; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, null);
+  self::Extension|[]<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:39:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA)[0]; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, 0);
+  self::Extension|[]=<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:40:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA)[0] = null; // Error: Expect bounds mismatch.
+            ^" in classA as{TypeError} self::Class<self::B>, 0, null);
   self::Extension|method<self::A>(classA);
-  self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:28:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|get#method<self::A>(classA);
+  self::Extension|get#property<self::A>(classA);
+  self::Extension|set#property<self::A>(classA, null);
+  self::Extension|[]<self::A>(classA, 0);
+  self::Extension|[]=<self::A>(classA, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:47:34: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(classA).genericMethod(); // Error: Expect bounds mismatch.
+                                 ^";
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
-            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:28:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:29:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:49:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<A>(a); // Error: Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>, a);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:50:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
-            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+            ^" in classA as{TypeError} self::Class<self::B>, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:50:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:31:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:37: Error: Too few positional arguments: 1 required, 0 given.
+  Extension<A>(classA).genericMethod(); // Error: Expect bounds mismatch.
+                                    ^";
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classA).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::A, self::A>(classA, a);
-  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classA).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:34:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|[]<self::B>(classB, 0);
+  self::Extension|[]=<self::B>(classB, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:37: Error: Too few positional arguments: 1 required, 0 given.
+  Extension<B>(classB).genericMethod();
+                                    ^";
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:68:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:70:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|method<self::B>(classB);
-  self::Extension|method<self::B>(classB);
-  self::Extension|method<self::A>(classB);
-  self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:24: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   classB.genericMethod(a); // Error: Expect bounds mismatch.
                        ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:74:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  classB.genericMethod<B>(a);
+  classB.genericMethod<B>(a); // Error: Argument type mismatch
                           ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:46:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|method<self::B>(classB);
+  self::Extension|get#method<self::B>(classB);
+  self::Extension|get#property<self::B>(classB);
+  self::Extension|set#property<self::B>(classB, null);
+  self::Extension|[]<self::B>(classB, 0);
+  self::Extension|[]=<self::B>(classB, 0, null);
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:81:34: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(classB).genericMethod();
+                                 ^";
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:82:35: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:84:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension(classB).genericMethod<B>(a);
+  Extension(classB).genericMethod<B>(a); // Error: Argument type mismatch
                                      ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:49:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:85:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::A, self::A>(classB, a);
-  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:87:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<A>(classB).genericMethod<B>(a); // Error: Expect bounds mismatch.
                                         ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:52:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:88:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension<B>(classB).genericMethod(a); // Error: Expect bounds mismatch.
                                      ^" in a as{TypeError} self::B);
   self::Extension|genericMethod<self::B, self::A>(classB, a);
-  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-  Extension<B>(classB).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod<B>(a); // Error: Argument type mismatch
                                         ^" in a as{TypeError} self::B);
 }
 static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic {
@@ -1089,7 +1327,7 @@
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method();
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -1097,7 +1335,7 @@
             ^" in classA as{TypeError} self::Class<self::B>);
   self::Extension|method<self::A>(classA);
   self::Extension|method<self::B>(classB);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -1107,13 +1345,13 @@
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod(a); // Expect bounds mismatch.
                                   ^" in a as{TypeError} self::B);
-  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::A>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
             ^" in classA as{TypeError} self::Class<self::B>, a);
-  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+  self::Extension|genericMethod<self::B, self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:13: Error: A value of type 'Class<A>' can't be assigned to a variable of type 'Class<B>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect
index 64ae96d..5db415d 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect
@@ -7,8 +7,13 @@
 class Class<T extends A> {}
 
 extension Extension<T extends B> on Class<T> {
+  get property => 0;
+  set property(_) {}
   method() {}
   genericMethod<S extends B>(S s) {}
+  genericMethod2<S extends B>() {}
+  operator [](_) {}
+  operator []=(_, _) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect
index d2221ca..36c596c 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect
@@ -8,7 +8,12 @@
 
 extension Extension<T extends B> on Class<T> {
   genericMethod<S extends B>(S s) {}
+  genericMethod2<S extends B>() {}
+  get property => 0;
   method() {}
+  operator [](_) {}
+  operator []=(_, _) {}
+  set property(_) {}
 }
 
 final A a = new A();
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.strong.expect b/pkg/front_end/testcases/extensions/compounds.dart.strong.expect
index 5c90988..d75e408 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.strong.expect
@@ -83,8 +83,8 @@
   self::expect(n0, let final self::Number #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
   self::expect(n1, let final self::Number #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
   self::expect(n0, let final self::Number #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
-  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final self::Number #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
-  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final self::Number #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final void #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final void #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@@ -125,8 +125,8 @@
   self::expect(n0, let final core::int #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
   self::expect(n1, let final core::int #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
   self::expect(n0, let final core::int #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
-  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final core::int #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
-  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final core::int #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
+  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final void #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
+  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final void #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
@@ -344,27 +344,27 @@
   self::expect(n0, let final self::Class #t185 = v in let final self::Number #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
   self::expect(n1, let final self::Class #t188 = v in let final self::Number #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
   self::expect(n0, let final self::Class #t191 = v in let final self::Number #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
-  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final self::Number #t196 = let final self::Number #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
-  self::expect(n1, let final self::Class #t199 = v in let final self::Number #t200 = self::ClassExtension|get#property(#t199) in let final self::Number #t201 = let final self::Number #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final void #t196 = self::ClassExtension|set#property(#t194, self::NumberExtension|+(#t195, 1)) in #t195);
+  self::expect(n1, let final self::Class #t197 = v in let final self::Number #t198 = self::ClassExtension|get#property(#t197) in let final void #t199 = self::ClassExtension|set#property(#t197, self::NumberExtension|-(#t198, 1)) in #t198);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  let final self::Class #t200 = v in self::ClassExtension|set#property(#t200, self::NumberExtension|+(self::ClassExtension|get#property(#t200), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  let final self::Class #t201 = v in self::ClassExtension|set#property(#t201, self::NumberExtension|+(self::ClassExtension|get#property(#t201), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  let final self::Class #t202 = v in self::ClassExtension|set#property(#t202, self::NumberExtension|-(self::ClassExtension|get#property(#t202), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  let final self::Class #t203 = v in self::ClassExtension|set#property(#t203, self::NumberExtension|+(self::ClassExtension|get#property(#t203), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|-(self::ClassExtension|get#property(#t204), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t209 = v in let final self::Number #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  let final self::Class #t205 = v in let final self::Number #t206 = self::NumberExtension|+(self::ClassExtension|get#property(#t205), 1) in let final void #t207 = self::ClassExtension|set#property(#t205, #t206) in #t206;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t212 = v in let final self::Number #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  let final self::Class #t208 = v in let final self::Number #t209 = self::NumberExtension|-(self::ClassExtension|get#property(#t208), 1) in let final void #t210 = self::ClassExtension|set#property(#t208, #t209) in #t209;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  let final self::Class #t211 = v in self::ClassExtension|set#property(#t211, self::NumberExtension|+(self::ClassExtension|get#property(#t211), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  let final self::Class #t212 = v in self::ClassExtension|set#property(#t212, self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testExplicitIntProperties() → dynamic {
@@ -373,105 +373,105 @@
   core::int n2 = 2;
   self::IntClass v = new self::IntClass::•(n0);
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass #t217 = v in let final core::int #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num) → core::int} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
-  self::expect(n2, let final self::IntClass #t220 = v in let final core::int #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num) → core::int} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
-  self::expect(n0, let final self::IntClass #t223 = v in let final core::int #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num) → core::int} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
-  self::expect(n1, let final self::IntClass #t226 = v in let final core::int #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num) → core::int} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
-  self::expect(n0, let final self::IntClass #t229 = v in let final core::int #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num) → core::int} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
-  self::expect(n1, let final self::IntClass #t232 = v in let final core::int #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num) → core::int} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
-  self::expect(n0, let final self::IntClass #t235 = v in let final core::int #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num) → core::int} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
-  self::expect(n0, let final self::IntClass #t238 = v in let final core::int #t239 = self::IntClassExtension|get#property(#t238) in let final core::int #t240 = let final core::int #t241 = #t239.{core::num::+}(1){(core::num) → core::int} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
-  self::expect(n1, let final self::IntClass #t243 = v in let final core::int #t244 = self::IntClassExtension|get#property(#t243) in let final core::int #t245 = let final core::int #t246 = #t244.{core::num::-}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n1, let final self::IntClass #t213 = v in let final core::int #t214 = self::IntClassExtension|get#property(#t213).{core::num::+}(n1){(core::num) → core::int} in let final void #t215 = self::IntClassExtension|set#property(#t213, #t214) in #t214);
+  self::expect(n2, let final self::IntClass #t216 = v in let final core::int #t217 = self::IntClassExtension|get#property(#t216).{core::num::+}(n1){(core::num) → core::int} in let final void #t218 = self::IntClassExtension|set#property(#t216, #t217) in #t217);
+  self::expect(n0, let final self::IntClass #t219 = v in let final core::int #t220 = self::IntClassExtension|get#property(#t219).{core::num::-}(n2){(core::num) → core::int} in let final void #t221 = self::IntClassExtension|set#property(#t219, #t220) in #t220);
+  self::expect(n1, let final self::IntClass #t222 = v in let final core::int #t223 = self::IntClassExtension|get#property(#t222).{core::num::+}(n1){(core::num) → core::int} in let final void #t224 = self::IntClassExtension|set#property(#t222, #t223) in #t223);
+  self::expect(n0, let final self::IntClass #t225 = v in let final core::int #t226 = self::IntClassExtension|get#property(#t225).{core::num::-}(n1){(core::num) → core::int} in let final void #t227 = self::IntClassExtension|set#property(#t225, #t226) in #t226);
+  self::expect(n1, let final self::IntClass #t228 = v in let final core::int #t229 = self::IntClassExtension|get#property(#t228).{core::num::+}(1){(core::num) → core::int} in let final void #t230 = self::IntClassExtension|set#property(#t228, #t229) in #t229);
+  self::expect(n0, let final self::IntClass #t231 = v in let final core::int #t232 = self::IntClassExtension|get#property(#t231).{core::num::-}(1){(core::num) → core::int} in let final void #t233 = self::IntClassExtension|set#property(#t231, #t232) in #t232);
+  self::expect(n0, let final self::IntClass #t234 = v in let final core::int #t235 = self::IntClassExtension|get#property(#t234) in let final void #t236 = self::IntClassExtension|set#property(#t234, #t235.{core::num::+}(1){(core::num) → core::int}) in #t235);
+  self::expect(n1, let final self::IntClass #t237 = v in let final core::int #t238 = self::IntClassExtension|get#property(#t237) in let final void #t239 = self::IntClassExtension|set#property(#t237, #t238.{core::num::-}(1){(core::num) → core::int}) in #t238);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t240 = v in self::IntClassExtension|set#property(#t240, self::IntClassExtension|get#property(#t240).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t241 = v in self::IntClassExtension|set#property(#t241, self::IntClassExtension|get#property(#t241).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num) → core::int});
+  let final self::IntClass #t242 = v in self::IntClassExtension|set#property(#t242, self::IntClassExtension|get#property(#t242).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t243 = v in self::IntClassExtension|set#property(#t243, self::IntClassExtension|get#property(#t243).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num) → core::int});
+  let final self::IntClass #t244 = v in self::IntClassExtension|set#property(#t244, self::IntClassExtension|get#property(#t244).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t253 = v in let final core::int #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num) → core::int} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  let final self::IntClass #t245 = v in let final core::int #t246 = self::IntClassExtension|get#property(#t245).{core::num::+}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t245, #t246) in #t246;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t256 = v in let final core::int #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num) → core::int} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  let final self::IntClass #t248 = v in let final core::int #t249 = self::IntClassExtension|get#property(#t248).{core::num::-}(1){(core::num) → core::int} in let final void #t250 = self::IntClassExtension|set#property(#t248, #t249) in #t249;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num) → core::int});
+  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num) → core::int});
+  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
 static method testExplicitNullAwareProperties(self::Class? v) → dynamic {
   self::Number n0 = new self::Number::•(0);
   self::Number n1 = new self::Number::•(1);
   self::Number n2 = new self::Number::•(2);
-  self::expect(n0, let final self::Class? #t261 = v in #t261 == null ?{self::Number?} null : self::ClassExtension|get#property(#t261{self::Class}), v == null);
-  self::expect(n1, let final self::Class? #t262 = v in #t262 == null ?{self::Number?} null : let final self::Number #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262{self::Class}), n1) in let final void #t264 = self::ClassExtension|set#property(#t262{self::Class}, #t263) in #t263, v == null);
-  self::expect(n2, let final self::Class? #t265 = v in #t265 == null ?{self::Number?} null : let final self::Number #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265{self::Class}), n1) in let final void #t267 = self::ClassExtension|set#property(#t265{self::Class}, #t266) in #t266, v == null);
-  self::expect(n0, let final self::Class? #t268 = v in #t268 == null ?{self::Number?} null : let final self::Number #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268{self::Class}), n2) in let final void #t270 = self::ClassExtension|set#property(#t268{self::Class}, #t269) in #t269, v == null);
-  self::expect(n1, let final self::Class? #t271 = v in #t271 == null ?{self::Number?} null : let final self::Number #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271{self::Class}), n1) in let final void #t273 = self::ClassExtension|set#property(#t271{self::Class}, #t272) in #t272, v == null);
-  self::expect(n0, let final self::Class? #t274 = v in #t274 == null ?{self::Number?} null : let final self::Number #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274{self::Class}), n1) in let final void #t276 = self::ClassExtension|set#property(#t274{self::Class}, #t275) in #t275, v == null);
-  self::expect(n1, let final self::Class? #t277 = v in #t277 == null ?{self::Number?} null : let final self::Number #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277{self::Class}), 1) in let final void #t279 = self::ClassExtension|set#property(#t277{self::Class}, #t278) in #t278, v == null);
-  self::expect(n0, let final self::Class? #t280 = v in #t280 == null ?{self::Number?} null : let final self::Number #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280{self::Class}), 1) in let final void #t282 = self::ClassExtension|set#property(#t280{self::Class}, #t281) in #t281, v == null);
-  self::expect(n0, let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : let final self::Number #t284 = self::ClassExtension|get#property(#t283{self::Class}) in let final self::Number #t285 = let final self::Number #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283{self::Class}, #t286) in #t286 in #t284, v == null);
-  self::expect(n1, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : let final self::Number #t289 = self::ClassExtension|get#property(#t288{self::Class}) in let final self::Number #t290 = let final self::Number #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288{self::Class}, #t291) in #t291 in #t289, v == null);
-  self::expect(n0, let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : self::ClassExtension|get#property(#t293{self::Class}), v == null);
-  self::expect(n0, let final self::Class? #t294 = v in #t294 == null ?{self::Number?} null : self::ClassExtension|get#property(#t294{self::Class}), v == null);
-  let final self::Class? #t295 = v in #t295 == null ?{self::Number?} null : self::ClassExtension|set#property(#t295{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t295{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t253 = v in #t253 == null ?{self::Number?} null : self::ClassExtension|get#property(#t253{self::Class}), v == null);
+  self::expect(n1, let final self::Class? #t254 = v in #t254 == null ?{self::Number?} null : let final self::Number #t255 = self::NumberExtension|+(self::ClassExtension|get#property(#t254{self::Class}), n1) in let final void #t256 = self::ClassExtension|set#property(#t254{self::Class}, #t255) in #t255, v == null);
+  self::expect(n2, let final self::Class? #t257 = v in #t257 == null ?{self::Number?} null : let final self::Number #t258 = self::NumberExtension|+(self::ClassExtension|get#property(#t257{self::Class}), n1) in let final void #t259 = self::ClassExtension|set#property(#t257{self::Class}, #t258) in #t258, v == null);
+  self::expect(n0, let final self::Class? #t260 = v in #t260 == null ?{self::Number?} null : let final self::Number #t261 = self::NumberExtension|-(self::ClassExtension|get#property(#t260{self::Class}), n2) in let final void #t262 = self::ClassExtension|set#property(#t260{self::Class}, #t261) in #t261, v == null);
+  self::expect(n1, let final self::Class? #t263 = v in #t263 == null ?{self::Number?} null : let final self::Number #t264 = self::NumberExtension|+(self::ClassExtension|get#property(#t263{self::Class}), n1) in let final void #t265 = self::ClassExtension|set#property(#t263{self::Class}, #t264) in #t264, v == null);
+  self::expect(n0, let final self::Class? #t266 = v in #t266 == null ?{self::Number?} null : let final self::Number #t267 = self::NumberExtension|-(self::ClassExtension|get#property(#t266{self::Class}), n1) in let final void #t268 = self::ClassExtension|set#property(#t266{self::Class}, #t267) in #t267, v == null);
+  self::expect(n1, let final self::Class? #t269 = v in #t269 == null ?{self::Number?} null : let final self::Number #t270 = self::NumberExtension|+(self::ClassExtension|get#property(#t269{self::Class}), 1) in let final void #t271 = self::ClassExtension|set#property(#t269{self::Class}, #t270) in #t270, v == null);
+  self::expect(n0, let final self::Class? #t272 = v in #t272 == null ?{self::Number?} null : let final self::Number #t273 = self::NumberExtension|-(self::ClassExtension|get#property(#t272{self::Class}), 1) in let final void #t274 = self::ClassExtension|set#property(#t272{self::Class}, #t273) in #t273, v == null);
+  self::expect(n0, let final self::Class? #t275 = v in #t275 == null ?{self::Number?} null : let final self::Number #t276 = self::ClassExtension|get#property(#t275{self::Class}) in let final void #t277 = self::ClassExtension|set#property(#t275{self::Class}, self::NumberExtension|+(#t276, 1)) in #t276, v == null);
+  self::expect(n1, let final self::Class? #t278 = v in #t278 == null ?{self::Number?} null : let final self::Number #t279 = self::ClassExtension|get#property(#t278{self::Class}) in let final void #t280 = self::ClassExtension|set#property(#t278{self::Class}, self::NumberExtension|-(#t279, 1)) in #t279, v == null);
+  self::expect(n0, let final self::Class? #t281 = v in #t281 == null ?{self::Number?} null : self::ClassExtension|get#property(#t281{self::Class}), v == null);
+  self::expect(n0, let final self::Class? #t282 = v in #t282 == null ?{self::Number?} null : self::ClassExtension|get#property(#t282{self::Class}), v == null);
+  let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : self::ClassExtension|set#property(#t283{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t283{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t284 = v in #t284 == null ?{self::Number?} null : self::ClassExtension|get#property(#t284{self::Class}), v == null);
+  let final self::Class? #t285 = v in #t285 == null ?{self::Number?} null : self::ClassExtension|set#property(#t285{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t285{self::Class}), n1));
+  self::expect(n2, let final self::Class? #t286 = v in #t286 == null ?{self::Number?} null : self::ClassExtension|get#property(#t286{self::Class}), v == null);
+  let final self::Class? #t287 = v in #t287 == null ?{self::Number?} null : self::ClassExtension|set#property(#t287{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t287{self::Class}), n2));
+  self::expect(n0, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : self::ClassExtension|get#property(#t288{self::Class}), v == null);
+  let final self::Class? #t289 = v in #t289 == null ?{self::Number?} null : self::ClassExtension|set#property(#t289{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t289{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t290 = v in #t290 == null ?{self::Number?} null : self::ClassExtension|get#property(#t290{self::Class}), v == null);
+  let final self::Class? #t291 = v in #t291 == null ?{self::Number?} null : self::ClassExtension|set#property(#t291{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t291{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t292 = v in #t292 == null ?{self::Number?} null : self::ClassExtension|get#property(#t292{self::Class}), v == null);
+  let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : let final self::Number #t294 = self::NumberExtension|+(self::ClassExtension|get#property(#t293{self::Class}), 1) in let final void #t295 = self::ClassExtension|set#property(#t293{self::Class}, #t294) in #t294;
   self::expect(n1, let final self::Class? #t296 = v in #t296 == null ?{self::Number?} null : self::ClassExtension|get#property(#t296{self::Class}), v == null);
-  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : self::ClassExtension|set#property(#t297{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t297{self::Class}), n1));
-  self::expect(n2, let final self::Class? #t298 = v in #t298 == null ?{self::Number?} null : self::ClassExtension|get#property(#t298{self::Class}), v == null);
-  let final self::Class? #t299 = v in #t299 == null ?{self::Number?} null : self::ClassExtension|set#property(#t299{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t299{self::Class}), n2));
+  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : let final self::Number #t298 = self::NumberExtension|-(self::ClassExtension|get#property(#t297{self::Class}), 1) in let final void #t299 = self::ClassExtension|set#property(#t297{self::Class}, #t298) in #t298;
   self::expect(n0, let final self::Class? #t300 = v in #t300 == null ?{self::Number?} null : self::ClassExtension|get#property(#t300{self::Class}), v == null);
-  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), n1));
+  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), 1));
   self::expect(n1, let final self::Class? #t302 = v in #t302 == null ?{self::Number?} null : self::ClassExtension|get#property(#t302{self::Class}), v == null);
-  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), n1));
+  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), 1));
   self::expect(n0, let final self::Class? #t304 = v in #t304 == null ?{self::Number?} null : self::ClassExtension|get#property(#t304{self::Class}), v == null);
-  let final self::Class? #t305 = v in #t305 == null ?{self::Number?} null : let final self::Number #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305{self::Class}), 1) in let final void #t307 = self::ClassExtension|set#property(#t305{self::Class}, #t306) in #t306;
-  self::expect(n1, let final self::Class? #t308 = v in #t308 == null ?{self::Number?} null : self::ClassExtension|get#property(#t308{self::Class}), v == null);
-  let final self::Class? #t309 = v in #t309 == null ?{self::Number?} null : let final self::Number #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309{self::Class}), 1) in let final void #t311 = self::ClassExtension|set#property(#t309{self::Class}, #t310) in #t310;
-  self::expect(n0, let final self::Class? #t312 = v in #t312 == null ?{self::Number?} null : self::ClassExtension|get#property(#t312{self::Class}), v == null);
-  let final self::Class? #t313 = v in #t313 == null ?{self::Number?} null : self::ClassExtension|set#property(#t313{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t313{self::Class}), 1));
-  self::expect(n1, let final self::Class? #t314 = v in #t314 == null ?{self::Number?} null : self::ClassExtension|get#property(#t314{self::Class}), v == null);
-  let final self::Class? #t315 = v in #t315 == null ?{self::Number?} null : self::ClassExtension|set#property(#t315{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t315{self::Class}), 1));
-  self::expect(n0, let final self::Class? #t316 = v in #t316 == null ?{self::Number?} null : self::ClassExtension|get#property(#t316{self::Class}), v == null);
 }
 static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic {
   core::int n0 = 0;
   core::int n1 = 1;
   core::int n2 = 2;
-  self::expect(n0, let final self::IntClass? #t317 = v in #t317 == null ?{core::int?} null : self::IntClassExtension|get#property(#t317{self::IntClass}), v == null);
-  self::expect(n1, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
-  self::expect(n2, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
-  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
-  self::expect(n1, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328) in #t328, v == null);
-  self::expect(n0, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331) in #t331, v == null);
-  self::expect(n1, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : let final core::int #t334 = self::IntClassExtension|get#property(#t333{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t335 = self::IntClassExtension|set#property(#t333{self::IntClass}, #t334) in #t334, v == null);
-  self::expect(n0, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : let final core::int #t337 = self::IntClassExtension|get#property(#t336{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t338 = self::IntClassExtension|set#property(#t336{self::IntClass}, #t337) in #t337, v == null);
-  self::expect(n0, let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : let final core::int #t340 = self::IntClassExtension|get#property(#t339{self::IntClass}) in let final core::int #t341 = let final core::int #t342 = #t340.{core::num::+}(1){(core::num) → core::int} in let final void #t343 = self::IntClassExtension|set#property(#t339{self::IntClass}, #t342) in #t342 in #t340, v == null);
-  self::expect(n1, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : let final core::int #t345 = self::IntClassExtension|get#property(#t344{self::IntClass}) in let final core::int #t346 = let final core::int #t347 = #t345.{core::num::-}(1){(core::num) → core::int} in let final void #t348 = self::IntClassExtension|set#property(#t344{self::IntClass}, #t347) in #t347 in #t345, v == null);
-  self::expect(n0, let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : self::IntClassExtension|get#property(#t349{self::IntClass}), v == null);
-  self::expect(n0, let final self::IntClass? #t350 = v in #t350 == null ?{core::int?} null : self::IntClassExtension|get#property(#t350{self::IntClass}), v == null);
-  let final self::IntClass? #t351 = v in #t351 == null ?{core::int?} null : self::IntClassExtension|set#property(#t351{self::IntClass}, self::IntClassExtension|get#property(#t351{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
-  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n2, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
-  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t305 = v in #t305 == null ?{core::int?} null : self::IntClassExtension|get#property(#t305{self::IntClass}), v == null);
+  self::expect(n1, let final self::IntClass? #t306 = v in #t306 == null ?{core::int?} null : let final core::int #t307 = self::IntClassExtension|get#property(#t306{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t308 = self::IntClassExtension|set#property(#t306{self::IntClass}, #t307) in #t307, v == null);
+  self::expect(n2, let final self::IntClass? #t309 = v in #t309 == null ?{core::int?} null : let final core::int #t310 = self::IntClassExtension|get#property(#t309{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t311 = self::IntClassExtension|set#property(#t309{self::IntClass}, #t310) in #t310, v == null);
+  self::expect(n0, let final self::IntClass? #t312 = v in #t312 == null ?{core::int?} null : let final core::int #t313 = self::IntClassExtension|get#property(#t312{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t314 = self::IntClassExtension|set#property(#t312{self::IntClass}, #t313) in #t313, v == null);
+  self::expect(n1, let final self::IntClass? #t315 = v in #t315 == null ?{core::int?} null : let final core::int #t316 = self::IntClassExtension|get#property(#t315{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t317 = self::IntClassExtension|set#property(#t315{self::IntClass}, #t316) in #t316, v == null);
+  self::expect(n0, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
+  self::expect(n1, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
+  self::expect(n0, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}) in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328.{core::num::+}(1){(core::num) → core::int}) in #t328, v == null);
+  self::expect(n1, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}) in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331.{core::num::-}(1){(core::num) → core::int}) in #t331, v == null);
+  self::expect(n0, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : self::IntClassExtension|get#property(#t333{self::IntClass}), v == null);
+  self::expect(n0, let final self::IntClass? #t334 = v in #t334 == null ?{core::int?} null : self::IntClassExtension|get#property(#t334{self::IntClass}), v == null);
+  let final self::IntClass? #t335 = v in #t335 == null ?{core::int?} null : self::IntClassExtension|set#property(#t335{self::IntClass}, self::IntClassExtension|get#property(#t335{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : self::IntClassExtension|get#property(#t336{self::IntClass}), v == null);
+  let final self::IntClass? #t337 = v in #t337 == null ?{core::int?} null : self::IntClassExtension|set#property(#t337{self::IntClass}, self::IntClassExtension|get#property(#t337{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass? #t338 = v in #t338 == null ?{core::int?} null : self::IntClassExtension|get#property(#t338{self::IntClass}), v == null);
+  let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : self::IntClassExtension|set#property(#t339{self::IntClass}, self::IntClassExtension|get#property(#t339{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t340 = v in #t340 == null ?{core::int?} null : self::IntClassExtension|get#property(#t340{self::IntClass}), v == null);
+  let final self::IntClass? #t341 = v in #t341 == null ?{core::int?} null : self::IntClassExtension|set#property(#t341{self::IntClass}, self::IntClassExtension|get#property(#t341{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t342 = v in #t342 == null ?{core::int?} null : self::IntClassExtension|get#property(#t342{self::IntClass}), v == null);
+  let final self::IntClass? #t343 = v in #t343 == null ?{core::int?} null : self::IntClassExtension|set#property(#t343{self::IntClass}, self::IntClassExtension|get#property(#t343{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : self::IntClassExtension|get#property(#t344{self::IntClass}), v == null);
+  let final self::IntClass? #t345 = v in #t345 == null ?{core::int?} null : let final core::int #t346 = self::IntClassExtension|get#property(#t345{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t347 = self::IntClassExtension|set#property(#t345{self::IntClass}, #t346) in #t346;
+  self::expect(n1, let final self::IntClass? #t348 = v in #t348 == null ?{core::int?} null : self::IntClassExtension|get#property(#t348{self::IntClass}), v == null);
+  let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : let final core::int #t350 = self::IntClassExtension|get#property(#t349{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t351 = self::IntClassExtension|set#property(#t349{self::IntClass}, #t350) in #t350;
+  self::expect(n0, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
+  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
+  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, let final self::IntClass? #t356 = v in #t356 == null ?{core::int?} null : self::IntClassExtension|get#property(#t356{self::IntClass}), v == null);
-  let final self::IntClass? #t357 = v in #t357 == null ?{core::int?} null : self::IntClassExtension|set#property(#t357{self::IntClass}, self::IntClassExtension|get#property(#t357{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t358 = v in #t358 == null ?{core::int?} null : self::IntClassExtension|get#property(#t358{self::IntClass}), v == null);
-  let final self::IntClass? #t359 = v in #t359 == null ?{core::int?} null : self::IntClassExtension|set#property(#t359{self::IntClass}, self::IntClassExtension|get#property(#t359{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
-  self::expect(n0, let final self::IntClass? #t360 = v in #t360 == null ?{core::int?} null : self::IntClassExtension|get#property(#t360{self::IntClass}), v == null);
-  let final self::IntClass? #t361 = v in #t361 == null ?{core::int?} null : let final core::int #t362 = self::IntClassExtension|get#property(#t361{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t363 = self::IntClassExtension|set#property(#t361{self::IntClass}, #t362) in #t362;
-  self::expect(n1, let final self::IntClass? #t364 = v in #t364 == null ?{core::int?} null : self::IntClassExtension|get#property(#t364{self::IntClass}), v == null);
-  let final self::IntClass? #t365 = v in #t365 == null ?{core::int?} null : let final core::int #t366 = self::IntClassExtension|get#property(#t365{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t367 = self::IntClassExtension|set#property(#t365{self::IntClass}, #t366) in #t366;
-  self::expect(n0, let final self::IntClass? #t368 = v in #t368 == null ?{core::int?} null : self::IntClassExtension|get#property(#t368{self::IntClass}), v == null);
-  let final self::IntClass? #t369 = v in #t369 == null ?{core::int?} null : self::IntClassExtension|set#property(#t369{self::IntClass}, self::IntClassExtension|get#property(#t369{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t370 = v in #t370 == null ?{core::int?} null : self::IntClassExtension|get#property(#t370{self::IntClass}), v == null);
-  let final self::IntClass? #t371 = v in #t371 == null ?{core::int?} null : self::IntClassExtension|set#property(#t371{self::IntClass}, self::IntClassExtension|get#property(#t371{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
-  self::expect(n0, let final self::IntClass? #t372 = v in #t372 == null ?{core::int?} null : self::IntClassExtension|get#property(#t372{self::IntClass}), v == null);
 }
 static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
   if(expectNull as{TypeError,ForDynamic} core::bool) {
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/compounds.dart.strong.modular.expect
index 5c90988..d75e408 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.strong.modular.expect
@@ -83,8 +83,8 @@
   self::expect(n0, let final self::Number #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
   self::expect(n1, let final self::Number #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
   self::expect(n0, let final self::Number #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
-  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final self::Number #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
-  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final self::Number #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final void #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final void #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@@ -125,8 +125,8 @@
   self::expect(n0, let final core::int #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
   self::expect(n1, let final core::int #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
   self::expect(n0, let final core::int #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
-  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final core::int #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
-  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final core::int #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
+  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final void #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
+  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final void #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
@@ -344,27 +344,27 @@
   self::expect(n0, let final self::Class #t185 = v in let final self::Number #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
   self::expect(n1, let final self::Class #t188 = v in let final self::Number #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
   self::expect(n0, let final self::Class #t191 = v in let final self::Number #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
-  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final self::Number #t196 = let final self::Number #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
-  self::expect(n1, let final self::Class #t199 = v in let final self::Number #t200 = self::ClassExtension|get#property(#t199) in let final self::Number #t201 = let final self::Number #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final void #t196 = self::ClassExtension|set#property(#t194, self::NumberExtension|+(#t195, 1)) in #t195);
+  self::expect(n1, let final self::Class #t197 = v in let final self::Number #t198 = self::ClassExtension|get#property(#t197) in let final void #t199 = self::ClassExtension|set#property(#t197, self::NumberExtension|-(#t198, 1)) in #t198);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  let final self::Class #t200 = v in self::ClassExtension|set#property(#t200, self::NumberExtension|+(self::ClassExtension|get#property(#t200), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  let final self::Class #t201 = v in self::ClassExtension|set#property(#t201, self::NumberExtension|+(self::ClassExtension|get#property(#t201), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  let final self::Class #t202 = v in self::ClassExtension|set#property(#t202, self::NumberExtension|-(self::ClassExtension|get#property(#t202), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  let final self::Class #t203 = v in self::ClassExtension|set#property(#t203, self::NumberExtension|+(self::ClassExtension|get#property(#t203), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|-(self::ClassExtension|get#property(#t204), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t209 = v in let final self::Number #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  let final self::Class #t205 = v in let final self::Number #t206 = self::NumberExtension|+(self::ClassExtension|get#property(#t205), 1) in let final void #t207 = self::ClassExtension|set#property(#t205, #t206) in #t206;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t212 = v in let final self::Number #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  let final self::Class #t208 = v in let final self::Number #t209 = self::NumberExtension|-(self::ClassExtension|get#property(#t208), 1) in let final void #t210 = self::ClassExtension|set#property(#t208, #t209) in #t209;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  let final self::Class #t211 = v in self::ClassExtension|set#property(#t211, self::NumberExtension|+(self::ClassExtension|get#property(#t211), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  let final self::Class #t212 = v in self::ClassExtension|set#property(#t212, self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testExplicitIntProperties() → dynamic {
@@ -373,105 +373,105 @@
   core::int n2 = 2;
   self::IntClass v = new self::IntClass::•(n0);
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass #t217 = v in let final core::int #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num) → core::int} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
-  self::expect(n2, let final self::IntClass #t220 = v in let final core::int #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num) → core::int} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
-  self::expect(n0, let final self::IntClass #t223 = v in let final core::int #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num) → core::int} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
-  self::expect(n1, let final self::IntClass #t226 = v in let final core::int #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num) → core::int} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
-  self::expect(n0, let final self::IntClass #t229 = v in let final core::int #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num) → core::int} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
-  self::expect(n1, let final self::IntClass #t232 = v in let final core::int #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num) → core::int} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
-  self::expect(n0, let final self::IntClass #t235 = v in let final core::int #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num) → core::int} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
-  self::expect(n0, let final self::IntClass #t238 = v in let final core::int #t239 = self::IntClassExtension|get#property(#t238) in let final core::int #t240 = let final core::int #t241 = #t239.{core::num::+}(1){(core::num) → core::int} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
-  self::expect(n1, let final self::IntClass #t243 = v in let final core::int #t244 = self::IntClassExtension|get#property(#t243) in let final core::int #t245 = let final core::int #t246 = #t244.{core::num::-}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n1, let final self::IntClass #t213 = v in let final core::int #t214 = self::IntClassExtension|get#property(#t213).{core::num::+}(n1){(core::num) → core::int} in let final void #t215 = self::IntClassExtension|set#property(#t213, #t214) in #t214);
+  self::expect(n2, let final self::IntClass #t216 = v in let final core::int #t217 = self::IntClassExtension|get#property(#t216).{core::num::+}(n1){(core::num) → core::int} in let final void #t218 = self::IntClassExtension|set#property(#t216, #t217) in #t217);
+  self::expect(n0, let final self::IntClass #t219 = v in let final core::int #t220 = self::IntClassExtension|get#property(#t219).{core::num::-}(n2){(core::num) → core::int} in let final void #t221 = self::IntClassExtension|set#property(#t219, #t220) in #t220);
+  self::expect(n1, let final self::IntClass #t222 = v in let final core::int #t223 = self::IntClassExtension|get#property(#t222).{core::num::+}(n1){(core::num) → core::int} in let final void #t224 = self::IntClassExtension|set#property(#t222, #t223) in #t223);
+  self::expect(n0, let final self::IntClass #t225 = v in let final core::int #t226 = self::IntClassExtension|get#property(#t225).{core::num::-}(n1){(core::num) → core::int} in let final void #t227 = self::IntClassExtension|set#property(#t225, #t226) in #t226);
+  self::expect(n1, let final self::IntClass #t228 = v in let final core::int #t229 = self::IntClassExtension|get#property(#t228).{core::num::+}(1){(core::num) → core::int} in let final void #t230 = self::IntClassExtension|set#property(#t228, #t229) in #t229);
+  self::expect(n0, let final self::IntClass #t231 = v in let final core::int #t232 = self::IntClassExtension|get#property(#t231).{core::num::-}(1){(core::num) → core::int} in let final void #t233 = self::IntClassExtension|set#property(#t231, #t232) in #t232);
+  self::expect(n0, let final self::IntClass #t234 = v in let final core::int #t235 = self::IntClassExtension|get#property(#t234) in let final void #t236 = self::IntClassExtension|set#property(#t234, #t235.{core::num::+}(1){(core::num) → core::int}) in #t235);
+  self::expect(n1, let final self::IntClass #t237 = v in let final core::int #t238 = self::IntClassExtension|get#property(#t237) in let final void #t239 = self::IntClassExtension|set#property(#t237, #t238.{core::num::-}(1){(core::num) → core::int}) in #t238);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t240 = v in self::IntClassExtension|set#property(#t240, self::IntClassExtension|get#property(#t240).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t241 = v in self::IntClassExtension|set#property(#t241, self::IntClassExtension|get#property(#t241).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num) → core::int});
+  let final self::IntClass #t242 = v in self::IntClassExtension|set#property(#t242, self::IntClassExtension|get#property(#t242).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t243 = v in self::IntClassExtension|set#property(#t243, self::IntClassExtension|get#property(#t243).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num) → core::int});
+  let final self::IntClass #t244 = v in self::IntClassExtension|set#property(#t244, self::IntClassExtension|get#property(#t244).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t253 = v in let final core::int #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num) → core::int} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  let final self::IntClass #t245 = v in let final core::int #t246 = self::IntClassExtension|get#property(#t245).{core::num::+}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t245, #t246) in #t246;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t256 = v in let final core::int #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num) → core::int} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  let final self::IntClass #t248 = v in let final core::int #t249 = self::IntClassExtension|get#property(#t248).{core::num::-}(1){(core::num) → core::int} in let final void #t250 = self::IntClassExtension|set#property(#t248, #t249) in #t249;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num) → core::int});
+  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num) → core::int});
+  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
 static method testExplicitNullAwareProperties(self::Class? v) → dynamic {
   self::Number n0 = new self::Number::•(0);
   self::Number n1 = new self::Number::•(1);
   self::Number n2 = new self::Number::•(2);
-  self::expect(n0, let final self::Class? #t261 = v in #t261 == null ?{self::Number?} null : self::ClassExtension|get#property(#t261{self::Class}), v == null);
-  self::expect(n1, let final self::Class? #t262 = v in #t262 == null ?{self::Number?} null : let final self::Number #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262{self::Class}), n1) in let final void #t264 = self::ClassExtension|set#property(#t262{self::Class}, #t263) in #t263, v == null);
-  self::expect(n2, let final self::Class? #t265 = v in #t265 == null ?{self::Number?} null : let final self::Number #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265{self::Class}), n1) in let final void #t267 = self::ClassExtension|set#property(#t265{self::Class}, #t266) in #t266, v == null);
-  self::expect(n0, let final self::Class? #t268 = v in #t268 == null ?{self::Number?} null : let final self::Number #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268{self::Class}), n2) in let final void #t270 = self::ClassExtension|set#property(#t268{self::Class}, #t269) in #t269, v == null);
-  self::expect(n1, let final self::Class? #t271 = v in #t271 == null ?{self::Number?} null : let final self::Number #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271{self::Class}), n1) in let final void #t273 = self::ClassExtension|set#property(#t271{self::Class}, #t272) in #t272, v == null);
-  self::expect(n0, let final self::Class? #t274 = v in #t274 == null ?{self::Number?} null : let final self::Number #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274{self::Class}), n1) in let final void #t276 = self::ClassExtension|set#property(#t274{self::Class}, #t275) in #t275, v == null);
-  self::expect(n1, let final self::Class? #t277 = v in #t277 == null ?{self::Number?} null : let final self::Number #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277{self::Class}), 1) in let final void #t279 = self::ClassExtension|set#property(#t277{self::Class}, #t278) in #t278, v == null);
-  self::expect(n0, let final self::Class? #t280 = v in #t280 == null ?{self::Number?} null : let final self::Number #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280{self::Class}), 1) in let final void #t282 = self::ClassExtension|set#property(#t280{self::Class}, #t281) in #t281, v == null);
-  self::expect(n0, let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : let final self::Number #t284 = self::ClassExtension|get#property(#t283{self::Class}) in let final self::Number #t285 = let final self::Number #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283{self::Class}, #t286) in #t286 in #t284, v == null);
-  self::expect(n1, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : let final self::Number #t289 = self::ClassExtension|get#property(#t288{self::Class}) in let final self::Number #t290 = let final self::Number #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288{self::Class}, #t291) in #t291 in #t289, v == null);
-  self::expect(n0, let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : self::ClassExtension|get#property(#t293{self::Class}), v == null);
-  self::expect(n0, let final self::Class? #t294 = v in #t294 == null ?{self::Number?} null : self::ClassExtension|get#property(#t294{self::Class}), v == null);
-  let final self::Class? #t295 = v in #t295 == null ?{self::Number?} null : self::ClassExtension|set#property(#t295{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t295{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t253 = v in #t253 == null ?{self::Number?} null : self::ClassExtension|get#property(#t253{self::Class}), v == null);
+  self::expect(n1, let final self::Class? #t254 = v in #t254 == null ?{self::Number?} null : let final self::Number #t255 = self::NumberExtension|+(self::ClassExtension|get#property(#t254{self::Class}), n1) in let final void #t256 = self::ClassExtension|set#property(#t254{self::Class}, #t255) in #t255, v == null);
+  self::expect(n2, let final self::Class? #t257 = v in #t257 == null ?{self::Number?} null : let final self::Number #t258 = self::NumberExtension|+(self::ClassExtension|get#property(#t257{self::Class}), n1) in let final void #t259 = self::ClassExtension|set#property(#t257{self::Class}, #t258) in #t258, v == null);
+  self::expect(n0, let final self::Class? #t260 = v in #t260 == null ?{self::Number?} null : let final self::Number #t261 = self::NumberExtension|-(self::ClassExtension|get#property(#t260{self::Class}), n2) in let final void #t262 = self::ClassExtension|set#property(#t260{self::Class}, #t261) in #t261, v == null);
+  self::expect(n1, let final self::Class? #t263 = v in #t263 == null ?{self::Number?} null : let final self::Number #t264 = self::NumberExtension|+(self::ClassExtension|get#property(#t263{self::Class}), n1) in let final void #t265 = self::ClassExtension|set#property(#t263{self::Class}, #t264) in #t264, v == null);
+  self::expect(n0, let final self::Class? #t266 = v in #t266 == null ?{self::Number?} null : let final self::Number #t267 = self::NumberExtension|-(self::ClassExtension|get#property(#t266{self::Class}), n1) in let final void #t268 = self::ClassExtension|set#property(#t266{self::Class}, #t267) in #t267, v == null);
+  self::expect(n1, let final self::Class? #t269 = v in #t269 == null ?{self::Number?} null : let final self::Number #t270 = self::NumberExtension|+(self::ClassExtension|get#property(#t269{self::Class}), 1) in let final void #t271 = self::ClassExtension|set#property(#t269{self::Class}, #t270) in #t270, v == null);
+  self::expect(n0, let final self::Class? #t272 = v in #t272 == null ?{self::Number?} null : let final self::Number #t273 = self::NumberExtension|-(self::ClassExtension|get#property(#t272{self::Class}), 1) in let final void #t274 = self::ClassExtension|set#property(#t272{self::Class}, #t273) in #t273, v == null);
+  self::expect(n0, let final self::Class? #t275 = v in #t275 == null ?{self::Number?} null : let final self::Number #t276 = self::ClassExtension|get#property(#t275{self::Class}) in let final void #t277 = self::ClassExtension|set#property(#t275{self::Class}, self::NumberExtension|+(#t276, 1)) in #t276, v == null);
+  self::expect(n1, let final self::Class? #t278 = v in #t278 == null ?{self::Number?} null : let final self::Number #t279 = self::ClassExtension|get#property(#t278{self::Class}) in let final void #t280 = self::ClassExtension|set#property(#t278{self::Class}, self::NumberExtension|-(#t279, 1)) in #t279, v == null);
+  self::expect(n0, let final self::Class? #t281 = v in #t281 == null ?{self::Number?} null : self::ClassExtension|get#property(#t281{self::Class}), v == null);
+  self::expect(n0, let final self::Class? #t282 = v in #t282 == null ?{self::Number?} null : self::ClassExtension|get#property(#t282{self::Class}), v == null);
+  let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : self::ClassExtension|set#property(#t283{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t283{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t284 = v in #t284 == null ?{self::Number?} null : self::ClassExtension|get#property(#t284{self::Class}), v == null);
+  let final self::Class? #t285 = v in #t285 == null ?{self::Number?} null : self::ClassExtension|set#property(#t285{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t285{self::Class}), n1));
+  self::expect(n2, let final self::Class? #t286 = v in #t286 == null ?{self::Number?} null : self::ClassExtension|get#property(#t286{self::Class}), v == null);
+  let final self::Class? #t287 = v in #t287 == null ?{self::Number?} null : self::ClassExtension|set#property(#t287{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t287{self::Class}), n2));
+  self::expect(n0, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : self::ClassExtension|get#property(#t288{self::Class}), v == null);
+  let final self::Class? #t289 = v in #t289 == null ?{self::Number?} null : self::ClassExtension|set#property(#t289{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t289{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t290 = v in #t290 == null ?{self::Number?} null : self::ClassExtension|get#property(#t290{self::Class}), v == null);
+  let final self::Class? #t291 = v in #t291 == null ?{self::Number?} null : self::ClassExtension|set#property(#t291{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t291{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t292 = v in #t292 == null ?{self::Number?} null : self::ClassExtension|get#property(#t292{self::Class}), v == null);
+  let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : let final self::Number #t294 = self::NumberExtension|+(self::ClassExtension|get#property(#t293{self::Class}), 1) in let final void #t295 = self::ClassExtension|set#property(#t293{self::Class}, #t294) in #t294;
   self::expect(n1, let final self::Class? #t296 = v in #t296 == null ?{self::Number?} null : self::ClassExtension|get#property(#t296{self::Class}), v == null);
-  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : self::ClassExtension|set#property(#t297{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t297{self::Class}), n1));
-  self::expect(n2, let final self::Class? #t298 = v in #t298 == null ?{self::Number?} null : self::ClassExtension|get#property(#t298{self::Class}), v == null);
-  let final self::Class? #t299 = v in #t299 == null ?{self::Number?} null : self::ClassExtension|set#property(#t299{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t299{self::Class}), n2));
+  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : let final self::Number #t298 = self::NumberExtension|-(self::ClassExtension|get#property(#t297{self::Class}), 1) in let final void #t299 = self::ClassExtension|set#property(#t297{self::Class}, #t298) in #t298;
   self::expect(n0, let final self::Class? #t300 = v in #t300 == null ?{self::Number?} null : self::ClassExtension|get#property(#t300{self::Class}), v == null);
-  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), n1));
+  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), 1));
   self::expect(n1, let final self::Class? #t302 = v in #t302 == null ?{self::Number?} null : self::ClassExtension|get#property(#t302{self::Class}), v == null);
-  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), n1));
+  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), 1));
   self::expect(n0, let final self::Class? #t304 = v in #t304 == null ?{self::Number?} null : self::ClassExtension|get#property(#t304{self::Class}), v == null);
-  let final self::Class? #t305 = v in #t305 == null ?{self::Number?} null : let final self::Number #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305{self::Class}), 1) in let final void #t307 = self::ClassExtension|set#property(#t305{self::Class}, #t306) in #t306;
-  self::expect(n1, let final self::Class? #t308 = v in #t308 == null ?{self::Number?} null : self::ClassExtension|get#property(#t308{self::Class}), v == null);
-  let final self::Class? #t309 = v in #t309 == null ?{self::Number?} null : let final self::Number #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309{self::Class}), 1) in let final void #t311 = self::ClassExtension|set#property(#t309{self::Class}, #t310) in #t310;
-  self::expect(n0, let final self::Class? #t312 = v in #t312 == null ?{self::Number?} null : self::ClassExtension|get#property(#t312{self::Class}), v == null);
-  let final self::Class? #t313 = v in #t313 == null ?{self::Number?} null : self::ClassExtension|set#property(#t313{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t313{self::Class}), 1));
-  self::expect(n1, let final self::Class? #t314 = v in #t314 == null ?{self::Number?} null : self::ClassExtension|get#property(#t314{self::Class}), v == null);
-  let final self::Class? #t315 = v in #t315 == null ?{self::Number?} null : self::ClassExtension|set#property(#t315{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t315{self::Class}), 1));
-  self::expect(n0, let final self::Class? #t316 = v in #t316 == null ?{self::Number?} null : self::ClassExtension|get#property(#t316{self::Class}), v == null);
 }
 static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic {
   core::int n0 = 0;
   core::int n1 = 1;
   core::int n2 = 2;
-  self::expect(n0, let final self::IntClass? #t317 = v in #t317 == null ?{core::int?} null : self::IntClassExtension|get#property(#t317{self::IntClass}), v == null);
-  self::expect(n1, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
-  self::expect(n2, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
-  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
-  self::expect(n1, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328) in #t328, v == null);
-  self::expect(n0, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331) in #t331, v == null);
-  self::expect(n1, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : let final core::int #t334 = self::IntClassExtension|get#property(#t333{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t335 = self::IntClassExtension|set#property(#t333{self::IntClass}, #t334) in #t334, v == null);
-  self::expect(n0, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : let final core::int #t337 = self::IntClassExtension|get#property(#t336{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t338 = self::IntClassExtension|set#property(#t336{self::IntClass}, #t337) in #t337, v == null);
-  self::expect(n0, let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : let final core::int #t340 = self::IntClassExtension|get#property(#t339{self::IntClass}) in let final core::int #t341 = let final core::int #t342 = #t340.{core::num::+}(1){(core::num) → core::int} in let final void #t343 = self::IntClassExtension|set#property(#t339{self::IntClass}, #t342) in #t342 in #t340, v == null);
-  self::expect(n1, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : let final core::int #t345 = self::IntClassExtension|get#property(#t344{self::IntClass}) in let final core::int #t346 = let final core::int #t347 = #t345.{core::num::-}(1){(core::num) → core::int} in let final void #t348 = self::IntClassExtension|set#property(#t344{self::IntClass}, #t347) in #t347 in #t345, v == null);
-  self::expect(n0, let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : self::IntClassExtension|get#property(#t349{self::IntClass}), v == null);
-  self::expect(n0, let final self::IntClass? #t350 = v in #t350 == null ?{core::int?} null : self::IntClassExtension|get#property(#t350{self::IntClass}), v == null);
-  let final self::IntClass? #t351 = v in #t351 == null ?{core::int?} null : self::IntClassExtension|set#property(#t351{self::IntClass}, self::IntClassExtension|get#property(#t351{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
-  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n2, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
-  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t305 = v in #t305 == null ?{core::int?} null : self::IntClassExtension|get#property(#t305{self::IntClass}), v == null);
+  self::expect(n1, let final self::IntClass? #t306 = v in #t306 == null ?{core::int?} null : let final core::int #t307 = self::IntClassExtension|get#property(#t306{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t308 = self::IntClassExtension|set#property(#t306{self::IntClass}, #t307) in #t307, v == null);
+  self::expect(n2, let final self::IntClass? #t309 = v in #t309 == null ?{core::int?} null : let final core::int #t310 = self::IntClassExtension|get#property(#t309{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t311 = self::IntClassExtension|set#property(#t309{self::IntClass}, #t310) in #t310, v == null);
+  self::expect(n0, let final self::IntClass? #t312 = v in #t312 == null ?{core::int?} null : let final core::int #t313 = self::IntClassExtension|get#property(#t312{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t314 = self::IntClassExtension|set#property(#t312{self::IntClass}, #t313) in #t313, v == null);
+  self::expect(n1, let final self::IntClass? #t315 = v in #t315 == null ?{core::int?} null : let final core::int #t316 = self::IntClassExtension|get#property(#t315{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t317 = self::IntClassExtension|set#property(#t315{self::IntClass}, #t316) in #t316, v == null);
+  self::expect(n0, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
+  self::expect(n1, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
+  self::expect(n0, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}) in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328.{core::num::+}(1){(core::num) → core::int}) in #t328, v == null);
+  self::expect(n1, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}) in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331.{core::num::-}(1){(core::num) → core::int}) in #t331, v == null);
+  self::expect(n0, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : self::IntClassExtension|get#property(#t333{self::IntClass}), v == null);
+  self::expect(n0, let final self::IntClass? #t334 = v in #t334 == null ?{core::int?} null : self::IntClassExtension|get#property(#t334{self::IntClass}), v == null);
+  let final self::IntClass? #t335 = v in #t335 == null ?{core::int?} null : self::IntClassExtension|set#property(#t335{self::IntClass}, self::IntClassExtension|get#property(#t335{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : self::IntClassExtension|get#property(#t336{self::IntClass}), v == null);
+  let final self::IntClass? #t337 = v in #t337 == null ?{core::int?} null : self::IntClassExtension|set#property(#t337{self::IntClass}, self::IntClassExtension|get#property(#t337{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass? #t338 = v in #t338 == null ?{core::int?} null : self::IntClassExtension|get#property(#t338{self::IntClass}), v == null);
+  let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : self::IntClassExtension|set#property(#t339{self::IntClass}, self::IntClassExtension|get#property(#t339{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t340 = v in #t340 == null ?{core::int?} null : self::IntClassExtension|get#property(#t340{self::IntClass}), v == null);
+  let final self::IntClass? #t341 = v in #t341 == null ?{core::int?} null : self::IntClassExtension|set#property(#t341{self::IntClass}, self::IntClassExtension|get#property(#t341{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t342 = v in #t342 == null ?{core::int?} null : self::IntClassExtension|get#property(#t342{self::IntClass}), v == null);
+  let final self::IntClass? #t343 = v in #t343 == null ?{core::int?} null : self::IntClassExtension|set#property(#t343{self::IntClass}, self::IntClassExtension|get#property(#t343{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : self::IntClassExtension|get#property(#t344{self::IntClass}), v == null);
+  let final self::IntClass? #t345 = v in #t345 == null ?{core::int?} null : let final core::int #t346 = self::IntClassExtension|get#property(#t345{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t347 = self::IntClassExtension|set#property(#t345{self::IntClass}, #t346) in #t346;
+  self::expect(n1, let final self::IntClass? #t348 = v in #t348 == null ?{core::int?} null : self::IntClassExtension|get#property(#t348{self::IntClass}), v == null);
+  let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : let final core::int #t350 = self::IntClassExtension|get#property(#t349{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t351 = self::IntClassExtension|set#property(#t349{self::IntClass}, #t350) in #t350;
+  self::expect(n0, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
+  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
+  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, let final self::IntClass? #t356 = v in #t356 == null ?{core::int?} null : self::IntClassExtension|get#property(#t356{self::IntClass}), v == null);
-  let final self::IntClass? #t357 = v in #t357 == null ?{core::int?} null : self::IntClassExtension|set#property(#t357{self::IntClass}, self::IntClassExtension|get#property(#t357{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t358 = v in #t358 == null ?{core::int?} null : self::IntClassExtension|get#property(#t358{self::IntClass}), v == null);
-  let final self::IntClass? #t359 = v in #t359 == null ?{core::int?} null : self::IntClassExtension|set#property(#t359{self::IntClass}, self::IntClassExtension|get#property(#t359{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
-  self::expect(n0, let final self::IntClass? #t360 = v in #t360 == null ?{core::int?} null : self::IntClassExtension|get#property(#t360{self::IntClass}), v == null);
-  let final self::IntClass? #t361 = v in #t361 == null ?{core::int?} null : let final core::int #t362 = self::IntClassExtension|get#property(#t361{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t363 = self::IntClassExtension|set#property(#t361{self::IntClass}, #t362) in #t362;
-  self::expect(n1, let final self::IntClass? #t364 = v in #t364 == null ?{core::int?} null : self::IntClassExtension|get#property(#t364{self::IntClass}), v == null);
-  let final self::IntClass? #t365 = v in #t365 == null ?{core::int?} null : let final core::int #t366 = self::IntClassExtension|get#property(#t365{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t367 = self::IntClassExtension|set#property(#t365{self::IntClass}, #t366) in #t366;
-  self::expect(n0, let final self::IntClass? #t368 = v in #t368 == null ?{core::int?} null : self::IntClassExtension|get#property(#t368{self::IntClass}), v == null);
-  let final self::IntClass? #t369 = v in #t369 == null ?{core::int?} null : self::IntClassExtension|set#property(#t369{self::IntClass}, self::IntClassExtension|get#property(#t369{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t370 = v in #t370 == null ?{core::int?} null : self::IntClassExtension|get#property(#t370{self::IntClass}), v == null);
-  let final self::IntClass? #t371 = v in #t371 == null ?{core::int?} null : self::IntClassExtension|set#property(#t371{self::IntClass}, self::IntClassExtension|get#property(#t371{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
-  self::expect(n0, let final self::IntClass? #t372 = v in #t372 == null ?{core::int?} null : self::IntClassExtension|get#property(#t372{self::IntClass}), v == null);
 }
 static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
   if(expectNull as{TypeError,ForDynamic} core::bool) {
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/compounds.dart.strong.transformed.expect
index 5c90988..d75e408 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.strong.transformed.expect
@@ -83,8 +83,8 @@
   self::expect(n0, let final self::Number #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
   self::expect(n1, let final self::Number #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
   self::expect(n0, let final self::Number #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
-  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final self::Number #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
-  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final self::Number #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final void #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final void #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@@ -125,8 +125,8 @@
   self::expect(n0, let final core::int #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
   self::expect(n1, let final core::int #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
   self::expect(n0, let final core::int #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
-  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final core::int #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
-  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final core::int #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
+  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final void #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
+  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final void #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
@@ -344,27 +344,27 @@
   self::expect(n0, let final self::Class #t185 = v in let final self::Number #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
   self::expect(n1, let final self::Class #t188 = v in let final self::Number #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
   self::expect(n0, let final self::Class #t191 = v in let final self::Number #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
-  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final self::Number #t196 = let final self::Number #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
-  self::expect(n1, let final self::Class #t199 = v in let final self::Number #t200 = self::ClassExtension|get#property(#t199) in let final self::Number #t201 = let final self::Number #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final void #t196 = self::ClassExtension|set#property(#t194, self::NumberExtension|+(#t195, 1)) in #t195);
+  self::expect(n1, let final self::Class #t197 = v in let final self::Number #t198 = self::ClassExtension|get#property(#t197) in let final void #t199 = self::ClassExtension|set#property(#t197, self::NumberExtension|-(#t198, 1)) in #t198);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  let final self::Class #t200 = v in self::ClassExtension|set#property(#t200, self::NumberExtension|+(self::ClassExtension|get#property(#t200), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  let final self::Class #t201 = v in self::ClassExtension|set#property(#t201, self::NumberExtension|+(self::ClassExtension|get#property(#t201), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  let final self::Class #t202 = v in self::ClassExtension|set#property(#t202, self::NumberExtension|-(self::ClassExtension|get#property(#t202), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  let final self::Class #t203 = v in self::ClassExtension|set#property(#t203, self::NumberExtension|+(self::ClassExtension|get#property(#t203), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|-(self::ClassExtension|get#property(#t204), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t209 = v in let final self::Number #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  let final self::Class #t205 = v in let final self::Number #t206 = self::NumberExtension|+(self::ClassExtension|get#property(#t205), 1) in let final void #t207 = self::ClassExtension|set#property(#t205, #t206) in #t206;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t212 = v in let final self::Number #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  let final self::Class #t208 = v in let final self::Number #t209 = self::NumberExtension|-(self::ClassExtension|get#property(#t208), 1) in let final void #t210 = self::ClassExtension|set#property(#t208, #t209) in #t209;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  let final self::Class #t211 = v in self::ClassExtension|set#property(#t211, self::NumberExtension|+(self::ClassExtension|get#property(#t211), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  let final self::Class #t212 = v in self::ClassExtension|set#property(#t212, self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testExplicitIntProperties() → dynamic {
@@ -373,105 +373,105 @@
   core::int n2 = 2;
   self::IntClass v = new self::IntClass::•(n0);
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass #t217 = v in let final core::int #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num) → core::int} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
-  self::expect(n2, let final self::IntClass #t220 = v in let final core::int #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num) → core::int} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
-  self::expect(n0, let final self::IntClass #t223 = v in let final core::int #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num) → core::int} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
-  self::expect(n1, let final self::IntClass #t226 = v in let final core::int #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num) → core::int} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
-  self::expect(n0, let final self::IntClass #t229 = v in let final core::int #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num) → core::int} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
-  self::expect(n1, let final self::IntClass #t232 = v in let final core::int #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num) → core::int} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
-  self::expect(n0, let final self::IntClass #t235 = v in let final core::int #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num) → core::int} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
-  self::expect(n0, let final self::IntClass #t238 = v in let final core::int #t239 = self::IntClassExtension|get#property(#t238) in let final core::int #t240 = let final core::int #t241 = #t239.{core::num::+}(1){(core::num) → core::int} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
-  self::expect(n1, let final self::IntClass #t243 = v in let final core::int #t244 = self::IntClassExtension|get#property(#t243) in let final core::int #t245 = let final core::int #t246 = #t244.{core::num::-}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n1, let final self::IntClass #t213 = v in let final core::int #t214 = self::IntClassExtension|get#property(#t213).{core::num::+}(n1){(core::num) → core::int} in let final void #t215 = self::IntClassExtension|set#property(#t213, #t214) in #t214);
+  self::expect(n2, let final self::IntClass #t216 = v in let final core::int #t217 = self::IntClassExtension|get#property(#t216).{core::num::+}(n1){(core::num) → core::int} in let final void #t218 = self::IntClassExtension|set#property(#t216, #t217) in #t217);
+  self::expect(n0, let final self::IntClass #t219 = v in let final core::int #t220 = self::IntClassExtension|get#property(#t219).{core::num::-}(n2){(core::num) → core::int} in let final void #t221 = self::IntClassExtension|set#property(#t219, #t220) in #t220);
+  self::expect(n1, let final self::IntClass #t222 = v in let final core::int #t223 = self::IntClassExtension|get#property(#t222).{core::num::+}(n1){(core::num) → core::int} in let final void #t224 = self::IntClassExtension|set#property(#t222, #t223) in #t223);
+  self::expect(n0, let final self::IntClass #t225 = v in let final core::int #t226 = self::IntClassExtension|get#property(#t225).{core::num::-}(n1){(core::num) → core::int} in let final void #t227 = self::IntClassExtension|set#property(#t225, #t226) in #t226);
+  self::expect(n1, let final self::IntClass #t228 = v in let final core::int #t229 = self::IntClassExtension|get#property(#t228).{core::num::+}(1){(core::num) → core::int} in let final void #t230 = self::IntClassExtension|set#property(#t228, #t229) in #t229);
+  self::expect(n0, let final self::IntClass #t231 = v in let final core::int #t232 = self::IntClassExtension|get#property(#t231).{core::num::-}(1){(core::num) → core::int} in let final void #t233 = self::IntClassExtension|set#property(#t231, #t232) in #t232);
+  self::expect(n0, let final self::IntClass #t234 = v in let final core::int #t235 = self::IntClassExtension|get#property(#t234) in let final void #t236 = self::IntClassExtension|set#property(#t234, #t235.{core::num::+}(1){(core::num) → core::int}) in #t235);
+  self::expect(n1, let final self::IntClass #t237 = v in let final core::int #t238 = self::IntClassExtension|get#property(#t237) in let final void #t239 = self::IntClassExtension|set#property(#t237, #t238.{core::num::-}(1){(core::num) → core::int}) in #t238);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t240 = v in self::IntClassExtension|set#property(#t240, self::IntClassExtension|get#property(#t240).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t241 = v in self::IntClassExtension|set#property(#t241, self::IntClassExtension|get#property(#t241).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num) → core::int});
+  let final self::IntClass #t242 = v in self::IntClassExtension|set#property(#t242, self::IntClassExtension|get#property(#t242).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num) → core::int});
+  let final self::IntClass #t243 = v in self::IntClassExtension|set#property(#t243, self::IntClassExtension|get#property(#t243).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num) → core::int});
+  let final self::IntClass #t244 = v in self::IntClassExtension|set#property(#t244, self::IntClassExtension|get#property(#t244).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t253 = v in let final core::int #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num) → core::int} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  let final self::IntClass #t245 = v in let final core::int #t246 = self::IntClassExtension|get#property(#t245).{core::num::+}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t245, #t246) in #t246;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t256 = v in let final core::int #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num) → core::int} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  let final self::IntClass #t248 = v in let final core::int #t249 = self::IntClassExtension|get#property(#t248).{core::num::-}(1){(core::num) → core::int} in let final void #t250 = self::IntClassExtension|set#property(#t248, #t249) in #t249;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num) → core::int});
+  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num) → core::int});
+  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
 static method testExplicitNullAwareProperties(self::Class? v) → dynamic {
   self::Number n0 = new self::Number::•(0);
   self::Number n1 = new self::Number::•(1);
   self::Number n2 = new self::Number::•(2);
-  self::expect(n0, let final self::Class? #t261 = v in #t261 == null ?{self::Number?} null : self::ClassExtension|get#property(#t261{self::Class}), v == null);
-  self::expect(n1, let final self::Class? #t262 = v in #t262 == null ?{self::Number?} null : let final self::Number #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262{self::Class}), n1) in let final void #t264 = self::ClassExtension|set#property(#t262{self::Class}, #t263) in #t263, v == null);
-  self::expect(n2, let final self::Class? #t265 = v in #t265 == null ?{self::Number?} null : let final self::Number #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265{self::Class}), n1) in let final void #t267 = self::ClassExtension|set#property(#t265{self::Class}, #t266) in #t266, v == null);
-  self::expect(n0, let final self::Class? #t268 = v in #t268 == null ?{self::Number?} null : let final self::Number #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268{self::Class}), n2) in let final void #t270 = self::ClassExtension|set#property(#t268{self::Class}, #t269) in #t269, v == null);
-  self::expect(n1, let final self::Class? #t271 = v in #t271 == null ?{self::Number?} null : let final self::Number #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271{self::Class}), n1) in let final void #t273 = self::ClassExtension|set#property(#t271{self::Class}, #t272) in #t272, v == null);
-  self::expect(n0, let final self::Class? #t274 = v in #t274 == null ?{self::Number?} null : let final self::Number #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274{self::Class}), n1) in let final void #t276 = self::ClassExtension|set#property(#t274{self::Class}, #t275) in #t275, v == null);
-  self::expect(n1, let final self::Class? #t277 = v in #t277 == null ?{self::Number?} null : let final self::Number #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277{self::Class}), 1) in let final void #t279 = self::ClassExtension|set#property(#t277{self::Class}, #t278) in #t278, v == null);
-  self::expect(n0, let final self::Class? #t280 = v in #t280 == null ?{self::Number?} null : let final self::Number #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280{self::Class}), 1) in let final void #t282 = self::ClassExtension|set#property(#t280{self::Class}, #t281) in #t281, v == null);
-  self::expect(n0, let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : let final self::Number #t284 = self::ClassExtension|get#property(#t283{self::Class}) in let final self::Number #t285 = let final self::Number #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283{self::Class}, #t286) in #t286 in #t284, v == null);
-  self::expect(n1, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : let final self::Number #t289 = self::ClassExtension|get#property(#t288{self::Class}) in let final self::Number #t290 = let final self::Number #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288{self::Class}, #t291) in #t291 in #t289, v == null);
-  self::expect(n0, let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : self::ClassExtension|get#property(#t293{self::Class}), v == null);
-  self::expect(n0, let final self::Class? #t294 = v in #t294 == null ?{self::Number?} null : self::ClassExtension|get#property(#t294{self::Class}), v == null);
-  let final self::Class? #t295 = v in #t295 == null ?{self::Number?} null : self::ClassExtension|set#property(#t295{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t295{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t253 = v in #t253 == null ?{self::Number?} null : self::ClassExtension|get#property(#t253{self::Class}), v == null);
+  self::expect(n1, let final self::Class? #t254 = v in #t254 == null ?{self::Number?} null : let final self::Number #t255 = self::NumberExtension|+(self::ClassExtension|get#property(#t254{self::Class}), n1) in let final void #t256 = self::ClassExtension|set#property(#t254{self::Class}, #t255) in #t255, v == null);
+  self::expect(n2, let final self::Class? #t257 = v in #t257 == null ?{self::Number?} null : let final self::Number #t258 = self::NumberExtension|+(self::ClassExtension|get#property(#t257{self::Class}), n1) in let final void #t259 = self::ClassExtension|set#property(#t257{self::Class}, #t258) in #t258, v == null);
+  self::expect(n0, let final self::Class? #t260 = v in #t260 == null ?{self::Number?} null : let final self::Number #t261 = self::NumberExtension|-(self::ClassExtension|get#property(#t260{self::Class}), n2) in let final void #t262 = self::ClassExtension|set#property(#t260{self::Class}, #t261) in #t261, v == null);
+  self::expect(n1, let final self::Class? #t263 = v in #t263 == null ?{self::Number?} null : let final self::Number #t264 = self::NumberExtension|+(self::ClassExtension|get#property(#t263{self::Class}), n1) in let final void #t265 = self::ClassExtension|set#property(#t263{self::Class}, #t264) in #t264, v == null);
+  self::expect(n0, let final self::Class? #t266 = v in #t266 == null ?{self::Number?} null : let final self::Number #t267 = self::NumberExtension|-(self::ClassExtension|get#property(#t266{self::Class}), n1) in let final void #t268 = self::ClassExtension|set#property(#t266{self::Class}, #t267) in #t267, v == null);
+  self::expect(n1, let final self::Class? #t269 = v in #t269 == null ?{self::Number?} null : let final self::Number #t270 = self::NumberExtension|+(self::ClassExtension|get#property(#t269{self::Class}), 1) in let final void #t271 = self::ClassExtension|set#property(#t269{self::Class}, #t270) in #t270, v == null);
+  self::expect(n0, let final self::Class? #t272 = v in #t272 == null ?{self::Number?} null : let final self::Number #t273 = self::NumberExtension|-(self::ClassExtension|get#property(#t272{self::Class}), 1) in let final void #t274 = self::ClassExtension|set#property(#t272{self::Class}, #t273) in #t273, v == null);
+  self::expect(n0, let final self::Class? #t275 = v in #t275 == null ?{self::Number?} null : let final self::Number #t276 = self::ClassExtension|get#property(#t275{self::Class}) in let final void #t277 = self::ClassExtension|set#property(#t275{self::Class}, self::NumberExtension|+(#t276, 1)) in #t276, v == null);
+  self::expect(n1, let final self::Class? #t278 = v in #t278 == null ?{self::Number?} null : let final self::Number #t279 = self::ClassExtension|get#property(#t278{self::Class}) in let final void #t280 = self::ClassExtension|set#property(#t278{self::Class}, self::NumberExtension|-(#t279, 1)) in #t279, v == null);
+  self::expect(n0, let final self::Class? #t281 = v in #t281 == null ?{self::Number?} null : self::ClassExtension|get#property(#t281{self::Class}), v == null);
+  self::expect(n0, let final self::Class? #t282 = v in #t282 == null ?{self::Number?} null : self::ClassExtension|get#property(#t282{self::Class}), v == null);
+  let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : self::ClassExtension|set#property(#t283{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t283{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t284 = v in #t284 == null ?{self::Number?} null : self::ClassExtension|get#property(#t284{self::Class}), v == null);
+  let final self::Class? #t285 = v in #t285 == null ?{self::Number?} null : self::ClassExtension|set#property(#t285{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t285{self::Class}), n1));
+  self::expect(n2, let final self::Class? #t286 = v in #t286 == null ?{self::Number?} null : self::ClassExtension|get#property(#t286{self::Class}), v == null);
+  let final self::Class? #t287 = v in #t287 == null ?{self::Number?} null : self::ClassExtension|set#property(#t287{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t287{self::Class}), n2));
+  self::expect(n0, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : self::ClassExtension|get#property(#t288{self::Class}), v == null);
+  let final self::Class? #t289 = v in #t289 == null ?{self::Number?} null : self::ClassExtension|set#property(#t289{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t289{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t290 = v in #t290 == null ?{self::Number?} null : self::ClassExtension|get#property(#t290{self::Class}), v == null);
+  let final self::Class? #t291 = v in #t291 == null ?{self::Number?} null : self::ClassExtension|set#property(#t291{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t291{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t292 = v in #t292 == null ?{self::Number?} null : self::ClassExtension|get#property(#t292{self::Class}), v == null);
+  let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : let final self::Number #t294 = self::NumberExtension|+(self::ClassExtension|get#property(#t293{self::Class}), 1) in let final void #t295 = self::ClassExtension|set#property(#t293{self::Class}, #t294) in #t294;
   self::expect(n1, let final self::Class? #t296 = v in #t296 == null ?{self::Number?} null : self::ClassExtension|get#property(#t296{self::Class}), v == null);
-  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : self::ClassExtension|set#property(#t297{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t297{self::Class}), n1));
-  self::expect(n2, let final self::Class? #t298 = v in #t298 == null ?{self::Number?} null : self::ClassExtension|get#property(#t298{self::Class}), v == null);
-  let final self::Class? #t299 = v in #t299 == null ?{self::Number?} null : self::ClassExtension|set#property(#t299{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t299{self::Class}), n2));
+  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : let final self::Number #t298 = self::NumberExtension|-(self::ClassExtension|get#property(#t297{self::Class}), 1) in let final void #t299 = self::ClassExtension|set#property(#t297{self::Class}, #t298) in #t298;
   self::expect(n0, let final self::Class? #t300 = v in #t300 == null ?{self::Number?} null : self::ClassExtension|get#property(#t300{self::Class}), v == null);
-  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), n1));
+  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), 1));
   self::expect(n1, let final self::Class? #t302 = v in #t302 == null ?{self::Number?} null : self::ClassExtension|get#property(#t302{self::Class}), v == null);
-  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), n1));
+  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), 1));
   self::expect(n0, let final self::Class? #t304 = v in #t304 == null ?{self::Number?} null : self::ClassExtension|get#property(#t304{self::Class}), v == null);
-  let final self::Class? #t305 = v in #t305 == null ?{self::Number?} null : let final self::Number #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305{self::Class}), 1) in let final void #t307 = self::ClassExtension|set#property(#t305{self::Class}, #t306) in #t306;
-  self::expect(n1, let final self::Class? #t308 = v in #t308 == null ?{self::Number?} null : self::ClassExtension|get#property(#t308{self::Class}), v == null);
-  let final self::Class? #t309 = v in #t309 == null ?{self::Number?} null : let final self::Number #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309{self::Class}), 1) in let final void #t311 = self::ClassExtension|set#property(#t309{self::Class}, #t310) in #t310;
-  self::expect(n0, let final self::Class? #t312 = v in #t312 == null ?{self::Number?} null : self::ClassExtension|get#property(#t312{self::Class}), v == null);
-  let final self::Class? #t313 = v in #t313 == null ?{self::Number?} null : self::ClassExtension|set#property(#t313{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t313{self::Class}), 1));
-  self::expect(n1, let final self::Class? #t314 = v in #t314 == null ?{self::Number?} null : self::ClassExtension|get#property(#t314{self::Class}), v == null);
-  let final self::Class? #t315 = v in #t315 == null ?{self::Number?} null : self::ClassExtension|set#property(#t315{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t315{self::Class}), 1));
-  self::expect(n0, let final self::Class? #t316 = v in #t316 == null ?{self::Number?} null : self::ClassExtension|get#property(#t316{self::Class}), v == null);
 }
 static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic {
   core::int n0 = 0;
   core::int n1 = 1;
   core::int n2 = 2;
-  self::expect(n0, let final self::IntClass? #t317 = v in #t317 == null ?{core::int?} null : self::IntClassExtension|get#property(#t317{self::IntClass}), v == null);
-  self::expect(n1, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
-  self::expect(n2, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
-  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
-  self::expect(n1, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328) in #t328, v == null);
-  self::expect(n0, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331) in #t331, v == null);
-  self::expect(n1, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : let final core::int #t334 = self::IntClassExtension|get#property(#t333{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t335 = self::IntClassExtension|set#property(#t333{self::IntClass}, #t334) in #t334, v == null);
-  self::expect(n0, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : let final core::int #t337 = self::IntClassExtension|get#property(#t336{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t338 = self::IntClassExtension|set#property(#t336{self::IntClass}, #t337) in #t337, v == null);
-  self::expect(n0, let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : let final core::int #t340 = self::IntClassExtension|get#property(#t339{self::IntClass}) in let final core::int #t341 = let final core::int #t342 = #t340.{core::num::+}(1){(core::num) → core::int} in let final void #t343 = self::IntClassExtension|set#property(#t339{self::IntClass}, #t342) in #t342 in #t340, v == null);
-  self::expect(n1, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : let final core::int #t345 = self::IntClassExtension|get#property(#t344{self::IntClass}) in let final core::int #t346 = let final core::int #t347 = #t345.{core::num::-}(1){(core::num) → core::int} in let final void #t348 = self::IntClassExtension|set#property(#t344{self::IntClass}, #t347) in #t347 in #t345, v == null);
-  self::expect(n0, let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : self::IntClassExtension|get#property(#t349{self::IntClass}), v == null);
-  self::expect(n0, let final self::IntClass? #t350 = v in #t350 == null ?{core::int?} null : self::IntClassExtension|get#property(#t350{self::IntClass}), v == null);
-  let final self::IntClass? #t351 = v in #t351 == null ?{core::int?} null : self::IntClassExtension|set#property(#t351{self::IntClass}, self::IntClassExtension|get#property(#t351{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
-  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n2, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
-  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t305 = v in #t305 == null ?{core::int?} null : self::IntClassExtension|get#property(#t305{self::IntClass}), v == null);
+  self::expect(n1, let final self::IntClass? #t306 = v in #t306 == null ?{core::int?} null : let final core::int #t307 = self::IntClassExtension|get#property(#t306{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t308 = self::IntClassExtension|set#property(#t306{self::IntClass}, #t307) in #t307, v == null);
+  self::expect(n2, let final self::IntClass? #t309 = v in #t309 == null ?{core::int?} null : let final core::int #t310 = self::IntClassExtension|get#property(#t309{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t311 = self::IntClassExtension|set#property(#t309{self::IntClass}, #t310) in #t310, v == null);
+  self::expect(n0, let final self::IntClass? #t312 = v in #t312 == null ?{core::int?} null : let final core::int #t313 = self::IntClassExtension|get#property(#t312{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t314 = self::IntClassExtension|set#property(#t312{self::IntClass}, #t313) in #t313, v == null);
+  self::expect(n1, let final self::IntClass? #t315 = v in #t315 == null ?{core::int?} null : let final core::int #t316 = self::IntClassExtension|get#property(#t315{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t317 = self::IntClassExtension|set#property(#t315{self::IntClass}, #t316) in #t316, v == null);
+  self::expect(n0, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
+  self::expect(n1, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
+  self::expect(n0, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}) in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328.{core::num::+}(1){(core::num) → core::int}) in #t328, v == null);
+  self::expect(n1, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}) in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331.{core::num::-}(1){(core::num) → core::int}) in #t331, v == null);
+  self::expect(n0, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : self::IntClassExtension|get#property(#t333{self::IntClass}), v == null);
+  self::expect(n0, let final self::IntClass? #t334 = v in #t334 == null ?{core::int?} null : self::IntClassExtension|get#property(#t334{self::IntClass}), v == null);
+  let final self::IntClass? #t335 = v in #t335 == null ?{core::int?} null : self::IntClassExtension|set#property(#t335{self::IntClass}, self::IntClassExtension|get#property(#t335{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : self::IntClassExtension|get#property(#t336{self::IntClass}), v == null);
+  let final self::IntClass? #t337 = v in #t337 == null ?{core::int?} null : self::IntClassExtension|set#property(#t337{self::IntClass}, self::IntClassExtension|get#property(#t337{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass? #t338 = v in #t338 == null ?{core::int?} null : self::IntClassExtension|get#property(#t338{self::IntClass}), v == null);
+  let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : self::IntClassExtension|set#property(#t339{self::IntClass}, self::IntClassExtension|get#property(#t339{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t340 = v in #t340 == null ?{core::int?} null : self::IntClassExtension|get#property(#t340{self::IntClass}), v == null);
+  let final self::IntClass? #t341 = v in #t341 == null ?{core::int?} null : self::IntClassExtension|set#property(#t341{self::IntClass}, self::IntClassExtension|get#property(#t341{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t342 = v in #t342 == null ?{core::int?} null : self::IntClassExtension|get#property(#t342{self::IntClass}), v == null);
+  let final self::IntClass? #t343 = v in #t343 == null ?{core::int?} null : self::IntClassExtension|set#property(#t343{self::IntClass}, self::IntClassExtension|get#property(#t343{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : self::IntClassExtension|get#property(#t344{self::IntClass}), v == null);
+  let final self::IntClass? #t345 = v in #t345 == null ?{core::int?} null : let final core::int #t346 = self::IntClassExtension|get#property(#t345{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t347 = self::IntClassExtension|set#property(#t345{self::IntClass}, #t346) in #t346;
+  self::expect(n1, let final self::IntClass? #t348 = v in #t348 == null ?{core::int?} null : self::IntClassExtension|get#property(#t348{self::IntClass}), v == null);
+  let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : let final core::int #t350 = self::IntClassExtension|get#property(#t349{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t351 = self::IntClassExtension|set#property(#t349{self::IntClass}, #t350) in #t350;
+  self::expect(n0, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
+  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
+  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, let final self::IntClass? #t356 = v in #t356 == null ?{core::int?} null : self::IntClassExtension|get#property(#t356{self::IntClass}), v == null);
-  let final self::IntClass? #t357 = v in #t357 == null ?{core::int?} null : self::IntClassExtension|set#property(#t357{self::IntClass}, self::IntClassExtension|get#property(#t357{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t358 = v in #t358 == null ?{core::int?} null : self::IntClassExtension|get#property(#t358{self::IntClass}), v == null);
-  let final self::IntClass? #t359 = v in #t359 == null ?{core::int?} null : self::IntClassExtension|set#property(#t359{self::IntClass}, self::IntClassExtension|get#property(#t359{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
-  self::expect(n0, let final self::IntClass? #t360 = v in #t360 == null ?{core::int?} null : self::IntClassExtension|get#property(#t360{self::IntClass}), v == null);
-  let final self::IntClass? #t361 = v in #t361 == null ?{core::int?} null : let final core::int #t362 = self::IntClassExtension|get#property(#t361{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t363 = self::IntClassExtension|set#property(#t361{self::IntClass}, #t362) in #t362;
-  self::expect(n1, let final self::IntClass? #t364 = v in #t364 == null ?{core::int?} null : self::IntClassExtension|get#property(#t364{self::IntClass}), v == null);
-  let final self::IntClass? #t365 = v in #t365 == null ?{core::int?} null : let final core::int #t366 = self::IntClassExtension|get#property(#t365{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t367 = self::IntClassExtension|set#property(#t365{self::IntClass}, #t366) in #t366;
-  self::expect(n0, let final self::IntClass? #t368 = v in #t368 == null ?{core::int?} null : self::IntClassExtension|get#property(#t368{self::IntClass}), v == null);
-  let final self::IntClass? #t369 = v in #t369 == null ?{core::int?} null : self::IntClassExtension|set#property(#t369{self::IntClass}, self::IntClassExtension|get#property(#t369{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
-  self::expect(n1, let final self::IntClass? #t370 = v in #t370 == null ?{core::int?} null : self::IntClassExtension|get#property(#t370{self::IntClass}), v == null);
-  let final self::IntClass? #t371 = v in #t371 == null ?{core::int?} null : self::IntClassExtension|set#property(#t371{self::IntClass}, self::IntClassExtension|get#property(#t371{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
-  self::expect(n0, let final self::IntClass? #t372 = v in #t372 == null ?{core::int?} null : self::IntClassExtension|get#property(#t372{self::IntClass}), v == null);
 }
 static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
   if(expectNull as{TypeError,ForDynamic} core::bool) {
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart b/pkg/front_end/testcases/extensions/explicit_context.dart
new file mode 100644
index 0000000..70e5807
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2025, 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 E<T> on Set<T> {
+  int get property => 0;
+  set property(int value) {}
+  int method() => 0;
+  int operator [](int index) => 0;
+  void operator []=(int index, int value) {}
+}
+
+main() {
+  E({}).property;
+  E({}).property = 0;
+  E({}).method;
+  E({}).method();
+  E({}).property += 0;
+  E({}).property ??= 0;
+  E({})[0];
+  E({})[0] = 0;
+  E({})[0] += 0;
+  E({})[0] ??= 0;
+
+  E({})?.property;
+  E({})?.property = 0;
+  E({})?.method;
+  E({})?.method();
+  E({})?.property += 0;
+  E({})?.property ??= 0;
+  E({})?[0];
+  E({})?[0] = 0;
+  E({})?[0] += 0;
+  E({})?[0] ??= 0;
+
+  E<int>({}).property;
+  E<int>({}).property = 0;
+  E<int>({}).method;
+  E<int>({}).method();
+  E<int>({}).property += 0;
+  E<int>({}).property ??= 0;
+  E<int>({})[0];
+  E<int>({})[0] = 0;
+  E<int>({})[0] += 0;
+  E<int>({})[0] ??= 0;
+
+  E<int>({})?.property;
+  E<int>({})?.property = 0;
+  E<int>({})?.method;
+  E<int>({})?.method();
+  E<int>({})?.property += 0;
+  E<int>({})?.property ??= 0;
+  E<int>({})?[0];
+  E<int>({})?[0] = 0;
+  E<int>({})?[0] += 0;
+  E<int>({})?[0] ??= 0;
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart.strong.expect b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.expect
new file mode 100644
index 0000000..76d231e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.expect
@@ -0,0 +1,145 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  get property = self::E|get#property;
+  set property = self::E|set#property;
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+  operator [] = self::E|[];
+  operator []= = self::E|[]=;
+}
+static extension-member method E|get#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#property::T%> #this) → core::int
+  return 0;
+static extension-member method E|set#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|set#property::T%> #this, core::int value) → void {}
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → core::int
+  return 0;
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → core::int
+  return () → core::int => self::E|method<self::E|get#method::T%>(#this);
+static extension-member method E|[]<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]::T%> #this, core::int index) → core::int
+  return 0;
+static extension-member method E|[]=<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]=::T%> #this, core::int index, core::int value) → void {}
+static method main() → dynamic {
+  self::E|get#property<dynamic>( block {
+    final core::Set<dynamic> #t1 = col::LinkedHashSet::•<dynamic>();
+  } =>#t1);
+  self::E|set#property<dynamic>( block {
+    final core::Set<dynamic> #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2, 0);
+  self::E|get#method<dynamic>( block {
+    final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>();
+  } =>#t3);
+  self::E|method<dynamic>( block {
+    final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
+  } =>#t4);
+  let final core::Set<dynamic> #t5 = block {
+    final core::Set<dynamic> #t6 = col::LinkedHashSet::•<dynamic>();
+  } =>#t6 in self::E|set#property<dynamic>(#t5, self::E|get#property<dynamic>(#t5).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t7 = block {
+    final core::Set<dynamic> #t8 = col::LinkedHashSet::•<dynamic>();
+  } =>#t8 in self::E|get#property<dynamic>(#t7) == null ?{core::int?} self::E|set#property<dynamic>(#t7, 0) : null;
+  self::E|[]<dynamic>( block {
+    final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
+  } =>#t9, 0);
+  self::E|[]=<dynamic>( block {
+    final core::Set<dynamic> #t10 = col::LinkedHashSet::•<dynamic>();
+  } =>#t10, 0, 0);
+  let final core::Set<dynamic> #t11 = block {
+    final core::Set<dynamic> #t12 = col::LinkedHashSet::•<dynamic>();
+  } =>#t12 in let final core::int #t13 = 0 in self::E|[]=<dynamic>(#t11, #t13, self::E|[]<dynamic>(#t11, #t13).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t14 = block {
+    final core::Set<dynamic> #t15 = col::LinkedHashSet::•<dynamic>();
+  } =>#t15 in let final core::int #t16 = 0 in self::E|[]<dynamic>(#t14, #t16) == null ?{core::int?} self::E|[]=<dynamic>(#t14, #t16, 0) : null;
+  let final core::Set<dynamic> #t17 = block {
+    final core::Set<dynamic> #t18 = col::LinkedHashSet::•<dynamic>();
+  } =>#t18 in #t17 == null ?{core::int?} null : self::E|get#property<dynamic>(#t17);
+  let final core::Set<dynamic> #t19 = block {
+    final core::Set<dynamic> #t20 = col::LinkedHashSet::•<dynamic>();
+  } =>#t20 in #t19 == null ?{core::int?} null : self::E|set#property<dynamic>(#t19, 0);
+  let final core::Set<dynamic> #t21 = block {
+    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
+  } =>#t22 in #t21 == null ?{() →? core::int} null : self::E|get#method<dynamic>(#t21);
+  let final core::Set<dynamic> #t23 = block {
+    final core::Set<dynamic> #t24 = col::LinkedHashSet::•<dynamic>();
+  } =>#t24 in #t23 == null ?{core::int?} null : self::E|method<dynamic>(#t23);
+  let final core::Set<dynamic> #t25 = block {
+    final core::Set<dynamic> #t26 = col::LinkedHashSet::•<dynamic>();
+  } =>#t26 in #t25 == null ?{core::int?} null : self::E|set#property<dynamic>(#t25, self::E|get#property<dynamic>(#t25).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t27 = block {
+    final core::Set<dynamic> #t28 = col::LinkedHashSet::•<dynamic>();
+  } =>#t28 in #t27 == null ?{core::int?} null : self::E|get#property<dynamic>(#t27) == null ?{core::int?} self::E|set#property<dynamic>(#t27, 0) : null;
+  let final core::Set<dynamic> #t29 = block {
+    final core::Set<dynamic> #t30 = col::LinkedHashSet::•<dynamic>();
+  } =>#t30 in #t29 == null ?{core::int?} null : self::E|[]<dynamic>(#t29, 0);
+  let final core::Set<dynamic> #t31 = block {
+    final core::Set<dynamic> #t32 = col::LinkedHashSet::•<dynamic>();
+  } =>#t32 in #t31 == null ?{core::int?} null : self::E|[]=<dynamic>(#t31, 0, 0);
+  let final core::Set<dynamic> #t33 = block {
+    final core::Set<dynamic> #t34 = col::LinkedHashSet::•<dynamic>();
+  } =>#t34 in #t33 == null ?{core::int?} null : let final core::int #t35 = 0 in self::E|[]=<dynamic>(#t33, #t35, self::E|[]<dynamic>(#t33, #t35).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t36 = block {
+    final core::Set<dynamic> #t37 = col::LinkedHashSet::•<dynamic>();
+  } =>#t37 in #t36 == null ?{core::int?} null : let final core::int #t38 = 0 in self::E|[]<dynamic>(#t36, #t38) == null ?{core::int?} self::E|[]=<dynamic>(#t36, #t38, 0) : null;
+  self::E|get#property<core::int>( block {
+    final core::Set<core::int> #t39 = col::LinkedHashSet::•<core::int>();
+  } =>#t39);
+  self::E|set#property<core::int>( block {
+    final core::Set<core::int> #t40 = col::LinkedHashSet::•<core::int>();
+  } =>#t40, 0);
+  self::E|get#method<core::int>( block {
+    final core::Set<core::int> #t41 = col::LinkedHashSet::•<core::int>();
+  } =>#t41);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t42 = col::LinkedHashSet::•<core::int>();
+  } =>#t42);
+  let final core::Set<core::int> #t43 = block {
+    final core::Set<core::int> #t44 = col::LinkedHashSet::•<core::int>();
+  } =>#t44 in self::E|set#property<core::int>(#t43, self::E|get#property<core::int>(#t43).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t45 = block {
+    final core::Set<core::int> #t46 = col::LinkedHashSet::•<core::int>();
+  } =>#t46 in self::E|get#property<core::int>(#t45) == null ?{core::int?} self::E|set#property<core::int>(#t45, 0) : null;
+  self::E|[]<core::int>( block {
+    final core::Set<core::int> #t47 = col::LinkedHashSet::•<core::int>();
+  } =>#t47, 0);
+  self::E|[]=<core::int>( block {
+    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
+  } =>#t48, 0, 0);
+  let final core::Set<core::int> #t49 = block {
+    final core::Set<core::int> #t50 = col::LinkedHashSet::•<core::int>();
+  } =>#t50 in let final core::int #t51 = 0 in self::E|[]=<core::int>(#t49, #t51, self::E|[]<core::int>(#t49, #t51).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t52 = block {
+    final core::Set<core::int> #t53 = col::LinkedHashSet::•<core::int>();
+  } =>#t53 in let final core::int #t54 = 0 in self::E|[]<core::int>(#t52, #t54) == null ?{core::int?} self::E|[]=<core::int>(#t52, #t54, 0) : null;
+  let final core::Set<core::int> #t55 = block {
+    final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
+  } =>#t56 in #t55 == null ?{core::int?} null : self::E|get#property<core::int>(#t55);
+  let final core::Set<core::int> #t57 = block {
+    final core::Set<core::int> #t58 = col::LinkedHashSet::•<core::int>();
+  } =>#t58 in #t57 == null ?{core::int?} null : self::E|set#property<core::int>(#t57, 0);
+  let final core::Set<core::int> #t59 = block {
+    final core::Set<core::int> #t60 = col::LinkedHashSet::•<core::int>();
+  } =>#t60 in #t59 == null ?{() →? core::int} null : self::E|get#method<core::int>(#t59);
+  let final core::Set<core::int> #t61 = block {
+    final core::Set<core::int> #t62 = col::LinkedHashSet::•<core::int>();
+  } =>#t62 in #t61 == null ?{core::int?} null : self::E|method<core::int>(#t61);
+  let final core::Set<core::int> #t63 = block {
+    final core::Set<core::int> #t64 = col::LinkedHashSet::•<core::int>();
+  } =>#t64 in #t63 == null ?{core::int?} null : self::E|set#property<core::int>(#t63, self::E|get#property<core::int>(#t63).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t65 = block {
+    final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>();
+  } =>#t66 in #t65 == null ?{core::int?} null : self::E|get#property<core::int>(#t65) == null ?{core::int?} self::E|set#property<core::int>(#t65, 0) : null;
+  let final core::Set<core::int> #t67 = block {
+    final core::Set<core::int> #t68 = col::LinkedHashSet::•<core::int>();
+  } =>#t68 in #t67 == null ?{core::int?} null : self::E|[]<core::int>(#t67, 0);
+  let final core::Set<core::int> #t69 = block {
+    final core::Set<core::int> #t70 = col::LinkedHashSet::•<core::int>();
+  } =>#t70 in #t69 == null ?{core::int?} null : self::E|[]=<core::int>(#t69, 0, 0);
+  let final core::Set<core::int> #t71 = block {
+    final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>();
+  } =>#t72 in #t71 == null ?{core::int?} null : let final core::int #t73 = 0 in self::E|[]=<core::int>(#t71, #t73, self::E|[]<core::int>(#t71, #t73).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t74 = block {
+    final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>();
+  } =>#t75 in #t74 == null ?{core::int?} null : let final core::int #t76 = 0 in self::E|[]<core::int>(#t74, #t76) == null ?{core::int?} self::E|[]=<core::int>(#t74, #t76, 0) : null;
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.modular.expect
new file mode 100644
index 0000000..76d231e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.modular.expect
@@ -0,0 +1,145 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  get property = self::E|get#property;
+  set property = self::E|set#property;
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+  operator [] = self::E|[];
+  operator []= = self::E|[]=;
+}
+static extension-member method E|get#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#property::T%> #this) → core::int
+  return 0;
+static extension-member method E|set#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|set#property::T%> #this, core::int value) → void {}
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → core::int
+  return 0;
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → core::int
+  return () → core::int => self::E|method<self::E|get#method::T%>(#this);
+static extension-member method E|[]<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]::T%> #this, core::int index) → core::int
+  return 0;
+static extension-member method E|[]=<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]=::T%> #this, core::int index, core::int value) → void {}
+static method main() → dynamic {
+  self::E|get#property<dynamic>( block {
+    final core::Set<dynamic> #t1 = col::LinkedHashSet::•<dynamic>();
+  } =>#t1);
+  self::E|set#property<dynamic>( block {
+    final core::Set<dynamic> #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2, 0);
+  self::E|get#method<dynamic>( block {
+    final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>();
+  } =>#t3);
+  self::E|method<dynamic>( block {
+    final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
+  } =>#t4);
+  let final core::Set<dynamic> #t5 = block {
+    final core::Set<dynamic> #t6 = col::LinkedHashSet::•<dynamic>();
+  } =>#t6 in self::E|set#property<dynamic>(#t5, self::E|get#property<dynamic>(#t5).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t7 = block {
+    final core::Set<dynamic> #t8 = col::LinkedHashSet::•<dynamic>();
+  } =>#t8 in self::E|get#property<dynamic>(#t7) == null ?{core::int?} self::E|set#property<dynamic>(#t7, 0) : null;
+  self::E|[]<dynamic>( block {
+    final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
+  } =>#t9, 0);
+  self::E|[]=<dynamic>( block {
+    final core::Set<dynamic> #t10 = col::LinkedHashSet::•<dynamic>();
+  } =>#t10, 0, 0);
+  let final core::Set<dynamic> #t11 = block {
+    final core::Set<dynamic> #t12 = col::LinkedHashSet::•<dynamic>();
+  } =>#t12 in let final core::int #t13 = 0 in self::E|[]=<dynamic>(#t11, #t13, self::E|[]<dynamic>(#t11, #t13).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t14 = block {
+    final core::Set<dynamic> #t15 = col::LinkedHashSet::•<dynamic>();
+  } =>#t15 in let final core::int #t16 = 0 in self::E|[]<dynamic>(#t14, #t16) == null ?{core::int?} self::E|[]=<dynamic>(#t14, #t16, 0) : null;
+  let final core::Set<dynamic> #t17 = block {
+    final core::Set<dynamic> #t18 = col::LinkedHashSet::•<dynamic>();
+  } =>#t18 in #t17 == null ?{core::int?} null : self::E|get#property<dynamic>(#t17);
+  let final core::Set<dynamic> #t19 = block {
+    final core::Set<dynamic> #t20 = col::LinkedHashSet::•<dynamic>();
+  } =>#t20 in #t19 == null ?{core::int?} null : self::E|set#property<dynamic>(#t19, 0);
+  let final core::Set<dynamic> #t21 = block {
+    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
+  } =>#t22 in #t21 == null ?{() →? core::int} null : self::E|get#method<dynamic>(#t21);
+  let final core::Set<dynamic> #t23 = block {
+    final core::Set<dynamic> #t24 = col::LinkedHashSet::•<dynamic>();
+  } =>#t24 in #t23 == null ?{core::int?} null : self::E|method<dynamic>(#t23);
+  let final core::Set<dynamic> #t25 = block {
+    final core::Set<dynamic> #t26 = col::LinkedHashSet::•<dynamic>();
+  } =>#t26 in #t25 == null ?{core::int?} null : self::E|set#property<dynamic>(#t25, self::E|get#property<dynamic>(#t25).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t27 = block {
+    final core::Set<dynamic> #t28 = col::LinkedHashSet::•<dynamic>();
+  } =>#t28 in #t27 == null ?{core::int?} null : self::E|get#property<dynamic>(#t27) == null ?{core::int?} self::E|set#property<dynamic>(#t27, 0) : null;
+  let final core::Set<dynamic> #t29 = block {
+    final core::Set<dynamic> #t30 = col::LinkedHashSet::•<dynamic>();
+  } =>#t30 in #t29 == null ?{core::int?} null : self::E|[]<dynamic>(#t29, 0);
+  let final core::Set<dynamic> #t31 = block {
+    final core::Set<dynamic> #t32 = col::LinkedHashSet::•<dynamic>();
+  } =>#t32 in #t31 == null ?{core::int?} null : self::E|[]=<dynamic>(#t31, 0, 0);
+  let final core::Set<dynamic> #t33 = block {
+    final core::Set<dynamic> #t34 = col::LinkedHashSet::•<dynamic>();
+  } =>#t34 in #t33 == null ?{core::int?} null : let final core::int #t35 = 0 in self::E|[]=<dynamic>(#t33, #t35, self::E|[]<dynamic>(#t33, #t35).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t36 = block {
+    final core::Set<dynamic> #t37 = col::LinkedHashSet::•<dynamic>();
+  } =>#t37 in #t36 == null ?{core::int?} null : let final core::int #t38 = 0 in self::E|[]<dynamic>(#t36, #t38) == null ?{core::int?} self::E|[]=<dynamic>(#t36, #t38, 0) : null;
+  self::E|get#property<core::int>( block {
+    final core::Set<core::int> #t39 = col::LinkedHashSet::•<core::int>();
+  } =>#t39);
+  self::E|set#property<core::int>( block {
+    final core::Set<core::int> #t40 = col::LinkedHashSet::•<core::int>();
+  } =>#t40, 0);
+  self::E|get#method<core::int>( block {
+    final core::Set<core::int> #t41 = col::LinkedHashSet::•<core::int>();
+  } =>#t41);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t42 = col::LinkedHashSet::•<core::int>();
+  } =>#t42);
+  let final core::Set<core::int> #t43 = block {
+    final core::Set<core::int> #t44 = col::LinkedHashSet::•<core::int>();
+  } =>#t44 in self::E|set#property<core::int>(#t43, self::E|get#property<core::int>(#t43).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t45 = block {
+    final core::Set<core::int> #t46 = col::LinkedHashSet::•<core::int>();
+  } =>#t46 in self::E|get#property<core::int>(#t45) == null ?{core::int?} self::E|set#property<core::int>(#t45, 0) : null;
+  self::E|[]<core::int>( block {
+    final core::Set<core::int> #t47 = col::LinkedHashSet::•<core::int>();
+  } =>#t47, 0);
+  self::E|[]=<core::int>( block {
+    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
+  } =>#t48, 0, 0);
+  let final core::Set<core::int> #t49 = block {
+    final core::Set<core::int> #t50 = col::LinkedHashSet::•<core::int>();
+  } =>#t50 in let final core::int #t51 = 0 in self::E|[]=<core::int>(#t49, #t51, self::E|[]<core::int>(#t49, #t51).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t52 = block {
+    final core::Set<core::int> #t53 = col::LinkedHashSet::•<core::int>();
+  } =>#t53 in let final core::int #t54 = 0 in self::E|[]<core::int>(#t52, #t54) == null ?{core::int?} self::E|[]=<core::int>(#t52, #t54, 0) : null;
+  let final core::Set<core::int> #t55 = block {
+    final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
+  } =>#t56 in #t55 == null ?{core::int?} null : self::E|get#property<core::int>(#t55);
+  let final core::Set<core::int> #t57 = block {
+    final core::Set<core::int> #t58 = col::LinkedHashSet::•<core::int>();
+  } =>#t58 in #t57 == null ?{core::int?} null : self::E|set#property<core::int>(#t57, 0);
+  let final core::Set<core::int> #t59 = block {
+    final core::Set<core::int> #t60 = col::LinkedHashSet::•<core::int>();
+  } =>#t60 in #t59 == null ?{() →? core::int} null : self::E|get#method<core::int>(#t59);
+  let final core::Set<core::int> #t61 = block {
+    final core::Set<core::int> #t62 = col::LinkedHashSet::•<core::int>();
+  } =>#t62 in #t61 == null ?{core::int?} null : self::E|method<core::int>(#t61);
+  let final core::Set<core::int> #t63 = block {
+    final core::Set<core::int> #t64 = col::LinkedHashSet::•<core::int>();
+  } =>#t64 in #t63 == null ?{core::int?} null : self::E|set#property<core::int>(#t63, self::E|get#property<core::int>(#t63).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t65 = block {
+    final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>();
+  } =>#t66 in #t65 == null ?{core::int?} null : self::E|get#property<core::int>(#t65) == null ?{core::int?} self::E|set#property<core::int>(#t65, 0) : null;
+  let final core::Set<core::int> #t67 = block {
+    final core::Set<core::int> #t68 = col::LinkedHashSet::•<core::int>();
+  } =>#t68 in #t67 == null ?{core::int?} null : self::E|[]<core::int>(#t67, 0);
+  let final core::Set<core::int> #t69 = block {
+    final core::Set<core::int> #t70 = col::LinkedHashSet::•<core::int>();
+  } =>#t70 in #t69 == null ?{core::int?} null : self::E|[]=<core::int>(#t69, 0, 0);
+  let final core::Set<core::int> #t71 = block {
+    final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>();
+  } =>#t72 in #t71 == null ?{core::int?} null : let final core::int #t73 = 0 in self::E|[]=<core::int>(#t71, #t73, self::E|[]<core::int>(#t71, #t73).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t74 = block {
+    final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>();
+  } =>#t75 in #t74 == null ?{core::int?} null : let final core::int #t76 = 0 in self::E|[]<core::int>(#t74, #t76) == null ?{core::int?} self::E|[]=<core::int>(#t74, #t76, 0) : null;
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart.strong.outline.expect b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.outline.expect
new file mode 100644
index 0000000..e881092
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  get property = self::E|get#property;
+  set property = self::E|set#property;
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+  operator [] = self::E|[];
+  operator []= = self::E|[]=;
+}
+static extension-member method E|get#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#property::T%> #this) → core::int
+  ;
+static extension-member method E|set#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|set#property::T%> #this, core::int value) → void
+  ;
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → core::int
+  ;
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → core::int
+  return () → core::int => self::E|method<self::E|get#method::T%>(#this);
+static extension-member method E|[]<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]::T%> #this, core::int index) → core::int
+  ;
+static extension-member method E|[]=<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]=::T%> #this, core::int index, core::int value) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.transformed.expect
new file mode 100644
index 0000000..4717d5c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart.strong.transformed.expect
@@ -0,0 +1,165 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_compact_hash" as _co;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  get property = self::E|get#property;
+  set property = self::E|set#property;
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+  operator [] = self::E|[];
+  operator []= = self::E|[]=;
+}
+static extension-member method E|get#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#property::T%> #this) → core::int
+  return 0;
+static extension-member method E|set#property<T extends core::Object? = dynamic>(lowered final core::Set<self::E|set#property::T%> #this, core::int value) → void {}
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → core::int
+  return 0;
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → core::int
+  return () → core::int => self::E|method<self::E|get#method::T%>(#this);
+static extension-member method E|[]<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]::T%> #this, core::int index) → core::int
+  return 0;
+static extension-member method E|[]=<T extends core::Object? = dynamic>(lowered final core::Set<self::E|[]=::T%> #this, core::int index, core::int value) → void {}
+static method main() → dynamic {
+  self::E|get#property<dynamic>( block {
+    final core::Set<dynamic> #t1 = new _co::_Set::•<dynamic>();
+  } =>#t1);
+  self::E|set#property<dynamic>( block {
+    final core::Set<dynamic> #t2 = new _co::_Set::•<dynamic>();
+  } =>#t2, 0);
+  self::E|get#method<dynamic>( block {
+    final core::Set<dynamic> #t3 = new _co::_Set::•<dynamic>();
+  } =>#t3);
+  self::E|method<dynamic>( block {
+    final core::Set<dynamic> #t4 = new _co::_Set::•<dynamic>();
+  } =>#t4);
+  let final core::Set<dynamic> #t5 = block {
+    final core::Set<dynamic> #t6 = new _co::_Set::•<dynamic>();
+  } =>#t6 in self::E|set#property<dynamic>(#t5, self::E|get#property<dynamic>(#t5).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t7 = block {
+    final core::Set<dynamic> #t8 = new _co::_Set::•<dynamic>();
+  } =>#t8 in self::E|get#property<dynamic>(#t7) == null ?{core::int?} self::E|set#property<dynamic>(#t7, 0) : null;
+  self::E|[]<dynamic>( block {
+    final core::Set<dynamic> #t9 = new _co::_Set::•<dynamic>();
+  } =>#t9, 0);
+  self::E|[]=<dynamic>( block {
+    final core::Set<dynamic> #t10 = new _co::_Set::•<dynamic>();
+  } =>#t10, 0, 0);
+  let final core::Set<dynamic> #t11 = block {
+    final core::Set<dynamic> #t12 = new _co::_Set::•<dynamic>();
+  } =>#t12 in let final core::int #t13 = 0 in self::E|[]=<dynamic>(#t11, #t13, self::E|[]<dynamic>(#t11, #t13).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t14 = block {
+    final core::Set<dynamic> #t15 = new _co::_Set::•<dynamic>();
+  } =>#t15 in let final core::int #t16 = 0 in self::E|[]<dynamic>(#t14, #t16) == null ?{core::int?} self::E|[]=<dynamic>(#t14, #t16, 0) : null;
+  let final core::Set<dynamic> #t17 = block {
+    final core::Set<dynamic> #t18 = new _co::_Set::•<dynamic>();
+  } =>#t18 in #t17 == null ?{core::int?} null : self::E|get#property<dynamic>(#t17);
+  let final core::Set<dynamic> #t19 = block {
+    final core::Set<dynamic> #t20 = new _co::_Set::•<dynamic>();
+  } =>#t20 in #t19 == null ?{core::int?} null : self::E|set#property<dynamic>(#t19, 0);
+  let final core::Set<dynamic> #t21 = block {
+    final core::Set<dynamic> #t22 = new _co::_Set::•<dynamic>();
+  } =>#t22 in #t21 == null ?{() →? core::int} null : self::E|get#method<dynamic>(#t21);
+  let final core::Set<dynamic> #t23 = block {
+    final core::Set<dynamic> #t24 = new _co::_Set::•<dynamic>();
+  } =>#t24 in #t23 == null ?{core::int?} null : self::E|method<dynamic>(#t23);
+  let final core::Set<dynamic> #t25 = block {
+    final core::Set<dynamic> #t26 = new _co::_Set::•<dynamic>();
+  } =>#t26 in #t25 == null ?{core::int?} null : self::E|set#property<dynamic>(#t25, self::E|get#property<dynamic>(#t25).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t27 = block {
+    final core::Set<dynamic> #t28 = new _co::_Set::•<dynamic>();
+  } =>#t28 in #t27 == null ?{core::int?} null : self::E|get#property<dynamic>(#t27) == null ?{core::int?} self::E|set#property<dynamic>(#t27, 0) : null;
+  let final core::Set<dynamic> #t29 = block {
+    final core::Set<dynamic> #t30 = new _co::_Set::•<dynamic>();
+  } =>#t30 in #t29 == null ?{core::int?} null : self::E|[]<dynamic>(#t29, 0);
+  let final core::Set<dynamic> #t31 = block {
+    final core::Set<dynamic> #t32 = new _co::_Set::•<dynamic>();
+  } =>#t32 in #t31 == null ?{core::int?} null : self::E|[]=<dynamic>(#t31, 0, 0);
+  let final core::Set<dynamic> #t33 = block {
+    final core::Set<dynamic> #t34 = new _co::_Set::•<dynamic>();
+  } =>#t34 in #t33 == null ?{core::int?} null : let final core::int #t35 = 0 in self::E|[]=<dynamic>(#t33, #t35, self::E|[]<dynamic>(#t33, #t35).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<dynamic> #t36 = block {
+    final core::Set<dynamic> #t37 = new _co::_Set::•<dynamic>();
+  } =>#t37 in #t36 == null ?{core::int?} null : let final core::int #t38 = 0 in self::E|[]<dynamic>(#t36, #t38) == null ?{core::int?} self::E|[]=<dynamic>(#t36, #t38, 0) : null;
+  self::E|get#property<core::int>( block {
+    final core::Set<core::int> #t39 = new _co::_Set::•<core::int>();
+  } =>#t39);
+  self::E|set#property<core::int>( block {
+    final core::Set<core::int> #t40 = new _co::_Set::•<core::int>();
+  } =>#t40, 0);
+  self::E|get#method<core::int>( block {
+    final core::Set<core::int> #t41 = new _co::_Set::•<core::int>();
+  } =>#t41);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t42 = new _co::_Set::•<core::int>();
+  } =>#t42);
+  let final core::Set<core::int> #t43 = block {
+    final core::Set<core::int> #t44 = new _co::_Set::•<core::int>();
+  } =>#t44 in self::E|set#property<core::int>(#t43, self::E|get#property<core::int>(#t43).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t45 = block {
+    final core::Set<core::int> #t46 = new _co::_Set::•<core::int>();
+  } =>#t46 in self::E|get#property<core::int>(#t45) == null ?{core::int?} self::E|set#property<core::int>(#t45, 0) : null;
+  self::E|[]<core::int>( block {
+    final core::Set<core::int> #t47 = new _co::_Set::•<core::int>();
+  } =>#t47, 0);
+  self::E|[]=<core::int>( block {
+    final core::Set<core::int> #t48 = new _co::_Set::•<core::int>();
+  } =>#t48, 0, 0);
+  let final core::Set<core::int> #t49 = block {
+    final core::Set<core::int> #t50 = new _co::_Set::•<core::int>();
+  } =>#t50 in let final core::int #t51 = 0 in self::E|[]=<core::int>(#t49, #t51, self::E|[]<core::int>(#t49, #t51).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t52 = block {
+    final core::Set<core::int> #t53 = new _co::_Set::•<core::int>();
+  } =>#t53 in let final core::int #t54 = 0 in self::E|[]<core::int>(#t52, #t54) == null ?{core::int?} self::E|[]=<core::int>(#t52, #t54, 0) : null;
+  let final core::Set<core::int> #t55 = block {
+    final core::Set<core::int> #t56 = new _co::_Set::•<core::int>();
+  } =>#t56 in #t55 == null ?{core::int?} null : self::E|get#property<core::int>(#t55);
+  let final core::Set<core::int> #t57 = block {
+    final core::Set<core::int> #t58 = new _co::_Set::•<core::int>();
+  } =>#t58 in #t57 == null ?{core::int?} null : self::E|set#property<core::int>(#t57, 0);
+  let final core::Set<core::int> #t59 = block {
+    final core::Set<core::int> #t60 = new _co::_Set::•<core::int>();
+  } =>#t60 in #t59 == null ?{() →? core::int} null : self::E|get#method<core::int>(#t59);
+  let final core::Set<core::int> #t61 = block {
+    final core::Set<core::int> #t62 = new _co::_Set::•<core::int>();
+  } =>#t62 in #t61 == null ?{core::int?} null : self::E|method<core::int>(#t61);
+  let final core::Set<core::int> #t63 = block {
+    final core::Set<core::int> #t64 = new _co::_Set::•<core::int>();
+  } =>#t64 in #t63 == null ?{core::int?} null : self::E|set#property<core::int>(#t63, self::E|get#property<core::int>(#t63).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t65 = block {
+    final core::Set<core::int> #t66 = new _co::_Set::•<core::int>();
+  } =>#t66 in #t65 == null ?{core::int?} null : self::E|get#property<core::int>(#t65) == null ?{core::int?} self::E|set#property<core::int>(#t65, 0) : null;
+  let final core::Set<core::int> #t67 = block {
+    final core::Set<core::int> #t68 = new _co::_Set::•<core::int>();
+  } =>#t68 in #t67 == null ?{core::int?} null : self::E|[]<core::int>(#t67, 0);
+  let final core::Set<core::int> #t69 = block {
+    final core::Set<core::int> #t70 = new _co::_Set::•<core::int>();
+  } =>#t70 in #t69 == null ?{core::int?} null : self::E|[]=<core::int>(#t69, 0, 0);
+  let final core::Set<core::int> #t71 = block {
+    final core::Set<core::int> #t72 = new _co::_Set::•<core::int>();
+  } =>#t72 in #t71 == null ?{core::int?} null : let final core::int #t73 = 0 in self::E|[]=<core::int>(#t71, #t73, self::E|[]<core::int>(#t71, #t73).{core::num::+}(0){(core::num) → core::int});
+  let final core::Set<core::int> #t74 = block {
+    final core::Set<core::int> #t75 = new _co::_Set::•<core::int>();
+  } =>#t75 in #t74 == null ?{core::int?} null : let final core::int #t76 = 0 in self::E|[]<core::int>(#t74, #t76) == null ?{core::int?} self::E|[]=<core::int>(#t74, #t76, 0) : null;
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:22:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:22:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:23:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:23:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:33:10 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:33:10 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:34:10 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:34:10 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:44:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:44:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:45:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:45:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:55:15 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:55:15 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:56:15 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_context.dart:56:15 -> IntConstant(0)
+Extra constant evaluation: evaluated: 359, effectively constant: 16
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_context.dart.textual_outline.expect
new file mode 100644
index 0000000..4711591
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+extension E<T> on Set<T> {
+  int get property => 0;
+  set property(int value) {}
+  int method() => 0;
+  int operator [](int index) => 0;
+  void operator []=(int index, int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_context.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_context.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..60901cf
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_context.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+extension E<T> on Set<T> {
+  int get property => 0;
+  int method() => 0;
+  int operator [](int index) => 0;
+  set property(int value) {}
+  void operator []=(int index, int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart b/pkg/front_end/testcases/extensions/explicit_extension_access.dart
index dc5a1e5..edb116a 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart
@@ -12,6 +12,7 @@
   void set field(int value) {
     field1 = value;
   }
+
   int method() => field1;
   num genericMethod<T extends num>(T t) => field1 + t;
 }
@@ -21,10 +22,28 @@
   void set field(int value) {
     field2 = value;
   }
+
   int method() => field2;
   num genericMethod<T extends num>(T t) => field2 + t;
 }
 
+extension on int {
+  method1() {
+    method2<int>([0], [1], (_) => 2, () => 3);
+  }
+
+  method2<T>(
+    List<T> a,
+    List<int> b,
+    void Function(T) c,
+    void Function()? d,
+  ) {}
+}
+
+test(Class c) {
+  Extension1(c).method(0); // Error
+}
+
 main() {
   Class c = new Class();
   expect(42, Extension1(c).field);
@@ -55,4 +74,4 @@
   if (expected != actual) {
     throw 'Mismatch: expected=$expected, actual=$actual';
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.expect
index b202366..e12be21 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_extension_access.dart:44:23: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Extension1(c).method(0); // Error
+//                       ^
+// pkg/front_end/testcases/extensions/explicit_extension_access.dart:16:7: Context: Found this candidate, but the arguments don't match.
+//   int method() => field1;
+//       ^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -25,6 +36,12 @@
   method genericMethod = self::Extension2|genericMethod;
   method tearoff genericMethod = self::Extension2|get#genericMethod;
 }
+extension /* unnamed */ _extension#2 on core::int {
+  method method1 = self::_extension#2|method1;
+  method tearoff method1 = self::_extension#2|get#method1;
+  method method2 = self::_extension#2|method2;
+  method tearoff method2 = self::_extension#2|get#method2;
+}
 static extension-member method Extension1|get#field(lowered final self::Class #this) → core::int
   return #this.{self::Class::field1}{core::int};
 static extension-member method Extension1|set#field(lowered final self::Class #this, core::int value) → void {
@@ -51,6 +68,20 @@
   return #this.{self::Class::field2}{core::int}.{core::num::+}(t){(core::num) → core::num};
 static extension-member method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
   return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static extension-member method _extension#2|method1(lowered final core::int #this) → dynamic {
+  self::_extension#2|method2<core::int>(#this, <core::int>[0], <core::int>[1], (wildcard core::int _#wc0#formal) → void => 2, () → void => 3);
+}
+static extension-member method _extension#2|get#method1(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::_extension#2|method1(#this);
+static extension-member method _extension#2|method2<T extends core::Object? = dynamic>(lowered final core::int #this, core::List<self::_extension#2|method2::T%> a, core::List<core::int> b, (self::_extension#2|method2::T%) → void c, () →? void d) → dynamic {}
+static extension-member method _extension#2|get#method2(lowered final core::int #this) → <T extends core::Object? = dynamic>(core::List<T%>, core::List<core::int>, (T%) → void, () →? void) → dynamic
+  return <T extends core::Object? = dynamic>(core::List<T%> a, core::List<core::int> b, (T%) → void c, () →? void d) → dynamic => self::_extension#2|method2<T%>(#this, a, b, c, d);
+static method test(self::Class c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_extension_access.dart:44:23: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  Extension1(c).method(0); // Error
+                      ^";
+}
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.modular.expect
index b202366..e12be21 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.modular.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_extension_access.dart:44:23: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Extension1(c).method(0); // Error
+//                       ^
+// pkg/front_end/testcases/extensions/explicit_extension_access.dart:16:7: Context: Found this candidate, but the arguments don't match.
+//   int method() => field1;
+//       ^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -25,6 +36,12 @@
   method genericMethod = self::Extension2|genericMethod;
   method tearoff genericMethod = self::Extension2|get#genericMethod;
 }
+extension /* unnamed */ _extension#2 on core::int {
+  method method1 = self::_extension#2|method1;
+  method tearoff method1 = self::_extension#2|get#method1;
+  method method2 = self::_extension#2|method2;
+  method tearoff method2 = self::_extension#2|get#method2;
+}
 static extension-member method Extension1|get#field(lowered final self::Class #this) → core::int
   return #this.{self::Class::field1}{core::int};
 static extension-member method Extension1|set#field(lowered final self::Class #this, core::int value) → void {
@@ -51,6 +68,20 @@
   return #this.{self::Class::field2}{core::int}.{core::num::+}(t){(core::num) → core::num};
 static extension-member method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
   return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static extension-member method _extension#2|method1(lowered final core::int #this) → dynamic {
+  self::_extension#2|method2<core::int>(#this, <core::int>[0], <core::int>[1], (wildcard core::int _#wc0#formal) → void => 2, () → void => 3);
+}
+static extension-member method _extension#2|get#method1(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::_extension#2|method1(#this);
+static extension-member method _extension#2|method2<T extends core::Object? = dynamic>(lowered final core::int #this, core::List<self::_extension#2|method2::T%> a, core::List<core::int> b, (self::_extension#2|method2::T%) → void c, () →? void d) → dynamic {}
+static extension-member method _extension#2|get#method2(lowered final core::int #this) → <T extends core::Object? = dynamic>(core::List<T%>, core::List<core::int>, (T%) → void, () →? void) → dynamic
+  return <T extends core::Object? = dynamic>(core::List<T%> a, core::List<core::int> b, (T%) → void c, () →? void d) → dynamic => self::_extension#2|method2<T%>(#this, a, b, c, d);
+static method test(self::Class c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_extension_access.dart:44:23: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  Extension1(c).method(0); // Error
+                      ^";
+}
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.outline.expect
index 742ae9d..6452d07 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.outline.expect
@@ -24,6 +24,12 @@
   method genericMethod = self::Extension2|genericMethod;
   method tearoff genericMethod = self::Extension2|get#genericMethod;
 }
+extension /* unnamed */ _extension#2 on core::int {
+  method method1 = self::_extension#2|method1;
+  method tearoff method1 = self::_extension#2|get#method1;
+  method method2 = self::_extension#2|method2;
+  method tearoff method2 = self::_extension#2|get#method2;
+}
 static extension-member method Extension1|get#field(lowered final self::Class #this) → core::int
   ;
 static extension-member method Extension1|set#field(lowered final self::Class #this, core::int value) → void
@@ -48,6 +54,16 @@
   ;
 static extension-member method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
   return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static extension-member method _extension#2|method1(lowered final core::int #this) → dynamic
+  ;
+static extension-member method _extension#2|get#method1(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::_extension#2|method1(#this);
+static extension-member method _extension#2|method2<T extends core::Object? = dynamic>(lowered final core::int #this, core::List<self::_extension#2|method2::T%> a, core::List<core::int> b, (self::_extension#2|method2::T%) → void c, () →? void d) → dynamic
+  ;
+static extension-member method _extension#2|get#method2(lowered final core::int #this) → <T extends core::Object? = dynamic>(core::List<T%>, core::List<core::int>, (T%) → void, () →? void) → dynamic
+  return <T extends core::Object? = dynamic>(core::List<T%> a, core::List<core::int> b, (T%) → void c, () →? void d) → dynamic => self::_extension#2|method2<T%>(#this, a, b, c, d);
+static method test(self::Class c) → dynamic
+  ;
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
index 1381abc..62d34c4 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
@@ -1,4 +1,15 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_extension_access.dart:44:23: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Extension1(c).method(0); // Error
+//                       ^
+// pkg/front_end/testcases/extensions/explicit_extension_access.dart:16:7: Context: Found this candidate, but the arguments don't match.
+//   int method() => field1;
+//       ^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -25,6 +36,12 @@
   method genericMethod = self::Extension2|genericMethod;
   method tearoff genericMethod = self::Extension2|get#genericMethod;
 }
+extension /* unnamed */ _extension#2 on core::int {
+  method method1 = self::_extension#2|method1;
+  method tearoff method1 = self::_extension#2|get#method1;
+  method method2 = self::_extension#2|method2;
+  method tearoff method2 = self::_extension#2|get#method2;
+}
 static extension-member method Extension1|get#field(lowered final self::Class #this) → core::int
   return #this.{self::Class::field1}{core::int};
 static extension-member method Extension1|set#field(lowered final self::Class #this, core::int value) → void {
@@ -51,6 +68,20 @@
   return #this.{self::Class::field2}{core::int}.{core::num::+}(t){(core::num) → core::num};
 static extension-member method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
   return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static extension-member method _extension#2|method1(lowered final core::int #this) → dynamic {
+  self::_extension#2|method2<core::int>(#this, core::_GrowableList::_literal1<core::int>(0), core::_GrowableList::_literal1<core::int>(1), (wildcard core::int _#wc0#formal) → void => 2, () → void => 3);
+}
+static extension-member method _extension#2|get#method1(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::_extension#2|method1(#this);
+static extension-member method _extension#2|method2<T extends core::Object? = dynamic>(lowered final core::int #this, core::List<self::_extension#2|method2::T%> a, core::List<core::int> b, (self::_extension#2|method2::T%) → void c, () →? void d) → dynamic {}
+static extension-member method _extension#2|get#method2(lowered final core::int #this) → <T extends core::Object? = dynamic>(core::List<T%>, core::List<core::int>, (T%) → void, () →? void) → dynamic
+  return <T extends core::Object? = dynamic>(core::List<T%> a, core::List<core::int> b, (T%) → void c, () →? void d) → dynamic => self::_extension#2|method2<T%>(#this, a, b, c, d);
+static method test(self::Class c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_extension_access.dart:44:23: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  Extension1(c).method(0); // Error
+                      ^";
+}
 static method main() → dynamic {
   self::Class c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
@@ -84,8 +115,8 @@
 
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:48:36 -> IntConstant(23)
-Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:48:36 -> IntConstant(23)
-Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
-Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
-Extra constant evaluation: evaluated: 119, effectively constant: 4
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:67:36 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:67:36 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:68:36 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:68:36 -> IntConstant(67)
+Extra constant evaluation: evaluated: 135, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect
index 2b3a169..4a33616 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect
@@ -17,6 +17,18 @@
   num genericMethod<T extends num>(T t) => field2 + t;
 }
 
+extension on int {
+  method1() {}
+  method2<T>(
+    List<T> a,
+    List<int> b,
+    void Function(T) c,
+    void Function()? d,
+  ) {}
+}
+
+test(Class c) {}
+
 main() {}
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect
index a014681..8bb7b0b 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect
@@ -19,4 +19,16 @@
   void set field(int value) {}
 }
 
+extension on int {
+  method1() {}
+  method2<T>(
+    List<T> a,
+    List<int> b,
+    void Function(T) c,
+    void Function()? d,
+  ) {}
+}
+
 main() {}
+
+test(Class c) {}
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart
new file mode 100644
index 0000000..d6e35cc
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2025, 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 E on int {
+  int Function(int) get f =>
+      (x) => x;
+
+  m() {
+    expect(42, f(42));
+  }
+}
+
+test(int i1, int? i2, int? i3) {
+  expect(87, E(i1).f(87));
+  expect(123, E(i2)?.f(123));
+  expect(null, E(i3)?.f(321));
+}
+
+main() {
+  0.m();
+  test(0, 0, null);
+}
+
+expect(expected, actual) {
+  if (expected != actual) {
+    throw 'Expected $expected, actual $actual';
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.expect b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.expect
new file mode 100644
index 0000000..bd55557
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  get f = self::E|get#f;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|get#f(lowered final core::int #this) → (core::int) → core::int
+  return (core::int x) → core::int => x;
+static extension-member method E|m(lowered final core::int #this) → dynamic {
+  self::expect(42, self::E|get#f(#this)(42){(core::int) → core::int});
+}
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2, core::int? i3) → dynamic {
+  self::expect(87, self::E|get#f(i1)(87){(core::int) → core::int});
+  self::expect(123, let final core::int? #t1 = i2 in #t1 == null ?{core::int?} null : self::E|get#f(#t1{core::int})(123){(core::int) → core::int});
+  self::expect(null, let final core::int? #t2 = i3 in #t2 == null ?{core::int?} null : self::E|get#f(#t2{core::int})(321){(core::int) → core::int});
+}
+static method main() → dynamic {
+  self::E|m(0);
+  self::test(0, 0, null);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.modular.expect
new file mode 100644
index 0000000..bd55557
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.modular.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  get f = self::E|get#f;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|get#f(lowered final core::int #this) → (core::int) → core::int
+  return (core::int x) → core::int => x;
+static extension-member method E|m(lowered final core::int #this) → dynamic {
+  self::expect(42, self::E|get#f(#this)(42){(core::int) → core::int});
+}
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2, core::int? i3) → dynamic {
+  self::expect(87, self::E|get#f(i1)(87){(core::int) → core::int});
+  self::expect(123, let final core::int? #t1 = i2 in #t1 == null ?{core::int?} null : self::E|get#f(#t1{core::int})(123){(core::int) → core::int});
+  self::expect(null, let final core::int? #t2 = i3 in #t2 == null ?{core::int?} null : self::E|get#f(#t2{core::int})(321){(core::int) → core::int});
+}
+static method main() → dynamic {
+  self::E|m(0);
+  self::test(0, 0, null);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.outline.expect b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.outline.expect
new file mode 100644
index 0000000..6428e65
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.outline.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  get f = self::E|get#f;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|get#f(lowered final core::int #this) → (core::int) → core::int
+  ;
+static extension-member method E|m(lowered final core::int #this) → dynamic
+  ;
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2, core::int? i3) → dynamic
+  ;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.transformed.expect
new file mode 100644
index 0000000..bd55557
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  get f = self::E|get#f;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|get#f(lowered final core::int #this) → (core::int) → core::int
+  return (core::int x) → core::int => x;
+static extension-member method E|m(lowered final core::int #this) → dynamic {
+  self::expect(42, self::E|get#f(#this)(42){(core::int) → core::int});
+}
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2, core::int? i3) → dynamic {
+  self::expect(87, self::E|get#f(i1)(87){(core::int) → core::int});
+  self::expect(123, let final core::int? #t1 = i2 in #t1 == null ?{core::int?} null : self::E|get#f(#t1{core::int})(123){(core::int) → core::int});
+  self::expect(null, let final core::int? #t2 = i3 in #t2 == null ?{core::int?} null : self::E|get#f(#t2{core::int})(321){(core::int) → core::int});
+}
+static method main() → dynamic {
+  self::E|m(0);
+  self::test(0, 0, null);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.textual_outline.expect
new file mode 100644
index 0000000..6ca2eab
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+extension E on int {
+  int Function(int) get f => (x) => x;
+  m() {}
+}
+
+test(int i1, int? i2, int? i3) {}
+
+main() {}
+
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..266ec2e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_getter_invocation.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+expect(expected, actual) {}
+
+extension E on int {
+  int Function(int) get f => (x) => x;
+  m() {}
+}
+
+main() {}
+
+test(int i1, int? i2, int? i3) {}
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart
new file mode 100644
index 0000000..cb433a6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2025, 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 E on int {
+  void set g(_) {}
+
+  m() {
+    g(0); // Error
+  }
+}
+
+test(int i1, int? i2) {
+  E(i1).g(0); // Error
+  E(i2)?.g(0); // Error
+}
+
+method() {
+  0.m();
+  test(0, 0);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.expect b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.expect
new file mode 100644
index 0000000..de2a6f3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:9:5: Error: Getter not found: 'g'.
+//     g(0); // Error
+//     ^
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:14:9: Error: Getter not found: 'g'.
+//   E(i1).g(0); // Error
+//         ^
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:15:10: Error: Getter not found: 'g'.
+//   E(i2)?.g(0); // Error
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  set g = self::E|set#g;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|set#g(lowered final core::int #this, wildcard dynamic _#wc0#formal) → void {}
+static extension-member method E|m(lowered final core::int #this) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:9:5: Error: Getter not found: 'g'.
+    g(0); // Error
+    ^";
+}
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:14:9: Error: Getter not found: 'g'.
+  E(i1).g(0); // Error
+        ^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:15:10: Error: Getter not found: 'g'.
+  E(i2)?.g(0); // Error
+         ^";
+}
+static method method() → dynamic {
+  self::E|m(0);
+  self::test(0, 0);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.modular.expect
new file mode 100644
index 0000000..de2a6f3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.modular.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:9:5: Error: Getter not found: 'g'.
+//     g(0); // Error
+//     ^
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:14:9: Error: Getter not found: 'g'.
+//   E(i1).g(0); // Error
+//         ^
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:15:10: Error: Getter not found: 'g'.
+//   E(i2)?.g(0); // Error
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  set g = self::E|set#g;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|set#g(lowered final core::int #this, wildcard dynamic _#wc0#formal) → void {}
+static extension-member method E|m(lowered final core::int #this) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:9:5: Error: Getter not found: 'g'.
+    g(0); // Error
+    ^";
+}
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:14:9: Error: Getter not found: 'g'.
+  E(i1).g(0); // Error
+        ^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:15:10: Error: Getter not found: 'g'.
+  E(i2)?.g(0); // Error
+         ^";
+}
+static method method() → dynamic {
+  self::E|m(0);
+  self::test(0, 0);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.outline.expect b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.outline.expect
new file mode 100644
index 0000000..196366d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  set g = self::E|set#g;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|set#g(lowered final core::int #this, wildcard dynamic _#wc0#formal) → void
+  ;
+static extension-member method E|m(lowered final core::int #this) → dynamic
+  ;
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2) → dynamic
+  ;
+static method method() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.transformed.expect
new file mode 100644
index 0000000..de2a6f3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.strong.transformed.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:9:5: Error: Getter not found: 'g'.
+//     g(0); // Error
+//     ^
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:14:9: Error: Getter not found: 'g'.
+//   E(i1).g(0); // Error
+//         ^
+//
+// pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:15:10: Error: Getter not found: 'g'.
+//   E(i2)?.g(0); // Error
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  set g = self::E|set#g;
+  method m = self::E|m;
+  method tearoff m = self::E|get#m;
+}
+static extension-member method E|set#g(lowered final core::int #this, wildcard dynamic _#wc0#formal) → void {}
+static extension-member method E|m(lowered final core::int #this) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:9:5: Error: Getter not found: 'g'.
+    g(0); // Error
+    ^";
+}
+static extension-member method E|get#m(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::E|m(#this);
+static method test(core::int i1, core::int? i2) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:14:9: Error: Getter not found: 'g'.
+  E(i1).g(0); // Error
+        ^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_setter_invocation.dart:15:10: Error: Getter not found: 'g'.
+  E(i2)?.g(0); // Error
+         ^";
+}
+static method method() → dynamic {
+  self::E|m(0);
+  self::test(0, 0);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.textual_outline.expect
new file mode 100644
index 0000000..4e964cd
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+extension E on int {
+  void set g(_) {}
+  m() {}
+}
+
+test(int i1, int? i2) {}
+
+method() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..afdbfbf
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_setter_invocation.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+extension E on int {
+  m() {}
+  void set g(_) {}
+}
+
+method() {}
+
+test(int i1, int? i2) {}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect
index 19ee5ae..bdb61a6 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect
@@ -34,41 +34,41 @@
 //   Extension(c1).foo();
 //                 ^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:23: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method();
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:23: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   Extension(c1).method(1, 2);
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:23: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method(a: 1);
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
 //   Extension(c1).method(1, a: 2);
 //                           ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
 //   Extension(c1).method<int>(null);
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
 //   GenericExtension().method();
@@ -106,17 +106,17 @@
 //   GenericExtension<int, String>(c2).method();
 //   ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: A value of type 'String' can't be assigned to a variable of type 'Class'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   Extension(s).method(null);
 //             ^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<dynamic>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   GenericExtension(s).method();
 //                    ^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<int>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   GenericExtension<int>(s).method();
 //                         ^
@@ -166,7 +166,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:27:3: Error: Explicit extension application of extension 'Extension' takes '0' type argument(s).
   Extension<int>(c1).method(null);
   ^^^^^^^^^"{dynamic}.method(null);
-  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: A value of type 'String' can't be assigned to a variable of type 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   Extension(s).method(null);
             ^" in s as{TypeError} self::Class, null);
@@ -179,16 +179,16 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
   Extension(c1).foo();
                 ^^^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:23: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method();
-                ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+                      ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:23: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   Extension(c1).method(1, 2);
-                ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+                      ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:23: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method(a: 1);
-                ^";
+                      ^";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
   Extension(c1).method(1, a: 2);
                           ^";
@@ -223,11 +223,11 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:50:3: Error: Explicit extension application of extension 'GenericExtension' takes '1' type argument(s).
   GenericExtension<int, String>(c2).method();
   ^^^^^^^^^^^^^^^^"{dynamic}.method();
-  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<dynamic>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension(s).method();
                    ^" in s as{TypeError} self::GenericClass<dynamic>);
-  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<int>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension<int>(s).method();
                         ^" in s as{TypeError} self::GenericClass<core::int>);
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.modular.expect
index 19ee5ae..bdb61a6 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.modular.expect
@@ -34,41 +34,41 @@
 //   Extension(c1).foo();
 //                 ^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:23: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method();
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:23: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   Extension(c1).method(1, 2);
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:23: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method(a: 1);
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
 //   Extension(c1).method(1, a: 2);
 //                           ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
 //   Extension(c1).method<int>(null);
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
 //   GenericExtension().method();
@@ -106,17 +106,17 @@
 //   GenericExtension<int, String>(c2).method();
 //   ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: A value of type 'String' can't be assigned to a variable of type 'Class'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   Extension(s).method(null);
 //             ^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<dynamic>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   GenericExtension(s).method();
 //                    ^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<int>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   GenericExtension<int>(s).method();
 //                         ^
@@ -166,7 +166,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:27:3: Error: Explicit extension application of extension 'Extension' takes '0' type argument(s).
   Extension<int>(c1).method(null);
   ^^^^^^^^^"{dynamic}.method(null);
-  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: A value of type 'String' can't be assigned to a variable of type 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   Extension(s).method(null);
             ^" in s as{TypeError} self::Class, null);
@@ -179,16 +179,16 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
   Extension(c1).foo();
                 ^^^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:23: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method();
-                ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+                      ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:23: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   Extension(c1).method(1, 2);
-                ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+                      ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:23: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method(a: 1);
-                ^";
+                      ^";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
   Extension(c1).method(1, a: 2);
                           ^";
@@ -223,11 +223,11 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:50:3: Error: Explicit extension application of extension 'GenericExtension' takes '1' type argument(s).
   GenericExtension<int, String>(c2).method();
   ^^^^^^^^^^^^^^^^"{dynamic}.method();
-  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<dynamic>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension(s).method();
                    ^" in s as{TypeError} self::GenericClass<dynamic>);
-  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<int>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension<int>(s).method();
                         ^" in s as{TypeError} self::GenericClass<core::int>);
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect
index 19ee5ae..bdb61a6 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect
@@ -34,41 +34,41 @@
 //   Extension(c1).foo();
 //                 ^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:23: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method();
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:23: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   Extension(c1).method(1, 2);
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:23: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method(a: 1);
-//                 ^
+//                       ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
 //   Extension(c1).method(1, a: 2);
 //                           ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
 //   Extension(c1).method<int>(null);
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
-//   ^^^^^^^^^^^^^...
+//   ^^^^^^
 //
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
 //   GenericExtension().method();
@@ -106,17 +106,17 @@
 //   GenericExtension<int, String>(c2).method();
 //   ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: A value of type 'String' can't be assigned to a variable of type 'Class'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   Extension(s).method(null);
 //             ^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<dynamic>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   GenericExtension(s).method();
 //                    ^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<int>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
 //   GenericExtension<int>(s).method();
 //                         ^
@@ -166,7 +166,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:27:3: Error: Explicit extension application of extension 'Extension' takes '0' type argument(s).
   Extension<int>(c1).method(null);
   ^^^^^^^^^"{dynamic}.method(null);
-  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: A value of type 'String' can't be assigned to a variable of type 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   Extension(s).method(null);
             ^" in s as{TypeError} self::Class, null);
@@ -179,16 +179,16 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
   Extension(c1).foo();
                 ^^^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:23: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method();
-                ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+                      ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:23: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   Extension(c1).method(1, 2);
-                ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+                      ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:23: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method(a: 1);
-                ^";
+                      ^";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
   Extension(c1).method(1, a: 2);
                           ^";
@@ -223,11 +223,11 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:50:3: Error: Explicit extension application of extension 'GenericExtension' takes '1' type argument(s).
   GenericExtension<int, String>(c2).method();
   ^^^^^^^^^^^^^^^^"{dynamic}.method();
-  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<dynamic>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension(s).method();
                    ^" in s as{TypeError} self::GenericClass<dynamic>);
-  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: A value of type 'String' can't be assigned to a variable of type 'GenericClass<int>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension<int>(s).method();
                         ^" in s as{TypeError} self::GenericClass<core::int>);
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
index cc7443d..85490c0 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
@@ -11,7 +11,7 @@
 }
 static method main() → void {
   asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
-  let final asy::StreamController<core::String> #t1 = controller in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, (dynamic s) → Null {
+  let final asy::StreamController<core::String> #t1 = controller in let final asy::Stream<core::String> #t2 = #t1.{asy::StreamController::stream}{asy::Stream<core::String>} in self::Extension|call<core::String>(#t2, (dynamic s) → Null {
     core::print(s);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.modular.expect
index cc7443d..85490c0 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.modular.expect
@@ -11,7 +11,7 @@
 }
 static method main() → void {
   asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
-  let final asy::StreamController<core::String> #t1 = controller in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, (dynamic s) → Null {
+  let final asy::StreamController<core::String> #t1 = controller in let final asy::Stream<core::String> #t2 = #t1.{asy::StreamController::stream}{asy::Stream<core::String>} in self::Extension|call<core::String>(#t2, (dynamic s) → Null {
     core::print(s);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
index cc7443d..85490c0 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
 }
 static method main() → void {
   asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
-  let final asy::StreamController<core::String> #t1 = controller in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, (dynamic s) → Null {
+  let final asy::StreamController<core::String> #t1 = controller in let final asy::Stream<core::String> #t2 = #t1.{asy::StreamController::stream}{asy::Stream<core::String>} in self::Extension|call<core::String>(#t2, (dynamic s) → Null {
     core::print(s);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.strong.expect b/pkg/front_end/testcases/extensions/issue43218.dart.strong.expect
index 4eb7a82..693f2b4 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.strong.expect
@@ -2,8 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the type 'int'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: Setter not found: 'id'.
 //   Ext(c).id++;
 //          ^^
 //
@@ -30,9 +29,8 @@
   return #this.{self::C::value}{core::int}.{core::num::+}(1){(core::num) → core::int};
 static method test() → dynamic {
   self::C c = new self::C::•();
-  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the type 'int'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+  invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: Setter not found: 'id'.
   Ext(c).id++;
-         ^^" in #t1.{<unresolved>}id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num) → core::int};
+         ^^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/issue43218.dart.strong.modular.expect
index 4eb7a82..693f2b4 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.strong.modular.expect
@@ -2,8 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the type 'int'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: Setter not found: 'id'.
 //   Ext(c).id++;
 //          ^^
 //
@@ -30,9 +29,8 @@
   return #this.{self::C::value}{core::int}.{core::num::+}(1){(core::num) → core::int};
 static method test() → dynamic {
   self::C c = new self::C::•();
-  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the type 'int'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+  invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: Setter not found: 'id'.
   Ext(c).id++;
-         ^^" in #t1.{<unresolved>}id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num) → core::int};
+         ^^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue43218.dart.strong.transformed.expect
index 4eb7a82..693f2b4 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.strong.transformed.expect
@@ -2,8 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the type 'int'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: Setter not found: 'id'.
 //   Ext(c).id++;
 //          ^^
 //
@@ -30,9 +29,8 @@
   return #this.{self::C::value}{core::int}.{core::num::+}(1){(core::num) → core::int};
 static method test() → dynamic {
   self::C c = new self::C::•();
-  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the type 'int'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+  invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: Setter not found: 'id'.
   Ext(c).id++;
-         ^^" in #t1.{<unresolved>}id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num) → core::int};
+         ^^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart b/pkg/front_end/testcases/extensions/set_from_context.dart
new file mode 100644
index 0000000..e443a05
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2025, 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.
+
+void f<T>(Set<T> s) {
+  print(s.runtimeType);
+}
+
+extension E<T> on Set<T> {
+  method() {
+    print(runtimeType);
+  }
+}
+
+Set<int> set = {};
+
+void main() {
+  f({});
+  f({1});
+  f({...set});
+  E({}).method();
+  E({1}).method();
+  E({...set}).method();
+}
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart.strong.expect b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.expect
new file mode 100644
index 0000000..3b0c313
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+}
+static field core::Set<core::int> set = block {
+  final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
+} =>#t1;
+static method f<T extends core::Object? = dynamic>(core::Set<self::f::T%> s) → void {
+  core::print(s.{core::Object::runtimeType}{core::Type});
+}
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → dynamic {
+  core::print(#this.{core::Object::runtimeType}{core::Type});
+}
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::E|method<self::E|get#method::T%>(#this);
+static method main() → void {
+  self::f<dynamic>( block {
+    final core::Set<dynamic> #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2);
+  self::f<core::int>( block {
+    final core::Set<core::int> #t3 = col::LinkedHashSet::•<core::int>();
+    #t3.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+  } =>#t3);
+  self::f<core::int>( block {
+    final core::Set<core::int> #t4 = col::LinkedHashSet::of<core::int>(self::set);
+  } =>#t4);
+  self::E|method<dynamic>( block {
+    final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>();
+  } =>#t5);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>();
+    #t6.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+  } =>#t6);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t7 = col::LinkedHashSet::of<core::int>(self::set);
+  } =>#t7);
+}
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.modular.expect
new file mode 100644
index 0000000..3b0c313
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.modular.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+}
+static field core::Set<core::int> set = block {
+  final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
+} =>#t1;
+static method f<T extends core::Object? = dynamic>(core::Set<self::f::T%> s) → void {
+  core::print(s.{core::Object::runtimeType}{core::Type});
+}
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → dynamic {
+  core::print(#this.{core::Object::runtimeType}{core::Type});
+}
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::E|method<self::E|get#method::T%>(#this);
+static method main() → void {
+  self::f<dynamic>( block {
+    final core::Set<dynamic> #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2);
+  self::f<core::int>( block {
+    final core::Set<core::int> #t3 = col::LinkedHashSet::•<core::int>();
+    #t3.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+  } =>#t3);
+  self::f<core::int>( block {
+    final core::Set<core::int> #t4 = col::LinkedHashSet::of<core::int>(self::set);
+  } =>#t4);
+  self::E|method<dynamic>( block {
+    final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>();
+  } =>#t5);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>();
+    #t6.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+  } =>#t6);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t7 = col::LinkedHashSet::of<core::int>(self::set);
+  } =>#t7);
+}
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart.strong.outline.expect b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.outline.expect
new file mode 100644
index 0000000..c4f97c3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+}
+static field core::Set<core::int> set;
+static method f<T extends core::Object? = dynamic>(core::Set<self::f::T%> s) → void
+  ;
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → dynamic
+  ;
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::E|method<self::E|get#method::T%>(#this);
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.transformed.expect
new file mode 100644
index 0000000..0916179
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_compact_hash" as _co;
+import "dart:collection" as col;
+
+extension E<T extends core::Object? = dynamic> on core::Set<T%> {
+  method method = self::E|method;
+  method tearoff method = self::E|get#method;
+}
+static field core::Set<core::int> set = block {
+  final core::Set<core::int> #t1 = new _co::_Set::•<core::int>();
+} =>#t1;
+static method f<T extends core::Object? = dynamic>(core::Set<self::f::T%> s) → void {
+  core::print(s.{core::Object::runtimeType}{core::Type});
+}
+static extension-member method E|method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|method::T%> #this) → dynamic {
+  core::print(#this.{core::Object::runtimeType}{core::Type});
+}
+static extension-member method E|get#method<T extends core::Object? = dynamic>(lowered final core::Set<self::E|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::E|method<self::E|get#method::T%>(#this);
+static method main() → void {
+  self::f<dynamic>( block {
+    final core::Set<dynamic> #t2 = new _co::_Set::•<dynamic>();
+  } =>#t2);
+  self::f<core::int>( block {
+    final core::Set<core::int> #t3 = new _co::_Set::•<core::int>();
+    #t3.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+  } =>#t3);
+  self::f<core::int>( block {
+    final core::Set<core::int> #t4 = col::LinkedHashSet::of<core::int>(self::set);
+  } =>#t4);
+  self::E|method<dynamic>( block {
+    final core::Set<dynamic> #t5 = new _co::_Set::•<dynamic>();
+  } =>#t5);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t6 = new _co::_Set::•<core::int>();
+    #t6.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+  } =>#t6);
+  self::E|method<core::int>( block {
+    final core::Set<core::int> #t7 = col::LinkedHashSet::of<core::int>(self::set);
+  } =>#t7);
+}
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/set_from_context.dart.textual_outline.expect
new file mode 100644
index 0000000..9ba5b32
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+void f<T>(Set<T> s) {}
+
+extension E<T> on Set<T> {
+  method() {}
+}
+
+Set<int> set = {};
+
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/set_from_context.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/set_from_context.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..83fdc1f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/set_from_context.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+Set<int> set = {};
+
+extension E<T> on Set<T> {
+  method() {}
+}
+
+void f<T>(Set<T> s) {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index 743772b..8a0e2e4 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -97,7 +97,7 @@
 }
 
 Extra constant evaluation status:
-Evaluated: VariableGetImpl @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int)
+Evaluated: VariableGet @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int)
 Evaluated: VariableGet @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int)
 Extra constant evaluation: evaluated: 132, effectively constant: 2
 
diff --git a/pkg/front_end/testcases/general/issue45204.dart.strong.expect b/pkg/front_end/testcases/general/issue45204.dart.strong.expect
index f0cf6cd..6d27361 100644
--- a/pkg/front_end/testcases/general/issue45204.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue45204.dart.strong.expect
@@ -2,78 +2,78 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:29:12: Error: Too few positional arguments: 1 required, 0 given.
 //   S(3).test();
-//        ^
+//            ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:30:12: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S(4).test(5, 6);
-//        ^
+//            ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
 // pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
 //   S(5).test<int>(6);
 //        ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:33:14: Error: Too few positional arguments: 1 required, 0 given.
 //   S2(3).test2();
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:34:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S2(4).test2(5, 6);
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 0 type arguments.
 //   S2(5).test2<int>(6);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:37:14: Error: Too few positional arguments: 1 required, 0 given.
 //   S2(3).test3();
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:38:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S2(4).test3(5, 6);
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 1 type arguments.
 //   S2(6).test3<int, int>(7);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 1 type arguments.
 //   S2(7).test3<int, int, int>(8);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
 // pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
 //   3.test();
@@ -175,38 +175,38 @@
   invalid-expression "pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
   7.test3<int, int, int>(8);
     ^" in self::S2|test3<dynamic, core::int, core::int, core::int>(7, 8);
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:12: Error: Too few positional arguments: 1 required, 0 given.
   S(3).test();
-       ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+           ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:12: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S(4).test(5, 6);
-       ^";
+           ^";
   invalid-expression "pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
   S(5).test<int>(6);
        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:14: Error: Too few positional arguments: 1 required, 0 given.
   S2(3).test2();
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S2(4).test2(5, 6);
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 0 type arguments.
   S2(5).test2<int>(6);
         ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:14: Error: Too few positional arguments: 1 required, 0 given.
   S2(3).test3();
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S2(4).test3(5, 6);
-        ^";
+             ^";
   self::S2|test3<dynamic, core::int>(5, 6);
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 1 type arguments.
   S2(6).test3<int, int>(7);
         ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 1 type arguments.
   S2(7).test3<int, int, int>(8);
         ^";
 }
diff --git a/pkg/front_end/testcases/general/issue45204.dart.strong.modular.expect b/pkg/front_end/testcases/general/issue45204.dart.strong.modular.expect
index f0cf6cd..6d27361 100644
--- a/pkg/front_end/testcases/general/issue45204.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/issue45204.dart.strong.modular.expect
@@ -2,78 +2,78 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:29:12: Error: Too few positional arguments: 1 required, 0 given.
 //   S(3).test();
-//        ^
+//            ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:30:12: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S(4).test(5, 6);
-//        ^
+//            ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
 // pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
 //   S(5).test<int>(6);
 //        ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:33:14: Error: Too few positional arguments: 1 required, 0 given.
 //   S2(3).test2();
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:34:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S2(4).test2(5, 6);
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 0 type arguments.
 //   S2(5).test2<int>(6);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:37:14: Error: Too few positional arguments: 1 required, 0 given.
 //   S2(3).test3();
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:38:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S2(4).test3(5, 6);
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 1 type arguments.
 //   S2(6).test3<int, int>(7);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 1 type arguments.
 //   S2(7).test3<int, int, int>(8);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
 // pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
 //   3.test();
@@ -175,38 +175,38 @@
   invalid-expression "pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
   7.test3<int, int, int>(8);
     ^" in self::S2|test3<dynamic, core::int, core::int, core::int>(7, 8);
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:12: Error: Too few positional arguments: 1 required, 0 given.
   S(3).test();
-       ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+           ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:12: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S(4).test(5, 6);
-       ^";
+           ^";
   invalid-expression "pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
   S(5).test<int>(6);
        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:14: Error: Too few positional arguments: 1 required, 0 given.
   S2(3).test2();
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S2(4).test2(5, 6);
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 0 type arguments.
   S2(5).test2<int>(6);
         ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:14: Error: Too few positional arguments: 1 required, 0 given.
   S2(3).test3();
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S2(4).test3(5, 6);
-        ^";
+             ^";
   self::S2|test3<dynamic, core::int>(5, 6);
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 1 type arguments.
   S2(6).test3<int, int>(7);
         ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 1 type arguments.
   S2(7).test3<int, int, int>(8);
         ^";
 }
diff --git a/pkg/front_end/testcases/general/issue45204.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue45204.dart.strong.transformed.expect
index f0cf6cd..6d27361 100644
--- a/pkg/front_end/testcases/general/issue45204.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45204.dart.strong.transformed.expect
@@ -2,78 +2,78 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:29:12: Error: Too few positional arguments: 1 required, 0 given.
 //   S(3).test();
-//        ^
+//            ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:30:12: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S(4).test(5, 6);
-//        ^
+//            ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
 // pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
 //   S(5).test<int>(6);
 //        ^
 // pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
 //   void test(int x) {}
-//        ^^^^^^
+//        ^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:33:14: Error: Too few positional arguments: 1 required, 0 given.
 //   S2(3).test2();
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:34:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S2(4).test2(5, 6);
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 0 type arguments.
 //   S2(5).test2<int>(6);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
 //   void test2(int x) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/general/issue45204.dart:37:14: Error: Too few positional arguments: 1 required, 0 given.
 //   S2(3).test3();
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// pkg/front_end/testcases/general/issue45204.dart:38:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   S2(4).test3(5, 6);
-//         ^
+//              ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 1 type arguments.
 //   S2(6).test3<int, int>(7);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
-// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 1 type arguments.
 //   S2(7).test3<int, int, int>(8);
 //         ^
 // pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
 //   void test3<Y>(Y y) {}
-//        ^^^^^^^^
+//        ^^^^^
 //
 // pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
 //   3.test();
@@ -175,38 +175,38 @@
   invalid-expression "pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
   7.test3<int, int, int>(8);
     ^" in self::S2|test3<dynamic, core::int, core::int, core::int>(7, 8);
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:12: Error: Too few positional arguments: 1 required, 0 given.
   S(3).test();
-       ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+           ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:12: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S(4).test(5, 6);
-       ^";
+           ^";
   invalid-expression "pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
   S(5).test<int>(6);
        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:14: Error: Too few positional arguments: 1 required, 0 given.
   S2(3).test2();
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S2(4).test2(5, 6);
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 0 type arguments.
   S2(5).test2<int>(6);
         ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:14: Error: Too few positional arguments: 1 required, 0 given.
   S2(3).test3();
-        ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+             ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:14: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   S2(4).test3(5, 6);
-        ^";
+             ^";
   self::S2|test3<dynamic, core::int>(5, 6);
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 1 type arguments.
   S2(6).test3<int, int>(7);
         ^";
-  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 1 type arguments.
   S2(7).test3<int, int, int>(8);
         ^";
 }
diff --git a/pkg/front_end/testcases/general/new_as_selector.dart.strong.expect b/pkg/front_end/testcases/general/new_as_selector.dart.strong.expect
index faed104..de617e8 100644
--- a/pkg/front_end/testcases/general/new_as_selector.dart.strong.expect
+++ b/pkg/front_end/testcases/general/new_as_selector.dart.strong.expect
@@ -350,8 +350,8 @@
     ;
   method method() → dynamic {
     this.{self::C::new}{core::int};
-    self::E|call<dynamic>(this.{self::C::new}{core::int});
-    self::E|call<core::int>(this.{self::C::new}{core::int});
+    let final core::int #t1 = this.{self::C::new}{core::int} in self::E|call<dynamic>(#t1);
+    let final core::int #t2 = this.{self::C::new}{core::int} in self::E|call<core::int>(#t2);
     this.{self::C::new} = 87;
   }
 }
@@ -372,7 +372,7 @@
   return d{dynamic}.new;
 static method test() → dynamic {
   new self::C::•().{self::C::new}{core::int};
-  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  let final core::int #t3 = new self::C::•().{self::C::new}{core::int} in self::E|call<dynamic>(#t3);
   new self::C::•().{self::C::new} = 87;
   self::C c = new self::C::•();
   c.{self::C::new}{core::int};
@@ -381,27 +381,27 @@
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
-  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
-  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
-  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
-  let final dynamic #t4 = foo in block {
-    #t4{dynamic}.new;
-  } =>#t4;
-  let final dynamic #t5 = foo in block {
-    #t5{dynamic}.new();
-  } =>#t5;
-  let final dynamic #t6 = foo in block {
-    #t6{dynamic}.new<core::int>();
-  } =>#t6;
+  let final dynamic #t4 = foo in #t4 == null ?{dynamic} null : #t4{dynamic}.new;
+  let final dynamic #t5 = foo in #t5 == null ?{dynamic} null : #t5{dynamic}.new();
+  let final dynamic #t6 = foo in #t6 == null ?{dynamic} null : #t6{dynamic}.new<core::int>();
+  let final dynamic #t7 = foo in block {
+    #t7{dynamic}.new;
+  } =>#t7;
+  let final dynamic #t8 = foo in block {
+    #t8{dynamic}.new();
+  } =>#t8;
+  let final dynamic #t9 = foo in block {
+    #t9{dynamic}.new<core::int>();
+  } =>#t9;
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
   self::new;
   self::E|call<dynamic>(self::new);
   self::E|call<core::int>(self::new);
-  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
-  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
-  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  let final dynamic #t10 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t11 = CheckLibraryIsLoaded(prefix2) in let final core::int #t12 = self::c.{self::C::new}{core::int} in self::E|call<dynamic>(#t12);
+  let final dynamic #t13 = CheckLibraryIsLoaded(prefix2) in let final core::int #t14 = self::c.{self::C::new}{core::int} in self::E|call<core::int>(#t14);
   self::E|get#new(0);
   self::E|call<dynamic>(self::E|get#new(0));
   self::E|call<core::int>(self::E|get#new(0));
diff --git a/pkg/front_end/testcases/general/new_as_selector.dart.strong.modular.expect b/pkg/front_end/testcases/general/new_as_selector.dart.strong.modular.expect
index faed104..de617e8 100644
--- a/pkg/front_end/testcases/general/new_as_selector.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/new_as_selector.dart.strong.modular.expect
@@ -350,8 +350,8 @@
     ;
   method method() → dynamic {
     this.{self::C::new}{core::int};
-    self::E|call<dynamic>(this.{self::C::new}{core::int});
-    self::E|call<core::int>(this.{self::C::new}{core::int});
+    let final core::int #t1 = this.{self::C::new}{core::int} in self::E|call<dynamic>(#t1);
+    let final core::int #t2 = this.{self::C::new}{core::int} in self::E|call<core::int>(#t2);
     this.{self::C::new} = 87;
   }
 }
@@ -372,7 +372,7 @@
   return d{dynamic}.new;
 static method test() → dynamic {
   new self::C::•().{self::C::new}{core::int};
-  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  let final core::int #t3 = new self::C::•().{self::C::new}{core::int} in self::E|call<dynamic>(#t3);
   new self::C::•().{self::C::new} = 87;
   self::C c = new self::C::•();
   c.{self::C::new}{core::int};
@@ -381,27 +381,27 @@
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
-  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
-  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
-  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
-  let final dynamic #t4 = foo in block {
-    #t4{dynamic}.new;
-  } =>#t4;
-  let final dynamic #t5 = foo in block {
-    #t5{dynamic}.new();
-  } =>#t5;
-  let final dynamic #t6 = foo in block {
-    #t6{dynamic}.new<core::int>();
-  } =>#t6;
+  let final dynamic #t4 = foo in #t4 == null ?{dynamic} null : #t4{dynamic}.new;
+  let final dynamic #t5 = foo in #t5 == null ?{dynamic} null : #t5{dynamic}.new();
+  let final dynamic #t6 = foo in #t6 == null ?{dynamic} null : #t6{dynamic}.new<core::int>();
+  let final dynamic #t7 = foo in block {
+    #t7{dynamic}.new;
+  } =>#t7;
+  let final dynamic #t8 = foo in block {
+    #t8{dynamic}.new();
+  } =>#t8;
+  let final dynamic #t9 = foo in block {
+    #t9{dynamic}.new<core::int>();
+  } =>#t9;
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
   self::new;
   self::E|call<dynamic>(self::new);
   self::E|call<core::int>(self::new);
-  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
-  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
-  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  let final dynamic #t10 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t11 = CheckLibraryIsLoaded(prefix2) in let final core::int #t12 = self::c.{self::C::new}{core::int} in self::E|call<dynamic>(#t12);
+  let final dynamic #t13 = CheckLibraryIsLoaded(prefix2) in let final core::int #t14 = self::c.{self::C::new}{core::int} in self::E|call<core::int>(#t14);
   self::E|get#new(0);
   self::E|call<dynamic>(self::E|get#new(0));
   self::E|call<core::int>(self::E|get#new(0));
diff --git a/pkg/front_end/testcases/general/new_as_selector.dart.strong.transformed.expect b/pkg/front_end/testcases/general/new_as_selector.dart.strong.transformed.expect
index faed104..de617e8 100644
--- a/pkg/front_end/testcases/general/new_as_selector.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/new_as_selector.dart.strong.transformed.expect
@@ -350,8 +350,8 @@
     ;
   method method() → dynamic {
     this.{self::C::new}{core::int};
-    self::E|call<dynamic>(this.{self::C::new}{core::int});
-    self::E|call<core::int>(this.{self::C::new}{core::int});
+    let final core::int #t1 = this.{self::C::new}{core::int} in self::E|call<dynamic>(#t1);
+    let final core::int #t2 = this.{self::C::new}{core::int} in self::E|call<core::int>(#t2);
     this.{self::C::new} = 87;
   }
 }
@@ -372,7 +372,7 @@
   return d{dynamic}.new;
 static method test() → dynamic {
   new self::C::•().{self::C::new}{core::int};
-  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  let final core::int #t3 = new self::C::•().{self::C::new}{core::int} in self::E|call<dynamic>(#t3);
   new self::C::•().{self::C::new} = 87;
   self::C c = new self::C::•();
   c.{self::C::new}{core::int};
@@ -381,27 +381,27 @@
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
-  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
-  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
-  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
-  let final dynamic #t4 = foo in block {
-    #t4{dynamic}.new;
-  } =>#t4;
-  let final dynamic #t5 = foo in block {
-    #t5{dynamic}.new();
-  } =>#t5;
-  let final dynamic #t6 = foo in block {
-    #t6{dynamic}.new<core::int>();
-  } =>#t6;
+  let final dynamic #t4 = foo in #t4 == null ?{dynamic} null : #t4{dynamic}.new;
+  let final dynamic #t5 = foo in #t5 == null ?{dynamic} null : #t5{dynamic}.new();
+  let final dynamic #t6 = foo in #t6 == null ?{dynamic} null : #t6{dynamic}.new<core::int>();
+  let final dynamic #t7 = foo in block {
+    #t7{dynamic}.new;
+  } =>#t7;
+  let final dynamic #t8 = foo in block {
+    #t8{dynamic}.new();
+  } =>#t8;
+  let final dynamic #t9 = foo in block {
+    #t9{dynamic}.new<core::int>();
+  } =>#t9;
   foo{dynamic}.new;
   foo{dynamic}.new();
   foo{dynamic}.new<core::int>();
   self::new;
   self::E|call<dynamic>(self::new);
   self::E|call<core::int>(self::new);
-  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
-  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
-  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  let final dynamic #t10 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t11 = CheckLibraryIsLoaded(prefix2) in let final core::int #t12 = self::c.{self::C::new}{core::int} in self::E|call<dynamic>(#t12);
+  let final dynamic #t13 = CheckLibraryIsLoaded(prefix2) in let final core::int #t14 = self::c.{self::C::new}{core::int} in self::E|call<core::int>(#t14);
   self::E|get#new(0);
   self::E|call<dynamic>(self::E|get#new(0));
   self::E|call<core::int>(self::E|get#new(0));
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect
index e5ed988..490df4c 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.expect
@@ -53,9 +53,9 @@
   });
 }
 static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
-  self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
+  let final core::int #t1 = i in let final core::int #t2 = 0 in self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(#t1, (core::int x) → void {
     x;
-  }, a: 0);
+  }, a: #t2);
 }
 static method testEarlierUnnamedParameter(core::int i) → dynamic {
   self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
@@ -73,7 +73,7 @@
   }, b: 0);
 }
 static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
-  self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
+  let final core::int #t3 = i in self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(#t3, 0, a: (core::int x) → void {
     x;
   });
 }
@@ -91,15 +91,15 @@
 }
 static method testLongDependencyChain(core::int i) → dynamic {
   self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → core::List<core::int> => <core::int>[0], (core::List<core::int> x) → core::int => x.{core::Iterable::single}{core::int}, (core::int y) → core::Set<core::int> => block {
-    final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
-    #t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
-  } =>#t1);
+    final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
+    #t4.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
+  } =>#t4);
 }
 static method testDependencyCycle(core::int i) → dynamic {
   self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (core::Object? x) → core::List<core::Object?> => <core::Object?>[x], (core::Object? y) → core::Set<core::Object?> => block {
-    final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
-    #t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
-  } =>#t2);
+    final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
+    #t5.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+  } =>#t5);
 }
 static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
   self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => <core::int>[x]);
@@ -118,7 +118,7 @@
   self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
 }
 static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
-  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
+  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t6 = x in #t6 == null ?{core::int} 0 : #t6{core::int}).{core::num::+}(y){(core::num) → core::int});
   a;
 }
 static method testParenthesized(core::int i) → dynamic {
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.modular.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.modular.expect
index e5ed988..490df4c 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.modular.expect
@@ -53,9 +53,9 @@
   });
 }
 static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
-  self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
+  let final core::int #t1 = i in let final core::int #t2 = 0 in self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(#t1, (core::int x) → void {
     x;
-  }, a: 0);
+  }, a: #t2);
 }
 static method testEarlierUnnamedParameter(core::int i) → dynamic {
   self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
@@ -73,7 +73,7 @@
   }, b: 0);
 }
 static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
-  self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
+  let final core::int #t3 = i in self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(#t3, 0, a: (core::int x) → void {
     x;
   });
 }
@@ -91,15 +91,15 @@
 }
 static method testLongDependencyChain(core::int i) → dynamic {
   self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → core::List<core::int> => <core::int>[0], (core::List<core::int> x) → core::int => x.{core::Iterable::single}{core::int}, (core::int y) → core::Set<core::int> => block {
-    final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
-    #t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
-  } =>#t1);
+    final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
+    #t4.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
+  } =>#t4);
 }
 static method testDependencyCycle(core::int i) → dynamic {
   self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (core::Object? x) → core::List<core::Object?> => <core::Object?>[x], (core::Object? y) → core::Set<core::Object?> => block {
-    final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
-    #t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
-  } =>#t2);
+    final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
+    #t5.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+  } =>#t5);
 }
 static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
   self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => <core::int>[x]);
@@ -118,7 +118,7 @@
   self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
 }
 static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
-  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
+  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t6 = x in #t6 == null ?{core::int} 0 : #t6{core::int}).{core::num::+}(y){(core::num) → core::int});
   a;
 }
 static method testParenthesized(core::int i) → dynamic {
diff --git a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect
index 08522e1..d8b479a 100644
--- a/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_update_1/horizontal_inference_extension_method.dart.strong.transformed.expect
@@ -53,9 +53,9 @@
   });
 }
 static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
-  self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
+  let final core::int #t1 = i in let final core::int #t2 = 0 in self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(#t1, (core::int x) → void {
     x;
-  }, a: 0);
+  }, a: #t2);
 }
 static method testEarlierUnnamedParameter(core::int i) → dynamic {
   self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
@@ -73,7 +73,7 @@
   }, b: 0);
 }
 static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
-  self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
+  let final core::int #t3 = i in self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(#t3, 0, a: (core::int x) → void {
     x;
   });
 }
@@ -91,15 +91,15 @@
 }
 static method testLongDependencyChain(core::int i) → dynamic {
   self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → core::List<core::int> => core::_GrowableList::_literal1<core::int>(0), (core::List<core::int> x) → core::int => x.{core::Iterable::single}{core::int}, (core::int y) → core::Set<core::int> => block {
-    final core::Set<core::int> #t1 = new _co::_Set::•<core::int>();
-    #t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
-  } =>#t1);
+    final core::Set<core::int> #t4 = new _co::_Set::•<core::int>();
+    #t4.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
+  } =>#t4);
 }
 static method testDependencyCycle(core::int i) → dynamic {
   self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (core::Object? x) → core::List<core::Object?> => core::_GrowableList::_literal1<core::Object?>(x), (core::Object? y) → core::Set<core::Object?> => block {
-    final core::Set<core::Object?> #t2 = new _co::_Set::•<core::Object?>();
-    #t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
-  } =>#t2);
+    final core::Set<core::Object?> #t5 = new _co::_Set::•<core::Object?>();
+    #t5.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+  } =>#t5);
 }
 static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
   self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x));
@@ -118,7 +118,7 @@
   self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
 }
 static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
-  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
+  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t6 = x in #t6 == null ?{core::int} 0 : #t6{core::int}).{core::num::+}(y){(core::num) → core::int});
   a;
 }
 static method testParenthesized(core::int i) → dynamic {
@@ -230,3 +230,7 @@
 constants  {
   #C1 = null
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///horizontal_inference_extension_method.dart:22:54 -> IntConstant(0)
+Extra constant evaluation: evaluated: 260, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.expect b/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.expect
index 6bbc06b..71b87f3 100644
--- a/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.expect
@@ -47,9 +47,9 @@
 static extension-member method Extension|set#pIterableIntQuestion(lowered final core::String #this, core::Object? value) → void {}
 static extension-member method Extension|test(lowered final core::String #this) → dynamic {
   self::C2<core::double> c2Double = new self::C2::•<core::double>();
-  self::contextB1<dynamic>(let final core::String #t1 = #this in let final self::C1<core::int>? #t2 = self::Extension|get#pC1IntQuestion(#t1) in #t2 == null ?{self::B1<dynamic>} let final self::C2<core::double> #t3 = c2Double in let final void #t4 = self::Extension|set#pC1IntQuestion(#t1, #t3) in #t3 : #t2{self::C1<core::int>});
+  self::contextB1<dynamic>(let final self::C1<core::int>? #t1 = self::Extension|get#pC1IntQuestion(#this) in #t1 == null ?{self::B1<dynamic>} let final self::C2<core::double> #t2 = c2Double in let final void #t3 = self::Extension|set#pC1IntQuestion(#this, #t2) in #t2 : #t1{self::C1<core::int>});
   core::List<core::num> listNum = <core::num>[];
-  self::contextIterable<core::num>(let final core::String #t5 = #this in let final core::Iterable<core::int>? #t6 = self::Extension|get#pIterableIntQuestion(#t5) in #t6 == null ?{core::Iterable<core::num>} let final core::List<core::num> #t7 = listNum in let final void #t8 = self::Extension|set#pIterableIntQuestion(#t5, #t7) in #t7 : #t6{core::Iterable<core::int>});
+  self::contextIterable<core::num>(let final core::Iterable<core::int>? #t4 = self::Extension|get#pIterableIntQuestion(#this) in #t4 == null ?{core::Iterable<core::num>} let final core::List<core::num> #t5 = listNum in let final void #t6 = self::Extension|set#pIterableIntQuestion(#this, #t5) in #t5 : #t4{core::Iterable<core::int>});
 }
 static extension-member method Extension|get#test(lowered final core::String #this) → () → dynamic
   return () → dynamic => self::Extension|test(#this);
diff --git a/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.modular.expect b/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.modular.expect
index 6bbc06b..71b87f3 100644
--- a/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.modular.expect
@@ -47,9 +47,9 @@
 static extension-member method Extension|set#pIterableIntQuestion(lowered final core::String #this, core::Object? value) → void {}
 static extension-member method Extension|test(lowered final core::String #this) → dynamic {
   self::C2<core::double> c2Double = new self::C2::•<core::double>();
-  self::contextB1<dynamic>(let final core::String #t1 = #this in let final self::C1<core::int>? #t2 = self::Extension|get#pC1IntQuestion(#t1) in #t2 == null ?{self::B1<dynamic>} let final self::C2<core::double> #t3 = c2Double in let final void #t4 = self::Extension|set#pC1IntQuestion(#t1, #t3) in #t3 : #t2{self::C1<core::int>});
+  self::contextB1<dynamic>(let final self::C1<core::int>? #t1 = self::Extension|get#pC1IntQuestion(#this) in #t1 == null ?{self::B1<dynamic>} let final self::C2<core::double> #t2 = c2Double in let final void #t3 = self::Extension|set#pC1IntQuestion(#this, #t2) in #t2 : #t1{self::C1<core::int>});
   core::List<core::num> listNum = <core::num>[];
-  self::contextIterable<core::num>(let final core::String #t5 = #this in let final core::Iterable<core::int>? #t6 = self::Extension|get#pIterableIntQuestion(#t5) in #t6 == null ?{core::Iterable<core::num>} let final core::List<core::num> #t7 = listNum in let final void #t8 = self::Extension|set#pIterableIntQuestion(#t5, #t7) in #t7 : #t6{core::Iterable<core::int>});
+  self::contextIterable<core::num>(let final core::Iterable<core::int>? #t4 = self::Extension|get#pIterableIntQuestion(#this) in #t4 == null ?{core::Iterable<core::num>} let final core::List<core::num> #t5 = listNum in let final void #t6 = self::Extension|set#pIterableIntQuestion(#this, #t5) in #t5 : #t4{core::Iterable<core::int>});
 }
 static extension-member method Extension|get#test(lowered final core::String #this) → () → dynamic
   return () → dynamic => self::Extension|test(#this);
diff --git a/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.transformed.expect
index 01e2c3f..53151b4 100644
--- a/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_update_3/if_null_assignment_explicit_extension_this_property_test.dart.strong.transformed.expect
@@ -47,9 +47,9 @@
 static extension-member method Extension|set#pIterableIntQuestion(lowered final core::String #this, core::Object? value) → void {}
 static extension-member method Extension|test(lowered final core::String #this) → dynamic {
   self::C2<core::double> c2Double = new self::C2::•<core::double>();
-  self::contextB1<dynamic>(let final core::String #t1 = #this in let final self::C1<core::int>? #t2 = self::Extension|get#pC1IntQuestion(#t1) in #t2 == null ?{self::B1<dynamic>} let final self::C2<core::double> #t3 = c2Double in let final void #t4 = self::Extension|set#pC1IntQuestion(#t1, #t3) in #t3 : #t2{self::C1<core::int>});
+  self::contextB1<dynamic>(let final self::C1<core::int>? #t1 = self::Extension|get#pC1IntQuestion(#this) in #t1 == null ?{self::B1<dynamic>} let final self::C2<core::double> #t2 = c2Double in let final void #t3 = self::Extension|set#pC1IntQuestion(#this, #t2) in #t2 : #t1{self::C1<core::int>});
   core::List<core::num> listNum = core::_GrowableList::•<core::num>(0);
-  self::contextIterable<core::num>(let final core::String #t5 = #this in let final core::Iterable<core::int>? #t6 = self::Extension|get#pIterableIntQuestion(#t5) in #t6 == null ?{core::Iterable<core::num>} let final core::List<core::num> #t7 = listNum in let final void #t8 = self::Extension|set#pIterableIntQuestion(#t5, #t7) in #t7 : #t6{core::Iterable<core::int>});
+  self::contextIterable<core::num>(let final core::Iterable<core::int>? #t4 = self::Extension|get#pIterableIntQuestion(#this) in #t4 == null ?{core::Iterable<core::num>} let final core::List<core::num> #t5 = listNum in let final void #t6 = self::Extension|set#pIterableIntQuestion(#this, #t5) in #t5 : #t4{core::Iterable<core::int>});
 }
 static extension-member method Extension|get#test(lowered final core::String #this) → () → dynamic
   return () → dynamic => self::Extension|test(#this);
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart
index 48241ab..d4d5f10 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart
@@ -2,12 +2,27 @@
 // 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.
 
+int counter = 1;
+
+void reset() {
+  counter = 1;
+}
+
+int t(int value) {
+  if (counter != value) {
+    throw 'Expected $counter, actual $value';
+  }
+  counter++;
+  return value;
+}
+
 class A {
   A(int x, int y, {required int z});
 
   factory A.foo(int x, int y, {required int z}) => new A(x, y, z: z);
 
-  void Function(int x, int y, {required int z}) get property => throw 42;
+  void Function(int x, int y, {required int z}) get property =>
+          (int x, int y, {required int z}) {};
 
   void bar(int x, int y, {required int z}) {}
 }
@@ -16,11 +31,15 @@
 
 foo(int x, int y, {required int z}) {}
 
-extension E on A {
+extension E on int {
   method1() {
-    method2(foo: 1, 2); // This call.
-    staticMethod2(foo: 1, 2);
+    reset();
+    method2(foo: t(1), t(2)); // This call.
+
+    reset();
+    staticMethod2(foo: t(1), t(2));
   }
+
   method2(int bar, {int? foo}) {}
 
   static staticMethod2(int bar, {int? foo}) {}
@@ -30,69 +49,126 @@
   void local(int x, int y, {required int z}) {}
 
   // StaticInvocation.
-  foo(1, 2, z: 3);
-  foo(1, z: 2, 3);
-  foo(z: 1, 2, 3);
+  reset();
+  foo(t(1), t(2), z: t(3));
+  reset();
+  foo(t(1), z: t(2), t(3));
+  reset();
+  foo(z: t(1), t(2), t(3));
 
   // FactoryConstructorInvocation.
-  new A.foo(1, 2, z: 3);
-  new A.foo(1, z: 2, 3);
-  new A.foo(z: 1, 2, 3);
-  new B.foo(1, 2, z: 3);
-  new B.foo(1, z: 2, 3);
-  new B.foo(z: 1, 2, 3);
+  reset();
+  new A.foo(t(1), t(2), z: t(3));
+  reset();
+  new A.foo(t(1), z: t(2), t(3));
+  reset();
+  new A.foo(z: t(1), t(2), t(3));
+  reset();
+  new B.foo(t(1), t(2), z: t(3));
+  reset();
+  new B.foo(t(1), z: t(2), t(3));
+  reset();
+  new B.foo(z: t(1), t(2), t(3));
 
   // ConstructorInvocation.
-  new A(1, 2, z: 3);
-  new A(1, z: 2, 3);
-  new A(z: 1, 2, 3);
-  new B(1, 2, z: 3);
-  new B(1, z: 2, 3);
-  new B(z: 1, 2, 3);
+  reset();
+  new A(t(1), t(2), z: t(3));
+  reset();
+  new A(t(1), z: t(2), t(3));
+  reset();
+  new A(z: t(1), t(2), t(3));
+  reset();
+  new B(t(1), t(2), z: t(3));
+  reset();
+  new B(t(1), z: t(2), t(3));
+  reset();
+  new B(z: t(1), t(2), t(3));
 
   // DynamicInvocation.
-  d(1, 2, z: 3);
-  d(1, z: 2, 3);
-  d(z: 1, 2, 3);
+  reset();
+  d(t(1), t(2), z: t(3));
+  reset();
+  d(t(1), z: t(2), t(3));
+  reset();
+  d(z: t(1), t(2), t(3));
 
   // FunctionInvocation.
-  f(1, 2, z: 3);
-  f(1, z: 2, 3);
-  f(z: 1, 2, 3);
+  reset();
+  f(t(1), t(2), z: t(3));
+  reset();
+  f(t(1), z: t(2), t(3));
+  reset();
+  f(z: t(1), t(2), t(3));
 
   // InstanceGetterInvocation.
-  a.property(1, 2, z: 3);
-  a.property(1, z: 2, 3);
-  a.property(z: 1, 2, 3);
+  reset();
+  a.property(t(1), t(2), z: t(3));
+  reset();
+  a.property(t(1), z: t(2), t(3));
+  reset();
+  a.property(z: t(1), t(2), t(3));
 
   // InstanceInvocation.
-  a.bar(1, 2, z: 3);
-  a.bar(1, z: 2, 3);
-  a.bar(z: 1, 2, 3);
+  reset();
+  a.bar(t(1), t(2), z: t(3));
+  reset();
+  a.bar(t(1), z: t(2), t(3));
+  reset();
+  a.bar(z: t(1), t(2), t(3));
 
   // LocalFunctionInvocation.
-  local(1, 2, z: 3);
-  local(1, z: 2, 3);
-  local(z: 1, 2, 3);
+  reset();
+  local(t(1), t(2), z: t(3));
+  reset();
+  local(t(1), z: t(2), t(3));
+  reset();
+  local(z: t(1), t(2), t(3));
 
   // Implicit extension instance call.
-  a.method2(foo: 1, 2);
+  reset();
+  t(1).method2(foo: t(2), t(3));
+  reset();
+  t(1).method2(t(2), foo: t(3));
 
   // Explicit extension instance call.
-  E(a).method2(foo: 1, 2);
+  reset();
+  E(t(1)).method2(foo: t(2), t(3));
+  reset();
+  E(t(1)).method2(t(2), foo: t(3));
 
   // Explicit extension static call.
-  E.staticMethod2(foo: 1, 2);
+  reset();
+  E.staticMethod2(foo: t(1), t(2));
+  reset();
+  E.staticMethod2(t(1), foo: t(2));
 }
 
 class Test extends A {
-  Test() : super(1, 2, z: 3);
+  Test() : super(t(1), t(2), z: t(3));
+  Test.c1() : super(t(1), z: t(2), t(3));
+  Test.c2() : super(z: t(1), t(2), t(3));
 
   test() {
-    super.bar(1, 2, z: 3);
-    super.bar(1, z: 2, 3);
-    super.bar(z: 1, 2, 3);
+    reset();
+    super.bar(t(1), t(2), z: t(3));
+    reset();
+    super.bar(t(1), z: t(2), t(3));
+    reset();
+    super.bar(z: t(1), t(2), t(3));
   }
 }
 
-main() {}
+main() {
+  reset();
+  Test().test();
+
+  reset();
+  Test.c1();
+  reset();
+  Test.c2();
+
+  var a = A(-1, -1, z: -1);
+  var f = (int x, int y, {required int z}) {};
+  test(f, f, a);
+  0.method1();
+}
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.expect
index ac8d5d6..d684197 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.expect
@@ -10,74 +10,146 @@
   static factory foo(core::int x, core::int y, {required core::int z}) → self::A
     return new self::A::•(x, y, z: z);
   get property() → (core::int, core::int, {required z: core::int}) → void
-    return throw 42;
+    return (core::int x, core::int y, {required core::int z}) → void {};
   method bar(core::int x, core::int y, {required core::int z}) → void {}
 }
 class Test extends self::A {
   constructor •() → self::Test
-    : super self::A::•(1, 2, z: 3)
+    : super self::A::•(self::t(1), self::t(2), z: self::t(3))
+    ;
+  constructor c1() → self::Test
+    : final core::int #t1 = self::t(1), final core::int #t2 = self::t(2), super self::A::•(#t1, self::t(3), z: #t2)
+    ;
+  constructor c2() → self::Test
+    : final core::int #t3 = self::t(1), super self::A::•(self::t(2), self::t(3), z: #t3)
     ;
   method test() → dynamic {
-    super.{self::A::bar}(1, 2, z: 3);
-    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
-    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+    self::reset();
+    super.{self::A::bar}(self::t(1), self::t(2), z: self::t(3));
+    self::reset();
+    let final core::int #t4 = self::t(1) in let final core::int #t5 = self::t(2) in super.{self::A::bar}(#t4, self::t(3), z: #t5);
+    self::reset();
+    let final core::int #t6 = self::t(1) in super.{self::A::bar}(self::t(2), self::t(3), z: #t6);
   }
 }
-extension E on self::A {
+extension E on core::int {
   method method1 = self::E|method1;
   method tearoff method1 = self::E|get#method1;
   method method2 = self::E|method2;
   method tearoff method2 = self::E|get#method2;
   static method staticMethod2 = self::E|staticMethod2;
 }
-static method foo(core::int x, core::int y, {required core::int z}) → dynamic {}
-static extension-member method E|method1(lowered final self::A #this) → dynamic {
-  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
-  let final core::int #t6 = 1 in self::E|staticMethod2(2, foo: #t6);
+static field core::int counter = 1;
+static method reset() → void {
+  self::counter = 1;
 }
-static extension-member method E|get#method1(lowered final self::A #this) → () → dynamic
+static method t(core::int value) → core::int {
+  if(!(self::counter =={core::num::==}{(core::Object) → core::bool} value)) {
+    throw "Expected ${self::counter}, actual ${value}";
+  }
+  self::counter = self::counter.{core::num::+}(1){(core::num) → core::int};
+  return value;
+}
+static method foo(core::int x, core::int y, {required core::int z}) → dynamic {}
+static extension-member method E|method1(lowered final core::int #this) → dynamic {
+  self::reset();
+  let final core::int #t7 = #this in let final core::int #t8 = self::t(1) in self::E|method2(#t7, self::t(2), foo: #t8);
+  self::reset();
+  let final core::int #t9 = self::t(1) in self::E|staticMethod2(self::t(2), foo: #t9);
+}
+static extension-member method E|get#method1(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::E|method1(#this);
-static extension-member method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
-static extension-member method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+static extension-member method E|method2(lowered final core::int #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static extension-member method E|get#method2(lowered final core::int #this) → (core::int, {foo: core::int?}) → dynamic
   return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
 static extension-member method E|staticMethod2(core::int bar, {core::int? foo = #C1}) → dynamic {}
 static method test(dynamic d, core::Function f, self::A a) → dynamic {
   function local(core::int x, core::int y, {required core::int z}) → void {}
-  self::foo(1, 2, z: 3);
-  let final core::int #t7 = 1 in let final core::int #t8 = 2 in self::foo(#t7, 3, z: #t8);
-  let final core::int #t9 = 1 in self::foo(2, 3, z: #t9);
-  self::A::foo(1, 2, z: 3);
-  let final core::int #t10 = 1 in let final core::int #t11 = 2 in self::A::foo(#t10, 3, z: #t11);
-  let final core::int #t12 = 1 in self::A::foo(2, 3, z: #t12);
-  self::A::foo(1, 2, z: 3);
-  let final core::int #t13 = 1 in let final core::int #t14 = 2 in self::A::foo(#t13, 3, z: #t14);
-  let final core::int #t15 = 1 in self::A::foo(2, 3, z: #t15);
-  new self::A::•(1, 2, z: 3);
-  let final core::int #t16 = 1 in let final core::int #t17 = 2 in new self::A::•(#t16, 3, z: #t17);
-  let final core::int #t18 = 1 in new self::A::•(2, 3, z: #t18);
-  new self::A::•(1, 2, z: 3);
-  let final core::int #t19 = 1 in let final core::int #t20 = 2 in new self::A::•(#t19, 3, z: #t20);
-  let final core::int #t21 = 1 in new self::A::•(2, 3, z: #t21);
-  d{dynamic}(1, 2, z: 3);
-  let final core::int #t22 = 1 in let final core::int #t23 = 2 in d{dynamic}(#t22, 3, z: #t23);
-  let final core::int #t24 = 1 in d{dynamic}(2, 3, z: #t24);
-  f(1, 2, z: 3);
-  let final core::int #t25 = 1 in let final core::int #t26 = 2 in f(#t25, 3, z: #t26);
-  let final core::int #t27 = 1 in f(2, 3, z: #t27);
-  let final self::A #t28 = a in let final core::int #t29 = 1 in let final core::int #t30 = 2 in let final core::int #t31 = 3 in #t28.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t29, #t30, z: #t31){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t32 = a in let final core::int #t33 = 1 in let final core::int #t34 = 2 in let final core::int #t35 = 3 in #t32.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t33, #t35, z: #t34){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t36 = a in let final core::int #t37 = 1 in let final core::int #t38 = 2 in let final core::int #t39 = 3 in #t36.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t38, #t39, z: #t37){(core::int, core::int, {required z: core::int}) → void};
-  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t40 = a in let final core::int #t41 = 1 in let final core::int #t42 = 2 in #t40.{self::A::bar}(#t41, 3, z: #t42){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t43 = a in let final core::int #t44 = 1 in #t43.{self::A::bar}(2, 3, z: #t44){(core::int, core::int, {required z: core::int}) → void};
-  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
-  let final core::int #t45 = 1 in let final core::int #t46 = 2 in local(#t45, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
-  let final core::int #t47 = 1 in local(2, 3, z: #t47){(core::int, core::int, {required z: core::int}) → void};
-  self::E|method2(a, 2, foo: 1);
-  self::E|method2(a, 2, foo: 1);
-  let final core::int #t48 = 1 in self::E|staticMethod2(2, foo: #t48);
+  self::reset();
+  self::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t10 = self::t(1) in let final core::int #t11 = self::t(2) in self::foo(#t10, self::t(3), z: #t11);
+  self::reset();
+  let final core::int #t12 = self::t(1) in self::foo(self::t(2), self::t(3), z: #t12);
+  self::reset();
+  self::A::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t13 = self::t(1) in let final core::int #t14 = self::t(2) in self::A::foo(#t13, self::t(3), z: #t14);
+  self::reset();
+  let final core::int #t15 = self::t(1) in self::A::foo(self::t(2), self::t(3), z: #t15);
+  self::reset();
+  self::A::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t16 = self::t(1) in let final core::int #t17 = self::t(2) in self::A::foo(#t16, self::t(3), z: #t17);
+  self::reset();
+  let final core::int #t18 = self::t(1) in self::A::foo(self::t(2), self::t(3), z: #t18);
+  self::reset();
+  new self::A::•(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t19 = self::t(1) in let final core::int #t20 = self::t(2) in new self::A::•(#t19, self::t(3), z: #t20);
+  self::reset();
+  let final core::int #t21 = self::t(1) in new self::A::•(self::t(2), self::t(3), z: #t21);
+  self::reset();
+  new self::A::•(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t22 = self::t(1) in let final core::int #t23 = self::t(2) in new self::A::•(#t22, self::t(3), z: #t23);
+  self::reset();
+  let final core::int #t24 = self::t(1) in new self::A::•(self::t(2), self::t(3), z: #t24);
+  self::reset();
+  d{dynamic}(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t25 = self::t(1) in let final core::int #t26 = self::t(2) in d{dynamic}(#t25, self::t(3), z: #t26);
+  self::reset();
+  let final core::int #t27 = self::t(1) in d{dynamic}(self::t(2), self::t(3), z: #t27);
+  self::reset();
+  f(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t28 = self::t(1) in let final core::int #t29 = self::t(2) in f(#t28, self::t(3), z: #t29);
+  self::reset();
+  let final core::int #t30 = self::t(1) in f(self::t(2), self::t(3), z: #t30);
+  self::reset();
+  let final self::A #t31 = a in let final core::int #t32 = self::t(1) in let final core::int #t33 = self::t(2) in let final core::int #t34 = self::t(3) in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t33, z: #t34){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t35 = a in let final core::int #t36 = self::t(1) in let final core::int #t37 = self::t(2) in let final core::int #t38 = self::t(3) in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t36, #t38, z: #t37){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t39 = a in let final core::int #t40 = self::t(1) in let final core::int #t41 = self::t(2) in let final core::int #t42 = self::t(3) in #t39.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t41, #t42, z: #t40){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  a.{self::A::bar}(self::t(1), self::t(2), z: self::t(3)){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t43 = a in let final core::int #t44 = self::t(1) in let final core::int #t45 = self::t(2) in #t43.{self::A::bar}(#t44, self::t(3), z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t46 = a in let final core::int #t47 = self::t(1) in #t46.{self::A::bar}(self::t(2), self::t(3), z: #t47){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  local(self::t(1), self::t(2), z: self::t(3)){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t48 = self::t(1) in let final core::int #t49 = self::t(2) in local(#t48, self::t(3), z: #t49){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t50 = self::t(1) in local(self::t(2), self::t(3), z: #t50){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t51 = self::t(1) in let final core::int #t52 = self::t(2) in self::E|method2(#t51, self::t(3), foo: #t52);
+  self::reset();
+  self::E|method2(self::t(1), self::t(2), foo: self::t(3));
+  self::reset();
+  let final core::int #t53 = self::t(1) in let final core::int #t54 = self::t(2) in self::E|method2(#t53, self::t(3), foo: #t54);
+  self::reset();
+  self::E|method2(self::t(1), self::t(2), foo: self::t(3));
+  self::reset();
+  let final core::int #t55 = self::t(1) in self::E|staticMethod2(self::t(2), foo: #t55);
+  self::reset();
+  self::E|staticMethod2(self::t(1), foo: self::t(2));
 }
-static method main() → dynamic {}
+static method main() → dynamic {
+  self::reset();
+  new self::Test::•().{self::Test::test}(){() → dynamic};
+  self::reset();
+  new self::Test::c1();
+  self::reset();
+  new self::Test::c2();
+  self::A a = new self::A::•(1.{core::int::unary-}(){() → core::int}, 1.{core::int::unary-}(){() → core::int}, z: 1.{core::int::unary-}(){() → core::int});
+  (core::int, core::int, {required z: core::int}) → Null f = (core::int x, core::int y, {required core::int z}) → Null {};
+  self::test(f, f, a);
+  self::E|method1(0);
+}
 
 constants  {
   #C1 = null
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.modular.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.modular.expect
index ac8d5d6..d684197 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.modular.expect
@@ -10,74 +10,146 @@
   static factory foo(core::int x, core::int y, {required core::int z}) → self::A
     return new self::A::•(x, y, z: z);
   get property() → (core::int, core::int, {required z: core::int}) → void
-    return throw 42;
+    return (core::int x, core::int y, {required core::int z}) → void {};
   method bar(core::int x, core::int y, {required core::int z}) → void {}
 }
 class Test extends self::A {
   constructor •() → self::Test
-    : super self::A::•(1, 2, z: 3)
+    : super self::A::•(self::t(1), self::t(2), z: self::t(3))
+    ;
+  constructor c1() → self::Test
+    : final core::int #t1 = self::t(1), final core::int #t2 = self::t(2), super self::A::•(#t1, self::t(3), z: #t2)
+    ;
+  constructor c2() → self::Test
+    : final core::int #t3 = self::t(1), super self::A::•(self::t(2), self::t(3), z: #t3)
     ;
   method test() → dynamic {
-    super.{self::A::bar}(1, 2, z: 3);
-    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
-    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+    self::reset();
+    super.{self::A::bar}(self::t(1), self::t(2), z: self::t(3));
+    self::reset();
+    let final core::int #t4 = self::t(1) in let final core::int #t5 = self::t(2) in super.{self::A::bar}(#t4, self::t(3), z: #t5);
+    self::reset();
+    let final core::int #t6 = self::t(1) in super.{self::A::bar}(self::t(2), self::t(3), z: #t6);
   }
 }
-extension E on self::A {
+extension E on core::int {
   method method1 = self::E|method1;
   method tearoff method1 = self::E|get#method1;
   method method2 = self::E|method2;
   method tearoff method2 = self::E|get#method2;
   static method staticMethod2 = self::E|staticMethod2;
 }
-static method foo(core::int x, core::int y, {required core::int z}) → dynamic {}
-static extension-member method E|method1(lowered final self::A #this) → dynamic {
-  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
-  let final core::int #t6 = 1 in self::E|staticMethod2(2, foo: #t6);
+static field core::int counter = 1;
+static method reset() → void {
+  self::counter = 1;
 }
-static extension-member method E|get#method1(lowered final self::A #this) → () → dynamic
+static method t(core::int value) → core::int {
+  if(!(self::counter =={core::num::==}{(core::Object) → core::bool} value)) {
+    throw "Expected ${self::counter}, actual ${value}";
+  }
+  self::counter = self::counter.{core::num::+}(1){(core::num) → core::int};
+  return value;
+}
+static method foo(core::int x, core::int y, {required core::int z}) → dynamic {}
+static extension-member method E|method1(lowered final core::int #this) → dynamic {
+  self::reset();
+  let final core::int #t7 = #this in let final core::int #t8 = self::t(1) in self::E|method2(#t7, self::t(2), foo: #t8);
+  self::reset();
+  let final core::int #t9 = self::t(1) in self::E|staticMethod2(self::t(2), foo: #t9);
+}
+static extension-member method E|get#method1(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::E|method1(#this);
-static extension-member method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
-static extension-member method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+static extension-member method E|method2(lowered final core::int #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static extension-member method E|get#method2(lowered final core::int #this) → (core::int, {foo: core::int?}) → dynamic
   return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
 static extension-member method E|staticMethod2(core::int bar, {core::int? foo = #C1}) → dynamic {}
 static method test(dynamic d, core::Function f, self::A a) → dynamic {
   function local(core::int x, core::int y, {required core::int z}) → void {}
-  self::foo(1, 2, z: 3);
-  let final core::int #t7 = 1 in let final core::int #t8 = 2 in self::foo(#t7, 3, z: #t8);
-  let final core::int #t9 = 1 in self::foo(2, 3, z: #t9);
-  self::A::foo(1, 2, z: 3);
-  let final core::int #t10 = 1 in let final core::int #t11 = 2 in self::A::foo(#t10, 3, z: #t11);
-  let final core::int #t12 = 1 in self::A::foo(2, 3, z: #t12);
-  self::A::foo(1, 2, z: 3);
-  let final core::int #t13 = 1 in let final core::int #t14 = 2 in self::A::foo(#t13, 3, z: #t14);
-  let final core::int #t15 = 1 in self::A::foo(2, 3, z: #t15);
-  new self::A::•(1, 2, z: 3);
-  let final core::int #t16 = 1 in let final core::int #t17 = 2 in new self::A::•(#t16, 3, z: #t17);
-  let final core::int #t18 = 1 in new self::A::•(2, 3, z: #t18);
-  new self::A::•(1, 2, z: 3);
-  let final core::int #t19 = 1 in let final core::int #t20 = 2 in new self::A::•(#t19, 3, z: #t20);
-  let final core::int #t21 = 1 in new self::A::•(2, 3, z: #t21);
-  d{dynamic}(1, 2, z: 3);
-  let final core::int #t22 = 1 in let final core::int #t23 = 2 in d{dynamic}(#t22, 3, z: #t23);
-  let final core::int #t24 = 1 in d{dynamic}(2, 3, z: #t24);
-  f(1, 2, z: 3);
-  let final core::int #t25 = 1 in let final core::int #t26 = 2 in f(#t25, 3, z: #t26);
-  let final core::int #t27 = 1 in f(2, 3, z: #t27);
-  let final self::A #t28 = a in let final core::int #t29 = 1 in let final core::int #t30 = 2 in let final core::int #t31 = 3 in #t28.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t29, #t30, z: #t31){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t32 = a in let final core::int #t33 = 1 in let final core::int #t34 = 2 in let final core::int #t35 = 3 in #t32.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t33, #t35, z: #t34){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t36 = a in let final core::int #t37 = 1 in let final core::int #t38 = 2 in let final core::int #t39 = 3 in #t36.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t38, #t39, z: #t37){(core::int, core::int, {required z: core::int}) → void};
-  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t40 = a in let final core::int #t41 = 1 in let final core::int #t42 = 2 in #t40.{self::A::bar}(#t41, 3, z: #t42){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t43 = a in let final core::int #t44 = 1 in #t43.{self::A::bar}(2, 3, z: #t44){(core::int, core::int, {required z: core::int}) → void};
-  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
-  let final core::int #t45 = 1 in let final core::int #t46 = 2 in local(#t45, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
-  let final core::int #t47 = 1 in local(2, 3, z: #t47){(core::int, core::int, {required z: core::int}) → void};
-  self::E|method2(a, 2, foo: 1);
-  self::E|method2(a, 2, foo: 1);
-  let final core::int #t48 = 1 in self::E|staticMethod2(2, foo: #t48);
+  self::reset();
+  self::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t10 = self::t(1) in let final core::int #t11 = self::t(2) in self::foo(#t10, self::t(3), z: #t11);
+  self::reset();
+  let final core::int #t12 = self::t(1) in self::foo(self::t(2), self::t(3), z: #t12);
+  self::reset();
+  self::A::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t13 = self::t(1) in let final core::int #t14 = self::t(2) in self::A::foo(#t13, self::t(3), z: #t14);
+  self::reset();
+  let final core::int #t15 = self::t(1) in self::A::foo(self::t(2), self::t(3), z: #t15);
+  self::reset();
+  self::A::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t16 = self::t(1) in let final core::int #t17 = self::t(2) in self::A::foo(#t16, self::t(3), z: #t17);
+  self::reset();
+  let final core::int #t18 = self::t(1) in self::A::foo(self::t(2), self::t(3), z: #t18);
+  self::reset();
+  new self::A::•(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t19 = self::t(1) in let final core::int #t20 = self::t(2) in new self::A::•(#t19, self::t(3), z: #t20);
+  self::reset();
+  let final core::int #t21 = self::t(1) in new self::A::•(self::t(2), self::t(3), z: #t21);
+  self::reset();
+  new self::A::•(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t22 = self::t(1) in let final core::int #t23 = self::t(2) in new self::A::•(#t22, self::t(3), z: #t23);
+  self::reset();
+  let final core::int #t24 = self::t(1) in new self::A::•(self::t(2), self::t(3), z: #t24);
+  self::reset();
+  d{dynamic}(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t25 = self::t(1) in let final core::int #t26 = self::t(2) in d{dynamic}(#t25, self::t(3), z: #t26);
+  self::reset();
+  let final core::int #t27 = self::t(1) in d{dynamic}(self::t(2), self::t(3), z: #t27);
+  self::reset();
+  f(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t28 = self::t(1) in let final core::int #t29 = self::t(2) in f(#t28, self::t(3), z: #t29);
+  self::reset();
+  let final core::int #t30 = self::t(1) in f(self::t(2), self::t(3), z: #t30);
+  self::reset();
+  let final self::A #t31 = a in let final core::int #t32 = self::t(1) in let final core::int #t33 = self::t(2) in let final core::int #t34 = self::t(3) in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t33, z: #t34){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t35 = a in let final core::int #t36 = self::t(1) in let final core::int #t37 = self::t(2) in let final core::int #t38 = self::t(3) in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t36, #t38, z: #t37){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t39 = a in let final core::int #t40 = self::t(1) in let final core::int #t41 = self::t(2) in let final core::int #t42 = self::t(3) in #t39.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t41, #t42, z: #t40){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  a.{self::A::bar}(self::t(1), self::t(2), z: self::t(3)){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t43 = a in let final core::int #t44 = self::t(1) in let final core::int #t45 = self::t(2) in #t43.{self::A::bar}(#t44, self::t(3), z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t46 = a in let final core::int #t47 = self::t(1) in #t46.{self::A::bar}(self::t(2), self::t(3), z: #t47){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  local(self::t(1), self::t(2), z: self::t(3)){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t48 = self::t(1) in let final core::int #t49 = self::t(2) in local(#t48, self::t(3), z: #t49){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t50 = self::t(1) in local(self::t(2), self::t(3), z: #t50){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t51 = self::t(1) in let final core::int #t52 = self::t(2) in self::E|method2(#t51, self::t(3), foo: #t52);
+  self::reset();
+  self::E|method2(self::t(1), self::t(2), foo: self::t(3));
+  self::reset();
+  let final core::int #t53 = self::t(1) in let final core::int #t54 = self::t(2) in self::E|method2(#t53, self::t(3), foo: #t54);
+  self::reset();
+  self::E|method2(self::t(1), self::t(2), foo: self::t(3));
+  self::reset();
+  let final core::int #t55 = self::t(1) in self::E|staticMethod2(self::t(2), foo: #t55);
+  self::reset();
+  self::E|staticMethod2(self::t(1), foo: self::t(2));
 }
-static method main() → dynamic {}
+static method main() → dynamic {
+  self::reset();
+  new self::Test::•().{self::Test::test}(){() → dynamic};
+  self::reset();
+  new self::Test::c1();
+  self::reset();
+  new self::Test::c2();
+  self::A a = new self::A::•(1.{core::int::unary-}(){() → core::int}, 1.{core::int::unary-}(){() → core::int}, z: 1.{core::int::unary-}(){() → core::int});
+  (core::int, core::int, {required z: core::int}) → Null f = (core::int x, core::int y, {required core::int z}) → Null {};
+  self::test(f, f, a);
+  self::E|method1(0);
+}
 
 constants  {
   #C1 = null
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.outline.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.outline.expect
index 6eb23d6..10cdf7b 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.outline.expect
@@ -16,25 +16,34 @@
 class Test extends self::A {
   constructor •() → self::Test
     ;
+  constructor c1() → self::Test
+    ;
+  constructor c2() → self::Test
+    ;
   method test() → dynamic
     ;
 }
-extension E on self::A {
+extension E on core::int {
   method method1 = self::E|method1;
   method tearoff method1 = self::E|get#method1;
   method method2 = self::E|method2;
   method tearoff method2 = self::E|get#method2;
   static method staticMethod2 = self::E|staticMethod2;
 }
+static field core::int counter;
+static method reset() → void
+  ;
+static method t(core::int value) → core::int
+  ;
 static method foo(core::int x, core::int y, {required core::int z}) → dynamic
   ;
-static extension-member method E|method1(lowered final self::A #this) → dynamic
+static extension-member method E|method1(lowered final core::int #this) → dynamic
   ;
-static extension-member method E|get#method1(lowered final self::A #this) → () → dynamic
+static extension-member method E|get#method1(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::E|method1(#this);
-static extension-member method E|method2(lowered final self::A #this, core::int bar, {core::int? foo}) → dynamic
+static extension-member method E|method2(lowered final core::int #this, core::int bar, {core::int? foo}) → dynamic
   ;
-static extension-member method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+static extension-member method E|get#method2(lowered final core::int #this) → (core::int, {foo: core::int?}) → dynamic
   return (core::int bar, {core::int? foo}) → dynamic => self::E|method2(#this, bar, foo: foo);
 static extension-member method E|staticMethod2(core::int bar, {core::int? foo}) → dynamic
   ;
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
index 0faca00..8a9e3d3 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
@@ -10,120 +10,153 @@
   static factory foo(core::int x, core::int y, {required core::int z}) → self::A
     return new self::A::•(x, y, z: z);
   get property() → (core::int, core::int, {required z: core::int}) → void
-    return throw 42;
+    return (core::int x, core::int y, {required core::int z}) → void {};
   method bar(core::int x, core::int y, {required core::int z}) → void {}
 }
 class Test extends self::A {
   constructor •() → self::Test
-    : super self::A::•(1, 2, z: 3)
+    : super self::A::•(self::t(1), self::t(2), z: self::t(3))
+    ;
+  constructor c1() → self::Test
+    : final core::int #t1 = self::t(1), final core::int #t2 = self::t(2), super self::A::•(#t1, self::t(3), z: #t2)
+    ;
+  constructor c2() → self::Test
+    : final core::int #t3 = self::t(1), super self::A::•(self::t(2), self::t(3), z: #t3)
     ;
   method test() → dynamic {
-    super.{self::A::bar}(1, 2, z: 3);
-    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
-    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+    self::reset();
+    super.{self::A::bar}(self::t(1), self::t(2), z: self::t(3));
+    self::reset();
+    let final core::int #t4 = self::t(1) in let final core::int #t5 = self::t(2) in super.{self::A::bar}(#t4, self::t(3), z: #t5);
+    self::reset();
+    let final core::int #t6 = self::t(1) in super.{self::A::bar}(self::t(2), self::t(3), z: #t6);
   }
 }
-extension E on self::A {
+extension E on core::int {
   method method1 = self::E|method1;
   method tearoff method1 = self::E|get#method1;
   method method2 = self::E|method2;
   method tearoff method2 = self::E|get#method2;
   static method staticMethod2 = self::E|staticMethod2;
 }
-static method foo(core::int x, core::int y, {required core::int z}) → dynamic {}
-static extension-member method E|method1(lowered final self::A #this) → dynamic {
-  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
-  let final core::int #t6 = 1 in self::E|staticMethod2(2, foo: #t6);
+static field core::int counter = 1;
+static method reset() → void {
+  self::counter = 1;
 }
-static extension-member method E|get#method1(lowered final self::A #this) → () → dynamic
+static method t(core::int value) → core::int {
+  if(!(self::counter =={core::num::==}{(core::Object) → core::bool} value)) {
+    throw "Expected ${self::counter}, actual ${value}";
+  }
+  self::counter = self::counter.{core::num::+}(1){(core::num) → core::int};
+  return value;
+}
+static method foo(core::int x, core::int y, {required core::int z}) → dynamic {}
+static extension-member method E|method1(lowered final core::int #this) → dynamic {
+  self::reset();
+  let final core::int #t7 = #this in let final core::int #t8 = self::t(1) in self::E|method2(#t7, self::t(2), foo: #t8);
+  self::reset();
+  let final core::int #t9 = self::t(1) in self::E|staticMethod2(self::t(2), foo: #t9);
+}
+static extension-member method E|get#method1(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::E|method1(#this);
-static extension-member method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
-static extension-member method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+static extension-member method E|method2(lowered final core::int #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static extension-member method E|get#method2(lowered final core::int #this) → (core::int, {foo: core::int?}) → dynamic
   return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
 static extension-member method E|staticMethod2(core::int bar, {core::int? foo = #C1}) → dynamic {}
 static method test(dynamic d, core::Function f, self::A a) → dynamic {
   function local(core::int x, core::int y, {required core::int z}) → void {}
-  self::foo(1, 2, z: 3);
-  let final core::int #t7 = 1 in let final core::int #t8 = 2 in self::foo(#t7, 3, z: #t8);
-  let final core::int #t9 = 1 in self::foo(2, 3, z: #t9);
-  self::A::foo(1, 2, z: 3);
-  let final core::int #t10 = 1 in let final core::int #t11 = 2 in self::A::foo(#t10, 3, z: #t11);
-  let final core::int #t12 = 1 in self::A::foo(2, 3, z: #t12);
-  self::A::foo(1, 2, z: 3);
-  let final core::int #t13 = 1 in let final core::int #t14 = 2 in self::A::foo(#t13, 3, z: #t14);
-  let final core::int #t15 = 1 in self::A::foo(2, 3, z: #t15);
-  new self::A::•(1, 2, z: 3);
-  let final core::int #t16 = 1 in let final core::int #t17 = 2 in new self::A::•(#t16, 3, z: #t17);
-  let final core::int #t18 = 1 in new self::A::•(2, 3, z: #t18);
-  new self::A::•(1, 2, z: 3);
-  let final core::int #t19 = 1 in let final core::int #t20 = 2 in new self::A::•(#t19, 3, z: #t20);
-  let final core::int #t21 = 1 in new self::A::•(2, 3, z: #t21);
-  d{dynamic}(1, 2, z: 3);
-  let final core::int #t22 = 1 in let final core::int #t23 = 2 in d{dynamic}(#t22, 3, z: #t23);
-  let final core::int #t24 = 1 in d{dynamic}(2, 3, z: #t24);
-  f(1, 2, z: 3);
-  let final core::int #t25 = 1 in let final core::int #t26 = 2 in f(#t25, 3, z: #t26);
-  let final core::int #t27 = 1 in f(2, 3, z: #t27);
-  let final self::A #t28 = a in let final core::int #t29 = 1 in let final core::int #t30 = 2 in let final core::int #t31 = 3 in #t28.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t29, #t30, z: #t31){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t32 = a in let final core::int #t33 = 1 in let final core::int #t34 = 2 in let final core::int #t35 = 3 in #t32.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t33, #t35, z: #t34){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t36 = a in let final core::int #t37 = 1 in let final core::int #t38 = 2 in let final core::int #t39 = 3 in #t36.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t38, #t39, z: #t37){(core::int, core::int, {required z: core::int}) → void};
-  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t40 = a in let final core::int #t41 = 1 in let final core::int #t42 = 2 in #t40.{self::A::bar}(#t41, 3, z: #t42){(core::int, core::int, {required z: core::int}) → void};
-  let final self::A #t43 = a in let final core::int #t44 = 1 in #t43.{self::A::bar}(2, 3, z: #t44){(core::int, core::int, {required z: core::int}) → void};
-  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
-  let final core::int #t45 = 1 in let final core::int #t46 = 2 in local(#t45, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
-  let final core::int #t47 = 1 in local(2, 3, z: #t47){(core::int, core::int, {required z: core::int}) → void};
-  self::E|method2(a, 2, foo: 1);
-  self::E|method2(a, 2, foo: 1);
-  let final core::int #t48 = 1 in self::E|staticMethod2(2, foo: #t48);
+  self::reset();
+  self::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t10 = self::t(1) in let final core::int #t11 = self::t(2) in self::foo(#t10, self::t(3), z: #t11);
+  self::reset();
+  let final core::int #t12 = self::t(1) in self::foo(self::t(2), self::t(3), z: #t12);
+  self::reset();
+  self::A::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t13 = self::t(1) in let final core::int #t14 = self::t(2) in self::A::foo(#t13, self::t(3), z: #t14);
+  self::reset();
+  let final core::int #t15 = self::t(1) in self::A::foo(self::t(2), self::t(3), z: #t15);
+  self::reset();
+  self::A::foo(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t16 = self::t(1) in let final core::int #t17 = self::t(2) in self::A::foo(#t16, self::t(3), z: #t17);
+  self::reset();
+  let final core::int #t18 = self::t(1) in self::A::foo(self::t(2), self::t(3), z: #t18);
+  self::reset();
+  new self::A::•(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t19 = self::t(1) in let final core::int #t20 = self::t(2) in new self::A::•(#t19, self::t(3), z: #t20);
+  self::reset();
+  let final core::int #t21 = self::t(1) in new self::A::•(self::t(2), self::t(3), z: #t21);
+  self::reset();
+  new self::A::•(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t22 = self::t(1) in let final core::int #t23 = self::t(2) in new self::A::•(#t22, self::t(3), z: #t23);
+  self::reset();
+  let final core::int #t24 = self::t(1) in new self::A::•(self::t(2), self::t(3), z: #t24);
+  self::reset();
+  d{dynamic}(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t25 = self::t(1) in let final core::int #t26 = self::t(2) in d{dynamic}(#t25, self::t(3), z: #t26);
+  self::reset();
+  let final core::int #t27 = self::t(1) in d{dynamic}(self::t(2), self::t(3), z: #t27);
+  self::reset();
+  f(self::t(1), self::t(2), z: self::t(3));
+  self::reset();
+  let final core::int #t28 = self::t(1) in let final core::int #t29 = self::t(2) in f(#t28, self::t(3), z: #t29);
+  self::reset();
+  let final core::int #t30 = self::t(1) in f(self::t(2), self::t(3), z: #t30);
+  self::reset();
+  let final self::A #t31 = a in let final core::int #t32 = self::t(1) in let final core::int #t33 = self::t(2) in let final core::int #t34 = self::t(3) in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t33, z: #t34){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t35 = a in let final core::int #t36 = self::t(1) in let final core::int #t37 = self::t(2) in let final core::int #t38 = self::t(3) in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t36, #t38, z: #t37){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t39 = a in let final core::int #t40 = self::t(1) in let final core::int #t41 = self::t(2) in let final core::int #t42 = self::t(3) in #t39.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t41, #t42, z: #t40){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  a.{self::A::bar}(self::t(1), self::t(2), z: self::t(3)){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t43 = a in let final core::int #t44 = self::t(1) in let final core::int #t45 = self::t(2) in #t43.{self::A::bar}(#t44, self::t(3), z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final self::A #t46 = a in let final core::int #t47 = self::t(1) in #t46.{self::A::bar}(self::t(2), self::t(3), z: #t47){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  local(self::t(1), self::t(2), z: self::t(3)){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t48 = self::t(1) in let final core::int #t49 = self::t(2) in local(#t48, self::t(3), z: #t49){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t50 = self::t(1) in local(self::t(2), self::t(3), z: #t50){(core::int, core::int, {required z: core::int}) → void};
+  self::reset();
+  let final core::int #t51 = self::t(1) in let final core::int #t52 = self::t(2) in self::E|method2(#t51, self::t(3), foo: #t52);
+  self::reset();
+  self::E|method2(self::t(1), self::t(2), foo: self::t(3));
+  self::reset();
+  let final core::int #t53 = self::t(1) in let final core::int #t54 = self::t(2) in self::E|method2(#t53, self::t(3), foo: #t54);
+  self::reset();
+  self::E|method2(self::t(1), self::t(2), foo: self::t(3));
+  self::reset();
+  let final core::int #t55 = self::t(1) in self::E|staticMethod2(self::t(2), foo: #t55);
+  self::reset();
+  self::E|staticMethod2(self::t(1), foo: self::t(2));
 }
-static method main() → dynamic {}
+static method main() → dynamic {
+  self::reset();
+  new self::Test::•().{self::Test::test}(){() → dynamic};
+  self::reset();
+  new self::Test::c1();
+  self::reset();
+  new self::Test::c2();
+  self::A a = new self::A::•(1.{core::int::unary-}(){() → core::int}, 1.{core::int::unary-}(){() → core::int}, z: 1.{core::int::unary-}(){() → core::int});
+  (core::int, core::int, {required z: core::int}) → Null f = (core::int x, core::int y, {required core::int z}) → Null {};
+  self::test(f, f, a);
+  self::E|method1(0);
+}
 
 constants  {
   #C1 = null
 }
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:93:15 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:93:21 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:94:18 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:21:18 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:22:24 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:34:7 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:34:13 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:35:10 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:39:13 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:39:19 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:40:16 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:42:13 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:42:19 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:43:16 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:47:9 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:47:15 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:48:12 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:50:9 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:50:15 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:51:12 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:55:5 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:55:11 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:56:8 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:60:5 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:60:11 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:61:8 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:64:14 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:64:17 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:64:23 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:65:14 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:65:23 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:65:20 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:66:20 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:66:23 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:66:17 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:70:9 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:70:15 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:71:12 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:75:9 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:75:15 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:76:12 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:85:24 -> IntConstant(1)
-Extra constant evaluation: evaluated: 165, effectively constant: 42
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///all_kinds.dart:170:13 -> IntConstant(-1)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///all_kinds.dart:170:17 -> IntConstant(-1)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///all_kinds.dart:170:24 -> IntConstant(-1)
+Extra constant evaluation: evaluated: 376, effectively constant: 3
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
index 7d574bb..722b373 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
@@ -1,7 +1,14 @@
+int counter = 1;
+
+void reset() {}
+
+int t(int value) {}
+
 class A {
   A(int x, int y, {required int z});
   factory A.foo(int x, int y, {required int z}) => new A(x, y, z: z);
-  void Function(int x, int y, {required int z}) get property => throw 42;
+  void Function(int x, int y, {required int z}) get property =>
+      (int x, int y, {required int z}) {};
   void bar(int x, int y, {required int z}) {}
 }
 
@@ -9,7 +16,7 @@
 
 foo(int x, int y, {required int z}) {}
 
-extension E on A {
+extension E on int {
   method1() {}
   method2(int bar, {int? foo}) {}
   static staticMethod2(int bar, {int? foo}) {}
@@ -18,7 +25,9 @@
 test(dynamic d, Function f, A a) {}
 
 class Test extends A {
-  Test() : super(1, 2, z: 3);
+  Test() : super(t(1), t(2), z: t(3));
+  Test.c1() : super(t(1), z: t(2), t(3));
+  Test.c2() : super(z: t(1), t(2), t(3));
   test() {}
 }
 
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
index 7c3fe4d..ca63c24 100644
--- a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
@@ -1,16 +1,19 @@
 class A {
   A(int x, int y, {required int z});
   factory A.foo(int x, int y, {required int z}) => new A(x, y, z: z);
-  void Function(int x, int y, {required int z}) get property => throw 42;
+  void Function(int x, int y, {required int z}) get property =>
+      (int x, int y, {required int z}) {};
   void bar(int x, int y, {required int z}) {}
 }
 
 class Test extends A {
-  Test() : super(1, 2, z: 3);
+  Test() : super(t(1), t(2), z: t(3));
+  Test.c1() : super(t(1), z: t(2), t(3));
+  Test.c2() : super(z: t(1), t(2), t(3));
   test() {}
 }
 
-extension E on A {
+extension E on int {
   method1() {}
   method2(int bar, {int? foo}) {}
   static staticMethod2(int bar, {int? foo}) {}
@@ -18,8 +21,14 @@
 
 foo(int x, int y, {required int z}) {}
 
+int counter = 1;
+
+int t(int value) {}
+
 main() {}
 
 test(dynamic d, Function f, A a) {}
 
 typedef B = A;
+
+void reset() {}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
index 5f79cd0..0a3e160 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
@@ -213,7 +213,7 @@
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
   let final self::Class1? #t168 = n1 in #t168 == null ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169 == null ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t169 = n1 in #t169 == null ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
   let final self::Class1? #t170 = n1 in #t170 == null ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
   let final self::Class1? #t172 = n1 in #t172 == null ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
   let final self::Class1? #t173 = n1 in #t173 == null ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
@@ -274,18 +274,18 @@
   let final self::Class2? #t331 = n2 in #t331 == null ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
   nullable2 = let final self::Class2? #t333 = n2 in #t333 == null ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
   let final self::Class2? #t337 = n2 in #t337 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
-  let final self::Class2? #t343 = n2 in #t343 == null ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
-  nullable2 = let final self::Class2? #t346 = n2 in #t346 == null ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final void #t340 = self::Extension2|set#nonNullable2(#t338{self::Class2}, self::Extension2|+(#t339, 1)) in #t339;
+  let final self::Class2? #t341 = n2 in #t341 == null ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341{self::Class2}, #t342) in #t342;
+  nullable2 = let final self::Class2? #t344 = n2 in #t344 == null ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344{self::Class2}), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344{self::Class2}, #t345) in #t345;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t349 = n1 in #t349 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t349{self::Class1}) == null ?{self::Class1?} self::Extension1|set#nullable1(#t349{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t350 = n1 in #t350 == null ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350{self::Class1}) in #t351 == null ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350{self::Class1}, #t352) in #t352 : #t351{self::Class1};
-  let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355) == null ?{self::Class1?} self::Extension1|set#nullable1(#t355, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t356 = n1 in #t356 == null ?{self::Class1?} null : let final self::Class1 #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357) in #t358 == null ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357, #t359) in #t359 : #t358{self::Class1};
-  let final self::Class1? #t361 = n1 in #t361 == null ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363) == null ?{self::Class1?} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t364 = n1 in #t364 == null ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367 == null ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+  let final self::Class1? #t347 = n1 in #t347 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t347{self::Class1}) == null ?{self::Class1?} self::Extension1|set#nullable1(#t347{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t348 = n1 in #t348 == null ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348{self::Class1}) in #t349 == null ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348{self::Class1}, #t350) in #t350 : #t349{self::Class1};
+  let final self::Class1? #t352 = n1 in #t352 == null ?{self::Class1?} null : let final self::Class1 #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353) == null ?{self::Class1?} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355) in #t356 == null ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355, #t357) in #t357 : #t356{self::Class1};
+  let final self::Class1? #t359 = n1 in #t359 == null ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361) == null ?{self::Class1?} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t362 = n1 in #t362 == null ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365 == null ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect
index 5f79cd0..0a3e160 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect
@@ -213,7 +213,7 @@
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
   let final self::Class1? #t168 = n1 in #t168 == null ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169 == null ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t169 = n1 in #t169 == null ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
   let final self::Class1? #t170 = n1 in #t170 == null ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
   let final self::Class1? #t172 = n1 in #t172 == null ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
   let final self::Class1? #t173 = n1 in #t173 == null ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
@@ -274,18 +274,18 @@
   let final self::Class2? #t331 = n2 in #t331 == null ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
   nullable2 = let final self::Class2? #t333 = n2 in #t333 == null ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
   let final self::Class2? #t337 = n2 in #t337 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
-  let final self::Class2? #t343 = n2 in #t343 == null ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
-  nullable2 = let final self::Class2? #t346 = n2 in #t346 == null ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final void #t340 = self::Extension2|set#nonNullable2(#t338{self::Class2}, self::Extension2|+(#t339, 1)) in #t339;
+  let final self::Class2? #t341 = n2 in #t341 == null ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341{self::Class2}, #t342) in #t342;
+  nullable2 = let final self::Class2? #t344 = n2 in #t344 == null ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344{self::Class2}), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344{self::Class2}, #t345) in #t345;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t349 = n1 in #t349 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t349{self::Class1}) == null ?{self::Class1?} self::Extension1|set#nullable1(#t349{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t350 = n1 in #t350 == null ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350{self::Class1}) in #t351 == null ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350{self::Class1}, #t352) in #t352 : #t351{self::Class1};
-  let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355) == null ?{self::Class1?} self::Extension1|set#nullable1(#t355, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t356 = n1 in #t356 == null ?{self::Class1?} null : let final self::Class1 #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357) in #t358 == null ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357, #t359) in #t359 : #t358{self::Class1};
-  let final self::Class1? #t361 = n1 in #t361 == null ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363) == null ?{self::Class1?} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t364 = n1 in #t364 == null ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367 == null ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+  let final self::Class1? #t347 = n1 in #t347 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t347{self::Class1}) == null ?{self::Class1?} self::Extension1|set#nullable1(#t347{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t348 = n1 in #t348 == null ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348{self::Class1}) in #t349 == null ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348{self::Class1}, #t350) in #t350 : #t349{self::Class1};
+  let final self::Class1? #t352 = n1 in #t352 == null ?{self::Class1?} null : let final self::Class1 #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353) == null ?{self::Class1?} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355) in #t356 == null ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355, #t357) in #t357 : #t356{self::Class1};
+  let final self::Class1? #t359 = n1 in #t359 == null ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361) == null ?{self::Class1?} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t362 = n1 in #t362 == null ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365 == null ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
index 5f79cd0..0a3e160 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
@@ -213,7 +213,7 @@
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
   let final self::Class1? #t168 = n1 in #t168 == null ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169 == null ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t169 = n1 in #t169 == null ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
   let final self::Class1? #t170 = n1 in #t170 == null ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
   let final self::Class1? #t172 = n1 in #t172 == null ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
   let final self::Class1? #t173 = n1 in #t173 == null ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
@@ -274,18 +274,18 @@
   let final self::Class2? #t331 = n2 in #t331 == null ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
   nullable2 = let final self::Class2? #t333 = n2 in #t333 == null ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
   let final self::Class2? #t337 = n2 in #t337 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
-  let final self::Class2? #t343 = n2 in #t343 == null ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
-  nullable2 = let final self::Class2? #t346 = n2 in #t346 == null ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final void #t340 = self::Extension2|set#nonNullable2(#t338{self::Class2}, self::Extension2|+(#t339, 1)) in #t339;
+  let final self::Class2? #t341 = n2 in #t341 == null ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341{self::Class2}, #t342) in #t342;
+  nullable2 = let final self::Class2? #t344 = n2 in #t344 == null ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344{self::Class2}), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344{self::Class2}, #t345) in #t345;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t349 = n1 in #t349 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t349{self::Class1}) == null ?{self::Class1?} self::Extension1|set#nullable1(#t349{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t350 = n1 in #t350 == null ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350{self::Class1}) in #t351 == null ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350{self::Class1}, #t352) in #t352 : #t351{self::Class1};
-  let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355) == null ?{self::Class1?} self::Extension1|set#nullable1(#t355, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t356 = n1 in #t356 == null ?{self::Class1?} null : let final self::Class1 #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357) in #t358 == null ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357, #t359) in #t359 : #t358{self::Class1};
-  let final self::Class1? #t361 = n1 in #t361 == null ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363) == null ?{self::Class1?} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t364 = n1 in #t364 == null ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367 == null ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+  let final self::Class1? #t347 = n1 in #t347 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t347{self::Class1}) == null ?{self::Class1?} self::Extension1|set#nullable1(#t347{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t348 = n1 in #t348 == null ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348{self::Class1}) in #t349 == null ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348{self::Class1}, #t350) in #t350 : #t349{self::Class1};
+  let final self::Class1? #t352 = n1 in #t352 == null ?{self::Class1?} null : let final self::Class1 #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353) == null ?{self::Class1?} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355) in #t356 == null ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355, #t357) in #t357 : #t356{self::Class1};
+  let final self::Class1? #t359 = n1 in #t359 == null ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361) == null ?{self::Class1?} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t362 = n1 in #t362 == null ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365 == null ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.expect
index 71c3da5..ebef845 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.expect
@@ -49,8 +49,8 @@
   let final self::Class2? #t31 = c2 in #t31 == null ?{core::int?} null : let final core::int #t32 = 0 in self::Extension|[](#t31{self::Class2}, #t32) == null ?{core::int?} self::Extension|[]=(#t31{self::Class2}, #t32, 1) : null;
   let final self::Class2? #t33 = c2 in #t33 == null ?{core::int?} null : let final core::int #t34 = 0 in self::Extension|[](#t33{self::Class2}, #t34) == null ?{core::int?} self::Extension|[]=(#t33{self::Class2}, #t34, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 1)){(core::num) → core::int}) : null;
   let final self::Class2? #t35 = c2 in #t35 == null ?{core::int?} null : self::Extension|[](#t35{self::Class2}, 0);
-  let final self::Class2? #t36 = c2 in #t36 == null ?{void} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
-  let final self::Class2? #t37 = c2 in #t37 == null ?{void} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
+  let final self::Class2? #t36 = c2 in #t36 == null ?{core::int?} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
+  let final self::Class2? #t37 = c2 in #t37 == null ?{core::int?} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
   let final self::Class2? #t38 = c2 in #t38 == null ?{core::int?} null : let final core::int #t39 = 0 in self::Extension|[]=(#t38{self::Class2}, #t39, self::Extension|[](#t38{self::Class2}, #t39).{core::num::+}(1){(core::num) → core::int});
   let final self::Class2? #t40 = c2 in #t40 == null ?{core::int?} null : let final core::int #t41 = 0 in self::Extension|[]=(#t40{self::Class2}, #t41, self::Extension|[](#t40{self::Class2}, #t41).{core::num::+}(1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int}){(core::num) → core::int});
   let final self::Class2? #t42 = c2 in #t42 == null ?{core::int?} null : let final core::int #t43 = 0 in let final core::int #t44 = self::Extension|[](#t42{self::Class2}, #t43).{core::num::+}(1){(core::num) → core::int} in let final void #t45 = self::Extension|[]=(#t42{self::Class2}, #t43, #t44) in #t44;
@@ -66,13 +66,13 @@
   let final self::Class1? #t69 = c1 in #t69 == null ?{core::int?} null : let final self::Class2? #t70 = #t69{self::Class1}.{self::Class1::field}{self::Class2?} in #t70 == null ?{core::int?} null : let final core::int #t71 = 0 in self::Extension|[]=(#t70{self::Class2}, #t71, self::Extension|[](#t70{self::Class2}, #t71).{core::num::+}(1){(core::num) → core::int});
   let final self::Class1? #t72 = c1 in #t72 == null ?{core::int?} null : let final self::Class2? #t73 = #t72{self::Class1}.{self::Class1::field}{self::Class2?} in #t73 == null ?{core::int?} null : let final core::int #t74 = 0 in self::Extension|[](#t73{self::Class2}, #t74) == null ?{core::int?} self::Extension|[]=(#t73{self::Class2}, #t74, 1) : null;
   let final self::Class1? #t75 = c1 in #t75 == null ?{core::int?} null : let final self::Class2? #t76 = #t75{self::Class1}.{self::Class1::field}{self::Class2?} in #t76 == null ?{core::int?} null : let final core::int #t77 = 0 in self::Extension|[](#t76{self::Class2}, #t77) == null ?{core::int?} self::Extension|[]=(#t76{self::Class2}, #t77, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(1){(core::int) → core::int}){(core::num) → core::int}) : null;
-  let final self::Class1? #t78 = c1 in #t78 == null ?{core::int?} null : let final self::Class2? #t79 = #t78{self::Class1}.{self::Class1::field}{self::Class2?} in #t79 == null ?{core::int?} null : self::Extension|[](#t79{self::Class2}, 0);
-  let final self::Class1? #t80 = c1 in #t80 == null ?{void} null : let final self::Class2? #t81 = #t80{self::Class1}.{self::Class1::field}{self::Class2?} in #t81 == null ?{void} null : self::Extension|[]=(#t81{self::Class2}, 0, 1);
-  let final self::Class1? #t82 = c1 in #t82 == null ?{void} null : let final self::Class2? #t83 = #t82{self::Class1}.{self::Class1::field}{self::Class2?} in #t83 == null ?{void} null : self::Extension|[]=(#t83{self::Class2}, 0, 1.{core::num::+}((let final self::Class2? #t84 = c2 in #t84 == null ?{core::int?} null : self::Extension|[](#t84{self::Class2}, 0)!) as core::int){(core::num) → core::int});
-  let final self::Class1? #t85 = c1 in #t85 == null ?{core::int?} null : let final self::Class2? #t86 = #t85{self::Class1}.{self::Class1::field}{self::Class2?} in #t86 == null ?{core::int?} null : let final core::int #t87 = 0 in self::Extension|[]=(#t86{self::Class2}, #t87, self::Extension|[](#t86{self::Class2}, #t87).{core::num::+}(1){(core::num) → core::int});
-  let final self::Class1? #t88 = c1 in #t88 == null ?{core::int?} null : let final self::Class2? #t89 = #t88{self::Class1}.{self::Class1::field}{self::Class2?} in #t89 == null ?{core::int?} null : let final core::int #t90 = 0 in self::Extension|[]=(#t89{self::Class2}, #t90, self::Extension|[](#t89{self::Class2}, #t90).{core::num::+}(1.{core::num::+}((let final self::Class2? #t91 = c2 in #t91 == null ?{core::int?} null : self::Extension|[](#t91{self::Class2}, 0)!) as core::int){(core::num) → core::int}){(core::num) → core::int});
-  let final self::Class1? #t92 = c1 in #t92 == null ?{core::int?} null : let final self::Class2? #t93 = #t92{self::Class1}.{self::Class1::field}{self::Class2?} in #t93 == null ?{core::int?} null : let final core::int #t94 = 0 in let final core::int #t95 = self::Extension|[](#t93{self::Class2}, #t94).{core::num::+}(1){(core::num) → core::int} in let final void #t96 = self::Extension|[]=(#t93{self::Class2}, #t94, #t95) in #t95;
-  let final self::Class1? #t97 = c1 in #t97 == null ?{core::int?} null : let final self::Class2? #t98 = #t97{self::Class1}.{self::Class1::field}{self::Class2?} in #t98 == null ?{core::int?} null : let final core::int #t99 = 0 in self::Extension|[]=(#t98{self::Class2}, #t99, self::Extension|[](#t98{self::Class2}, #t99).{core::num::+}(1){(core::num) → core::int});
-  let final self::Class1? #t100 = c1 in #t100 == null ?{core::int?} null : let final self::Class2? #t101 = #t100{self::Class1}.{self::Class1::field}{self::Class2?} in #t101 == null ?{core::int?} null : let final core::int #t102 = 0 in self::Extension|[](#t101{self::Class2}, #t102) == null ?{core::int?} self::Extension|[]=(#t101{self::Class2}, #t102, 1) : null;
-  let final self::Class1? #t103 = c1 in #t103 == null ?{core::int?} null : let final self::Class2? #t104 = #t103{self::Class1}.{self::Class1::field}{self::Class2?} in #t104 == null ?{core::int?} null : let final core::int #t105 = 0 in self::Extension|[](#t104{self::Class2}, #t105) == null ?{core::int?} self::Extension|[]=(#t104{self::Class2}, #t105, 1.{core::num::+}((let final self::Class2? #t106 = c2 in #t106 == null ?{core::int?} null : self::Extension|[](#t106{self::Class2}, 1)!) as core::int){(core::num) → core::int}) : null;
+  let final self::Class2? #t78 = let final self::Class1? #t79 = c1 in #t79 == null ?{self::Class2?} null : #t79{self::Class1}.{self::Class1::field}{self::Class2?} in #t78 == null ?{core::int?} null : self::Extension|[](#t78{self::Class2}, 0);
+  let final self::Class2? #t80 = let final self::Class1? #t81 = c1 in #t81 == null ?{self::Class2?} null : #t81{self::Class1}.{self::Class1::field}{self::Class2?} in #t80 == null ?{core::int?} null : self::Extension|[]=(#t80{self::Class2}, 0, 1);
+  let final self::Class2? #t82 = let final self::Class1? #t83 = c1 in #t83 == null ?{self::Class2?} null : #t83{self::Class1}.{self::Class1::field}{self::Class2?} in #t82 == null ?{core::int?} null : self::Extension|[]=(#t82{self::Class2}, 0, 1.{core::num::+}((let final self::Class2? #t84 = c2 in #t84 == null ?{core::int?} null : self::Extension|[](#t84{self::Class2}, 0)!) as core::int){(core::num) → core::int});
+  let final self::Class2? #t85 = let final self::Class1? #t86 = c1 in #t86 == null ?{self::Class2?} null : #t86{self::Class1}.{self::Class1::field}{self::Class2?} in #t85 == null ?{core::int?} null : let final core::int #t87 = 0 in self::Extension|[]=(#t85{self::Class2}, #t87, self::Extension|[](#t85{self::Class2}, #t87).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t88 = let final self::Class1? #t89 = c1 in #t89 == null ?{self::Class2?} null : #t89{self::Class1}.{self::Class1::field}{self::Class2?} in #t88 == null ?{core::int?} null : let final core::int #t90 = 0 in self::Extension|[]=(#t88{self::Class2}, #t90, self::Extension|[](#t88{self::Class2}, #t90).{core::num::+}(1.{core::num::+}((let final self::Class2? #t91 = c2 in #t91 == null ?{core::int?} null : self::Extension|[](#t91{self::Class2}, 0)!) as core::int){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class2? #t92 = let final self::Class1? #t93 = c1 in #t93 == null ?{self::Class2?} null : #t93{self::Class1}.{self::Class1::field}{self::Class2?} in #t92 == null ?{core::int?} null : let final core::int #t94 = 0 in let final core::int #t95 = self::Extension|[](#t92{self::Class2}, #t94).{core::num::+}(1){(core::num) → core::int} in let final void #t96 = self::Extension|[]=(#t92{self::Class2}, #t94, #t95) in #t95;
+  let final self::Class2? #t97 = let final self::Class1? #t98 = c1 in #t98 == null ?{self::Class2?} null : #t98{self::Class1}.{self::Class1::field}{self::Class2?} in #t97 == null ?{core::int?} null : let final core::int #t99 = 0 in self::Extension|[]=(#t97{self::Class2}, #t99, self::Extension|[](#t97{self::Class2}, #t99).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t100 = let final self::Class1? #t101 = c1 in #t101 == null ?{self::Class2?} null : #t101{self::Class1}.{self::Class1::field}{self::Class2?} in #t100 == null ?{core::int?} null : let final core::int #t102 = 0 in self::Extension|[](#t100{self::Class2}, #t102) == null ?{core::int?} self::Extension|[]=(#t100{self::Class2}, #t102, 1) : null;
+  let final self::Class2? #t103 = let final self::Class1? #t104 = c1 in #t104 == null ?{self::Class2?} null : #t104{self::Class1}.{self::Class1::field}{self::Class2?} in #t103 == null ?{core::int?} null : let final core::int #t105 = 0 in self::Extension|[](#t103{self::Class2}, #t105) == null ?{core::int?} self::Extension|[]=(#t103{self::Class2}, #t105, 1.{core::num::+}((let final self::Class2? #t106 = c2 in #t106 == null ?{core::int?} null : self::Extension|[](#t106{self::Class2}, 1)!) as core::int){(core::num) → core::int}) : null;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.modular.expect
index 71c3da5..ebef845 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.modular.expect
@@ -49,8 +49,8 @@
   let final self::Class2? #t31 = c2 in #t31 == null ?{core::int?} null : let final core::int #t32 = 0 in self::Extension|[](#t31{self::Class2}, #t32) == null ?{core::int?} self::Extension|[]=(#t31{self::Class2}, #t32, 1) : null;
   let final self::Class2? #t33 = c2 in #t33 == null ?{core::int?} null : let final core::int #t34 = 0 in self::Extension|[](#t33{self::Class2}, #t34) == null ?{core::int?} self::Extension|[]=(#t33{self::Class2}, #t34, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 1)){(core::num) → core::int}) : null;
   let final self::Class2? #t35 = c2 in #t35 == null ?{core::int?} null : self::Extension|[](#t35{self::Class2}, 0);
-  let final self::Class2? #t36 = c2 in #t36 == null ?{void} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
-  let final self::Class2? #t37 = c2 in #t37 == null ?{void} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
+  let final self::Class2? #t36 = c2 in #t36 == null ?{core::int?} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
+  let final self::Class2? #t37 = c2 in #t37 == null ?{core::int?} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
   let final self::Class2? #t38 = c2 in #t38 == null ?{core::int?} null : let final core::int #t39 = 0 in self::Extension|[]=(#t38{self::Class2}, #t39, self::Extension|[](#t38{self::Class2}, #t39).{core::num::+}(1){(core::num) → core::int});
   let final self::Class2? #t40 = c2 in #t40 == null ?{core::int?} null : let final core::int #t41 = 0 in self::Extension|[]=(#t40{self::Class2}, #t41, self::Extension|[](#t40{self::Class2}, #t41).{core::num::+}(1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int}){(core::num) → core::int});
   let final self::Class2? #t42 = c2 in #t42 == null ?{core::int?} null : let final core::int #t43 = 0 in let final core::int #t44 = self::Extension|[](#t42{self::Class2}, #t43).{core::num::+}(1){(core::num) → core::int} in let final void #t45 = self::Extension|[]=(#t42{self::Class2}, #t43, #t44) in #t44;
@@ -66,13 +66,13 @@
   let final self::Class1? #t69 = c1 in #t69 == null ?{core::int?} null : let final self::Class2? #t70 = #t69{self::Class1}.{self::Class1::field}{self::Class2?} in #t70 == null ?{core::int?} null : let final core::int #t71 = 0 in self::Extension|[]=(#t70{self::Class2}, #t71, self::Extension|[](#t70{self::Class2}, #t71).{core::num::+}(1){(core::num) → core::int});
   let final self::Class1? #t72 = c1 in #t72 == null ?{core::int?} null : let final self::Class2? #t73 = #t72{self::Class1}.{self::Class1::field}{self::Class2?} in #t73 == null ?{core::int?} null : let final core::int #t74 = 0 in self::Extension|[](#t73{self::Class2}, #t74) == null ?{core::int?} self::Extension|[]=(#t73{self::Class2}, #t74, 1) : null;
   let final self::Class1? #t75 = c1 in #t75 == null ?{core::int?} null : let final self::Class2? #t76 = #t75{self::Class1}.{self::Class1::field}{self::Class2?} in #t76 == null ?{core::int?} null : let final core::int #t77 = 0 in self::Extension|[](#t76{self::Class2}, #t77) == null ?{core::int?} self::Extension|[]=(#t76{self::Class2}, #t77, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(1){(core::int) → core::int}){(core::num) → core::int}) : null;
-  let final self::Class1? #t78 = c1 in #t78 == null ?{core::int?} null : let final self::Class2? #t79 = #t78{self::Class1}.{self::Class1::field}{self::Class2?} in #t79 == null ?{core::int?} null : self::Extension|[](#t79{self::Class2}, 0);
-  let final self::Class1? #t80 = c1 in #t80 == null ?{void} null : let final self::Class2? #t81 = #t80{self::Class1}.{self::Class1::field}{self::Class2?} in #t81 == null ?{void} null : self::Extension|[]=(#t81{self::Class2}, 0, 1);
-  let final self::Class1? #t82 = c1 in #t82 == null ?{void} null : let final self::Class2? #t83 = #t82{self::Class1}.{self::Class1::field}{self::Class2?} in #t83 == null ?{void} null : self::Extension|[]=(#t83{self::Class2}, 0, 1.{core::num::+}((let final self::Class2? #t84 = c2 in #t84 == null ?{core::int?} null : self::Extension|[](#t84{self::Class2}, 0)!) as core::int){(core::num) → core::int});
-  let final self::Class1? #t85 = c1 in #t85 == null ?{core::int?} null : let final self::Class2? #t86 = #t85{self::Class1}.{self::Class1::field}{self::Class2?} in #t86 == null ?{core::int?} null : let final core::int #t87 = 0 in self::Extension|[]=(#t86{self::Class2}, #t87, self::Extension|[](#t86{self::Class2}, #t87).{core::num::+}(1){(core::num) → core::int});
-  let final self::Class1? #t88 = c1 in #t88 == null ?{core::int?} null : let final self::Class2? #t89 = #t88{self::Class1}.{self::Class1::field}{self::Class2?} in #t89 == null ?{core::int?} null : let final core::int #t90 = 0 in self::Extension|[]=(#t89{self::Class2}, #t90, self::Extension|[](#t89{self::Class2}, #t90).{core::num::+}(1.{core::num::+}((let final self::Class2? #t91 = c2 in #t91 == null ?{core::int?} null : self::Extension|[](#t91{self::Class2}, 0)!) as core::int){(core::num) → core::int}){(core::num) → core::int});
-  let final self::Class1? #t92 = c1 in #t92 == null ?{core::int?} null : let final self::Class2? #t93 = #t92{self::Class1}.{self::Class1::field}{self::Class2?} in #t93 == null ?{core::int?} null : let final core::int #t94 = 0 in let final core::int #t95 = self::Extension|[](#t93{self::Class2}, #t94).{core::num::+}(1){(core::num) → core::int} in let final void #t96 = self::Extension|[]=(#t93{self::Class2}, #t94, #t95) in #t95;
-  let final self::Class1? #t97 = c1 in #t97 == null ?{core::int?} null : let final self::Class2? #t98 = #t97{self::Class1}.{self::Class1::field}{self::Class2?} in #t98 == null ?{core::int?} null : let final core::int #t99 = 0 in self::Extension|[]=(#t98{self::Class2}, #t99, self::Extension|[](#t98{self::Class2}, #t99).{core::num::+}(1){(core::num) → core::int});
-  let final self::Class1? #t100 = c1 in #t100 == null ?{core::int?} null : let final self::Class2? #t101 = #t100{self::Class1}.{self::Class1::field}{self::Class2?} in #t101 == null ?{core::int?} null : let final core::int #t102 = 0 in self::Extension|[](#t101{self::Class2}, #t102) == null ?{core::int?} self::Extension|[]=(#t101{self::Class2}, #t102, 1) : null;
-  let final self::Class1? #t103 = c1 in #t103 == null ?{core::int?} null : let final self::Class2? #t104 = #t103{self::Class1}.{self::Class1::field}{self::Class2?} in #t104 == null ?{core::int?} null : let final core::int #t105 = 0 in self::Extension|[](#t104{self::Class2}, #t105) == null ?{core::int?} self::Extension|[]=(#t104{self::Class2}, #t105, 1.{core::num::+}((let final self::Class2? #t106 = c2 in #t106 == null ?{core::int?} null : self::Extension|[](#t106{self::Class2}, 1)!) as core::int){(core::num) → core::int}) : null;
+  let final self::Class2? #t78 = let final self::Class1? #t79 = c1 in #t79 == null ?{self::Class2?} null : #t79{self::Class1}.{self::Class1::field}{self::Class2?} in #t78 == null ?{core::int?} null : self::Extension|[](#t78{self::Class2}, 0);
+  let final self::Class2? #t80 = let final self::Class1? #t81 = c1 in #t81 == null ?{self::Class2?} null : #t81{self::Class1}.{self::Class1::field}{self::Class2?} in #t80 == null ?{core::int?} null : self::Extension|[]=(#t80{self::Class2}, 0, 1);
+  let final self::Class2? #t82 = let final self::Class1? #t83 = c1 in #t83 == null ?{self::Class2?} null : #t83{self::Class1}.{self::Class1::field}{self::Class2?} in #t82 == null ?{core::int?} null : self::Extension|[]=(#t82{self::Class2}, 0, 1.{core::num::+}((let final self::Class2? #t84 = c2 in #t84 == null ?{core::int?} null : self::Extension|[](#t84{self::Class2}, 0)!) as core::int){(core::num) → core::int});
+  let final self::Class2? #t85 = let final self::Class1? #t86 = c1 in #t86 == null ?{self::Class2?} null : #t86{self::Class1}.{self::Class1::field}{self::Class2?} in #t85 == null ?{core::int?} null : let final core::int #t87 = 0 in self::Extension|[]=(#t85{self::Class2}, #t87, self::Extension|[](#t85{self::Class2}, #t87).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t88 = let final self::Class1? #t89 = c1 in #t89 == null ?{self::Class2?} null : #t89{self::Class1}.{self::Class1::field}{self::Class2?} in #t88 == null ?{core::int?} null : let final core::int #t90 = 0 in self::Extension|[]=(#t88{self::Class2}, #t90, self::Extension|[](#t88{self::Class2}, #t90).{core::num::+}(1.{core::num::+}((let final self::Class2? #t91 = c2 in #t91 == null ?{core::int?} null : self::Extension|[](#t91{self::Class2}, 0)!) as core::int){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class2? #t92 = let final self::Class1? #t93 = c1 in #t93 == null ?{self::Class2?} null : #t93{self::Class1}.{self::Class1::field}{self::Class2?} in #t92 == null ?{core::int?} null : let final core::int #t94 = 0 in let final core::int #t95 = self::Extension|[](#t92{self::Class2}, #t94).{core::num::+}(1){(core::num) → core::int} in let final void #t96 = self::Extension|[]=(#t92{self::Class2}, #t94, #t95) in #t95;
+  let final self::Class2? #t97 = let final self::Class1? #t98 = c1 in #t98 == null ?{self::Class2?} null : #t98{self::Class1}.{self::Class1::field}{self::Class2?} in #t97 == null ?{core::int?} null : let final core::int #t99 = 0 in self::Extension|[]=(#t97{self::Class2}, #t99, self::Extension|[](#t97{self::Class2}, #t99).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t100 = let final self::Class1? #t101 = c1 in #t101 == null ?{self::Class2?} null : #t101{self::Class1}.{self::Class1::field}{self::Class2?} in #t100 == null ?{core::int?} null : let final core::int #t102 = 0 in self::Extension|[](#t100{self::Class2}, #t102) == null ?{core::int?} self::Extension|[]=(#t100{self::Class2}, #t102, 1) : null;
+  let final self::Class2? #t103 = let final self::Class1? #t104 = c1 in #t104 == null ?{self::Class2?} null : #t104{self::Class1}.{self::Class1::field}{self::Class2?} in #t103 == null ?{core::int?} null : let final core::int #t105 = 0 in self::Extension|[](#t103{self::Class2}, #t105) == null ?{core::int?} self::Extension|[]=(#t103{self::Class2}, #t105, 1.{core::num::+}((let final self::Class2? #t106 = c2 in #t106 == null ?{core::int?} null : self::Extension|[](#t106{self::Class2}, 1)!) as core::int){(core::num) → core::int}) : null;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
index 12abc2c..c07dfa6 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
@@ -49,8 +49,8 @@
   let final self::Class2? #t31 = c2 in #t31 == null ?{core::int?} null : let final core::int #t32 = 0 in self::Extension|[](#t31{self::Class2}, #t32) == null ?{core::int?} self::Extension|[]=(#t31{self::Class2}, #t32, 1) : null;
   let final self::Class2? #t33 = c2 in #t33 == null ?{core::int?} null : let final core::int #t34 = 0 in self::Extension|[](#t33{self::Class2}, #t34) == null ?{core::int?} self::Extension|[]=(#t33{self::Class2}, #t34, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 1)){(core::num) → core::int}) : null;
   let final self::Class2? #t35 = c2 in #t35 == null ?{core::int?} null : self::Extension|[](#t35{self::Class2}, 0);
-  let final self::Class2? #t36 = c2 in #t36 == null ?{void} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
-  let final self::Class2? #t37 = c2 in #t37 == null ?{void} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
+  let final self::Class2? #t36 = c2 in #t36 == null ?{core::int?} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
+  let final self::Class2? #t37 = c2 in #t37 == null ?{core::int?} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
   let final self::Class2? #t38 = c2 in #t38 == null ?{core::int?} null : let final core::int #t39 = 0 in self::Extension|[]=(#t38{self::Class2}, #t39, self::Extension|[](#t38{self::Class2}, #t39).{core::num::+}(1){(core::num) → core::int});
   let final self::Class2? #t40 = c2 in #t40 == null ?{core::int?} null : let final core::int #t41 = 0 in self::Extension|[]=(#t40{self::Class2}, #t41, self::Extension|[](#t40{self::Class2}, #t41).{core::num::+}(1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int}){(core::num) → core::int});
   let final self::Class2? #t42 = c2 in #t42 == null ?{core::int?} null : let final core::int #t43 = 0 in let final core::int #t44 = self::Extension|[](#t42{self::Class2}, #t43).{core::num::+}(1){(core::num) → core::int} in let final void #t45 = self::Extension|[]=(#t42{self::Class2}, #t43, #t44) in #t44;
@@ -66,15 +66,15 @@
   let final self::Class1? #t69 = c1 in #t69 == null ?{core::int?} null : let final self::Class2? #t70 = #t69{self::Class1}.{self::Class1::field}{self::Class2?} in #t70 == null ?{core::int?} null : let final core::int #t71 = 0 in self::Extension|[]=(#t70{self::Class2}, #t71, self::Extension|[](#t70{self::Class2}, #t71).{core::num::+}(1){(core::num) → core::int});
   let final self::Class1? #t72 = c1 in #t72 == null ?{core::int?} null : let final self::Class2? #t73 = #t72{self::Class1}.{self::Class1::field}{self::Class2?} in #t73 == null ?{core::int?} null : let final core::int #t74 = 0 in self::Extension|[](#t73{self::Class2}, #t74) == null ?{core::int?} self::Extension|[]=(#t73{self::Class2}, #t74, 1) : null;
   let final self::Class1? #t75 = c1 in #t75 == null ?{core::int?} null : let final self::Class2? #t76 = #t75{self::Class1}.{self::Class1::field}{self::Class2?} in #t76 == null ?{core::int?} null : let final core::int #t77 = 0 in self::Extension|[](#t76{self::Class2}, #t77) == null ?{core::int?} self::Extension|[]=(#t76{self::Class2}, #t77, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(1){(core::int) → core::int}){(core::num) → core::int}) : null;
-  let final self::Class1? #t78 = c1 in #t78 == null ?{core::int?} null : let final self::Class2? #t79 = #t78{self::Class1}.{self::Class1::field}{self::Class2?} in #t79 == null ?{core::int?} null : self::Extension|[](#t79{self::Class2}, 0);
-  let final self::Class1? #t80 = c1 in #t80 == null ?{void} null : let final self::Class2? #t81 = #t80{self::Class1}.{self::Class1::field}{self::Class2?} in #t81 == null ?{void} null : self::Extension|[]=(#t81{self::Class2}, 0, 1);
-  let final self::Class1? #t82 = c1 in #t82 == null ?{void} null : let final self::Class2? #t83 = #t82{self::Class1}.{self::Class1::field}{self::Class2?} in #t83 == null ?{void} null : self::Extension|[]=(#t83{self::Class2}, 0, 1.{core::num::+}(let core::int? #t84 = let final self::Class2? #t85 = c2 in #t85 == null ?{core::int?} null : self::Extension|[](#t85{self::Class2}, 0)! in #t84 == null ?{core::int} #t84 as core::int : #t84{core::int}){(core::num) → core::int});
-  let final self::Class1? #t86 = c1 in #t86 == null ?{core::int?} null : let final self::Class2? #t87 = #t86{self::Class1}.{self::Class1::field}{self::Class2?} in #t87 == null ?{core::int?} null : let final core::int #t88 = 0 in self::Extension|[]=(#t87{self::Class2}, #t88, self::Extension|[](#t87{self::Class2}, #t88).{core::num::+}(1){(core::num) → core::int});
-  let final self::Class1? #t89 = c1 in #t89 == null ?{core::int?} null : let final self::Class2? #t90 = #t89{self::Class1}.{self::Class1::field}{self::Class2?} in #t90 == null ?{core::int?} null : let final core::int #t91 = 0 in self::Extension|[]=(#t90{self::Class2}, #t91, self::Extension|[](#t90{self::Class2}, #t91).{core::num::+}(1.{core::num::+}(let core::int? #t92 = let final self::Class2? #t93 = c2 in #t93 == null ?{core::int?} null : self::Extension|[](#t93{self::Class2}, 0)! in #t92 == null ?{core::int} #t92 as core::int : #t92{core::int}){(core::num) → core::int}){(core::num) → core::int});
-  let final self::Class1? #t94 = c1 in #t94 == null ?{core::int?} null : let final self::Class2? #t95 = #t94{self::Class1}.{self::Class1::field}{self::Class2?} in #t95 == null ?{core::int?} null : let final core::int #t96 = 0 in let final core::int #t97 = self::Extension|[](#t95{self::Class2}, #t96).{core::num::+}(1){(core::num) → core::int} in let final void #t98 = self::Extension|[]=(#t95{self::Class2}, #t96, #t97) in #t97;
-  let final self::Class1? #t99 = c1 in #t99 == null ?{core::int?} null : let final self::Class2? #t100 = #t99{self::Class1}.{self::Class1::field}{self::Class2?} in #t100 == null ?{core::int?} null : let final core::int #t101 = 0 in self::Extension|[]=(#t100{self::Class2}, #t101, self::Extension|[](#t100{self::Class2}, #t101).{core::num::+}(1){(core::num) → core::int});
-  let final self::Class1? #t102 = c1 in #t102 == null ?{core::int?} null : let final self::Class2? #t103 = #t102{self::Class1}.{self::Class1::field}{self::Class2?} in #t103 == null ?{core::int?} null : let final core::int #t104 = 0 in self::Extension|[](#t103{self::Class2}, #t104) == null ?{core::int?} self::Extension|[]=(#t103{self::Class2}, #t104, 1) : null;
-  let final self::Class1? #t105 = c1 in #t105 == null ?{core::int?} null : let final self::Class2? #t106 = #t105{self::Class1}.{self::Class1::field}{self::Class2?} in #t106 == null ?{core::int?} null : let final core::int #t107 = 0 in self::Extension|[](#t106{self::Class2}, #t107) == null ?{core::int?} self::Extension|[]=(#t106{self::Class2}, #t107, 1.{core::num::+}(let core::int? #t108 = let final self::Class2? #t109 = c2 in #t109 == null ?{core::int?} null : self::Extension|[](#t109{self::Class2}, 1)! in #t108 == null ?{core::int} #t108 as core::int : #t108{core::int}){(core::num) → core::int}) : null;
+  let final self::Class2? #t78 = let final self::Class1? #t79 = c1 in #t79 == null ?{self::Class2?} null : #t79{self::Class1}.{self::Class1::field}{self::Class2?} in #t78 == null ?{core::int?} null : self::Extension|[](#t78{self::Class2}, 0);
+  let final self::Class2? #t80 = let final self::Class1? #t81 = c1 in #t81 == null ?{self::Class2?} null : #t81{self::Class1}.{self::Class1::field}{self::Class2?} in #t80 == null ?{core::int?} null : self::Extension|[]=(#t80{self::Class2}, 0, 1);
+  let final self::Class2? #t82 = let final self::Class1? #t83 = c1 in #t83 == null ?{self::Class2?} null : #t83{self::Class1}.{self::Class1::field}{self::Class2?} in #t82 == null ?{core::int?} null : self::Extension|[]=(#t82{self::Class2}, 0, 1.{core::num::+}(let core::int? #t84 = let final self::Class2? #t85 = c2 in #t85 == null ?{core::int?} null : self::Extension|[](#t85{self::Class2}, 0)! in #t84 == null ?{core::int} #t84 as core::int : #t84{core::int}){(core::num) → core::int});
+  let final self::Class2? #t86 = let final self::Class1? #t87 = c1 in #t87 == null ?{self::Class2?} null : #t87{self::Class1}.{self::Class1::field}{self::Class2?} in #t86 == null ?{core::int?} null : let final core::int #t88 = 0 in self::Extension|[]=(#t86{self::Class2}, #t88, self::Extension|[](#t86{self::Class2}, #t88).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t89 = let final self::Class1? #t90 = c1 in #t90 == null ?{self::Class2?} null : #t90{self::Class1}.{self::Class1::field}{self::Class2?} in #t89 == null ?{core::int?} null : let final core::int #t91 = 0 in self::Extension|[]=(#t89{self::Class2}, #t91, self::Extension|[](#t89{self::Class2}, #t91).{core::num::+}(1.{core::num::+}(let core::int? #t92 = let final self::Class2? #t93 = c2 in #t93 == null ?{core::int?} null : self::Extension|[](#t93{self::Class2}, 0)! in #t92 == null ?{core::int} #t92 as core::int : #t92{core::int}){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class2? #t94 = let final self::Class1? #t95 = c1 in #t95 == null ?{self::Class2?} null : #t95{self::Class1}.{self::Class1::field}{self::Class2?} in #t94 == null ?{core::int?} null : let final core::int #t96 = 0 in let final core::int #t97 = self::Extension|[](#t94{self::Class2}, #t96).{core::num::+}(1){(core::num) → core::int} in let final void #t98 = self::Extension|[]=(#t94{self::Class2}, #t96, #t97) in #t97;
+  let final self::Class2? #t99 = let final self::Class1? #t100 = c1 in #t100 == null ?{self::Class2?} null : #t100{self::Class1}.{self::Class1::field}{self::Class2?} in #t99 == null ?{core::int?} null : let final core::int #t101 = 0 in self::Extension|[]=(#t99{self::Class2}, #t101, self::Extension|[](#t99{self::Class2}, #t101).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t102 = let final self::Class1? #t103 = c1 in #t103 == null ?{self::Class2?} null : #t103{self::Class1}.{self::Class1::field}{self::Class2?} in #t102 == null ?{core::int?} null : let final core::int #t104 = 0 in self::Extension|[](#t102{self::Class2}, #t104) == null ?{core::int?} self::Extension|[]=(#t102{self::Class2}, #t104, 1) : null;
+  let final self::Class2? #t105 = let final self::Class1? #t106 = c1 in #t106 == null ?{self::Class2?} null : #t106{self::Class1}.{self::Class1::field}{self::Class2?} in #t105 == null ?{core::int?} null : let final core::int #t107 = 0 in self::Extension|[](#t105{self::Class2}, #t107) == null ?{core::int?} self::Extension|[]=(#t105{self::Class2}, #t107, 1.{core::num::+}(let core::int? #t108 = let final self::Class2? #t109 = c2 in #t109 == null ?{core::int?} null : self::Extension|[](#t109{self::Class2}, 1)! in #t108 == null ?{core::int} #t108 as core::int : #t108{core::int}){(core::num) → core::int}) : null;
 }
 
 
diff --git a/pkg/front_end/testcases/records/simple_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/records/simple_inference.dart.strong.transformed.expect
index 89aadcd..82d33f3 100644
--- a/pkg/front_end/testcases/records/simple_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/records/simple_inference.dart.strong.transformed.expect
@@ -52,7 +52,7 @@
 
 Extra constant evaluation status:
 Evaluated: RecordLiteral @ org-dartlang-testcase:///simple_inference.dart:14:18 -> RecordConstant(const (3, 3.5))
-Evaluated: VariableGetImpl @ org-dartlang-testcase:///simple_inference.dart:14:18 -> RecordConstant(const (3, 3.5))
+Evaluated: VariableGet @ org-dartlang-testcase:///simple_inference.dart:14:18 -> RecordConstant(const (3, 3.5))
 Evaluated: VariableGet @ org-dartlang-testcase:///simple_inference.dart:14:18 -> RecordConstant(const (3, 3.5))
 Evaluated: RecordLiteral @ org-dartlang-testcase:///simple_inference.dart:18:18 -> RecordConstant(const (3, 3.5))
 Extra constant evaluation: evaluated: 27, effectively constant: 4
diff --git a/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.expect b/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.expect
index 57f6d39..4c699c7 100644
--- a/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.expect
@@ -67,7 +67,7 @@
 static extension-member method Foo|get#foo(lowered final core::int #this) → core::int
   return 42;
 static extension-member method Foo|bar(lowered final core::int #this) → void {
-  let final core::int #t1 = self::Foo|get#foo(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t2 = self::Foo|set#foo(#this, #t1) in #t1;
+  let final dynamic #t1 = self::Foo|get#foo(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t2 = self::Foo|set#foo(#this, #t1) in #t1;
 }
 static extension-member method Foo|get#bar(lowered final core::int #this) → () → void
   return () → void => self::Foo|bar(#this);
diff --git a/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.modular.expect b/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.modular.expect
index 57f6d39..4c699c7 100644
--- a/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.modular.expect
@@ -67,7 +67,7 @@
 static extension-member method Foo|get#foo(lowered final core::int #this) → core::int
   return 42;
 static extension-member method Foo|bar(lowered final core::int #this) → void {
-  let final core::int #t1 = self::Foo|get#foo(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t2 = self::Foo|set#foo(#this, #t1) in #t1;
+  let final dynamic #t1 = self::Foo|get#foo(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t2 = self::Foo|set#foo(#this, #t1) in #t1;
 }
 static extension-member method Foo|get#bar(lowered final core::int #this) → () → void
   return () → void => self::Foo|bar(#this);
diff --git a/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.transformed.expect
index 57f6d39..4c699c7 100644
--- a/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/erroneous_setter.dart.strong.transformed.expect
@@ -67,7 +67,7 @@
 static extension-member method Foo|get#foo(lowered final core::int #this) → core::int
   return 42;
 static extension-member method Foo|bar(lowered final core::int #this) → void {
-  let final core::int #t1 = self::Foo|get#foo(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t2 = self::Foo|set#foo(#this, #t1) in #t1;
+  let final dynamic #t1 = self::Foo|get#foo(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t2 = self::Foo|set#foo(#this, #t1) in #t1;
 }
 static extension-member method Foo|get#bar(lowered final core::int #this) → () → void
   return () → void => self::Foo|bar(#this);
diff --git a/pkg/vm/testcases/transformations/ffi/native_callable.dart.aot.expect b/pkg/vm/testcases/transformations/ffi/native_callable.dart.aot.expect
index dd30e75..f15701c 100644
--- a/pkg/vm/testcases/transformations/ffi/native_callable.dart.aot.expect
+++ b/pkg/vm/testcases/transformations/ffi/native_callable.dart.aot.expect
@@ -46,7 +46,7 @@
   final ffi::NativeCallable<(ffi::Int32) → ffi::Void> callback = block {
     final ffi::NativeCallable<(ffi::Int32) → ffi::Void> #t2 = new ffi::_NativeCallableListener::•<(ffi::Int32) → ffi::Void>([@vm.closure-id=2](final core::List<dynamic> args) → void
       [@vm.direct-call.metadata=closure 1 in #lib::testNativeCallableListenerClosure] [@vm.inferred-type.metadata=? (receiver not int)] closure(args.{core::List::[]}(0){(core::int) → dynamic}){(ffi::Int32) → ffi::Void};
-, "NativeCallable(VariableGetImpl(closure))");
+, "NativeCallable(VariableGet(closure))");
     [@vm.call-site-attributes.metadata=receiverType:dart.ffi::NativeCallable<dart.ffi::Void Function(dart.ffi::Int32)>] [@vm.direct-call.metadata=dart.ffi::_NativeCallableBase._pointer] #t2.{ffi::_NativeCallableBase::_pointer} = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::_createNativeCallableListener<ffi::NativeFunction<(ffi::Int32) → ffi::Void>>(ffi::_nativeAsyncCallbackFunction<(ffi::Int32) → ffi::Void>(), [@vm.direct-call.metadata=dart.ffi::_NativeCallableListener._port] [@vm.inferred-type.metadata=dart.isolate::_RawReceivePort] #t2.{ffi::_NativeCallableListener::_port}{iso::RawReceivePort});
   } =>#t2;
   core::print([@vm.direct-call.metadata=dart.ffi::_NativeCallableBase.nativeFunction] [@vm.inferred-type.metadata=dart.ffi::Pointer] callback.{ffi::NativeCallable::nativeFunction}{ffi::Pointer<ffi::NativeFunction<(ffi::Int32) → ffi::Void>>});
diff --git a/pkg/vm/testcases/transformations/ffi/native_callable.dart.expect b/pkg/vm/testcases/transformations/ffi/native_callable.dart.expect
index 56075ba..9cb0d28 100644
--- a/pkg/vm/testcases/transformations/ffi/native_callable.dart.expect
+++ b/pkg/vm/testcases/transformations/ffi/native_callable.dart.expect
@@ -35,7 +35,7 @@
   final ffi::NativeCallable<(ffi::Int32) → ffi::Void> callback = block {
     final ffi::NativeCallable<(ffi::Int32) → ffi::Void> #t2 = new ffi::_NativeCallableListener::•<(ffi::Int32) → ffi::Void>((final core::List<dynamic> args) → void
       closure(args.{core::List::[]}(0){(core::int) → dynamic}){(ffi::Int32) → ffi::Void};
-, "NativeCallable(VariableGetImpl(closure))");
+, "NativeCallable(VariableGet(closure))");
     [@vm.call-site-attributes.metadata=receiverType:dart.ffi::NativeCallable<dart.ffi::Void Function(dart.ffi::Int32)>] #t2.{ffi::_NativeCallableBase::_pointer} = ffi::_createNativeCallableListener<ffi::NativeFunction<(ffi::Int32) → ffi::Void>>(ffi::_nativeAsyncCallbackFunction<(ffi::Int32) → ffi::Void>(), #t2.{ffi::_NativeCallableListener::_port}{iso::RawReceivePort});
   } =>#t2;
   core::print(callback.{ffi::NativeCallable::nativeFunction}{ffi::Pointer<ffi::NativeFunction<(ffi::Int32) → ffi::Void>>});
diff --git a/tests/language/extension_methods/static_extension_bounds_error_test.dart b/tests/language/extension_methods/static_extension_bounds_error_test.dart
index 6759bcf..b7cb849 100644
--- a/tests/language/extension_methods/static_extension_bounds_error_test.dart
+++ b/tests/language/extension_methods/static_extension_bounds_error_test.dart
@@ -37,12 +37,12 @@
   E1(s).e1;
   // ^
   // [analyzer] COMPILE_TIME_ERROR.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE
-  // [cfe] The argument type 'String' can't be assigned to the parameter type 'num'.
+  // [cfe] A value of type 'String' can't be assigned to a variable of type 'num'.
   E1<String>(s).e1;
-  // [error column 3]
-  // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'E1|get#e1'.
   // ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+  //            ^
+  // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'e1'.
 
   // Inferred types of int and double are ok
   i.e1;
@@ -60,12 +60,13 @@
   E2(s).e2;
   // [error column 3, length 2]
   // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
-  // [cfe] Inferred type argument 'String' doesn't conform to the bound 'S' of the type variable 'T' on 'E2|get#e2'.
+  //    ^
+  // [cfe] Inferred type argument 'String' doesn't conform to the bound 'S' of the type variable 'T' on 'e2'.
   E2<String, num>(s).e2;
-  // [error column 3]
-  // [cfe] Type argument 'String' doesn't conform to the bound 'S' of the type variable 'T' on 'E2|get#e2'.
   // ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+  //                 ^
+  // [cfe] Type argument 'String' doesn't conform to the bound 'S' of the type variable 'T' on 'e2'.
 
   // Inferred types of int and double are ok
   i.e2;
@@ -126,10 +127,11 @@
   E4(superRec).e4;
   // [error column 3, length 2]
   // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
-  // [cfe] Inferred type argument 'Rec<dynamic>' doesn't conform to the bound 'Rec<T>' of the type variable 'T' on 'E4|get#e4'.
+  //           ^
+  // [cfe] Inferred type argument 'Rec<dynamic>' doesn't conform to the bound 'Rec<T>' of the type variable 'T' on 'e4'.
   E4<Rec<dynamic>>(superRec).e4;
-  // [error column 3]
-  // [cfe] Type argument 'Rec<dynamic>' doesn't conform to the bound 'Rec<T>' of the type variable 'T' on 'E4|get#e4'.
   // ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+  //                         ^
+  // [cfe] Type argument 'Rec<dynamic>' doesn't conform to the bound 'Rec<T>' of the type variable 'T' on 'e4'.
 }
diff --git a/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
index 5e2574f..d7be782 100644
--- a/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -80,11 +80,11 @@
   E0(c0)[0] += 0;
   //    ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
-  // [cfe] The operator '[]' isn't defined for the type 'C0'.
+  // [cfe] Member not found: '[]'.
   E0(c0)[0]++;
   //    ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
-  // [cfe] The operator '[]' isn't defined for the type 'C0'.
+  // [cfe] Member not found: '[]'.
 }
 
 // Conflicting extensions.
diff --git a/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index f865b5b..7a13fe7 100644
--- a/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -52,7 +52,6 @@
     topLevelMethod(4);
     // [error column 5, length 14]
     // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-    //            ^
     // [cfe] The method 'call' isn't defined for the type 'int'.
   }
 }
@@ -226,7 +225,6 @@
     extensionMethod(4);
     // [error column 5, length 15]
     // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-    //             ^
     // [cfe] The method 'call' isn't defined for the type 'int'.
   }
 }
diff --git a/tests/language/inference_using_bounds/pre_experiment/restricting_choices_using_bounds_legacy_error_test.dart b/tests/language/inference_using_bounds/pre_experiment/restricting_choices_using_bounds_legacy_error_test.dart
index 6172db6..1bbbb1a 100644
--- a/tests/language/inference_using_bounds/pre_experiment/restricting_choices_using_bounds_legacy_error_test.dart
+++ b/tests/language/inference_using_bounds/pre_experiment/restricting_choices_using_bounds_legacy_error_test.dart
@@ -25,7 +25,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'FutureOr<Object?>' doesn't conform to the bound 'Object' of the type variable 'T' on 'foo1'.
 //                                        ^
-// [cfe] Type argument 'Object Function(Object)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'Object Function(Object)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                                         ^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -35,7 +35,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'foo2'.
 //                          ^
-// [cfe] Type argument 'num Function(num)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'num Function(num)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                           ^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -45,7 +45,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'EA' doesn't conform to the bound 'Object' of the type variable 'T' on 'foo3'.
 //                            ^
-// [cfe] Type argument 'Object Function(Object)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'Object Function(Object)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                             ^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -55,7 +55,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'S' doesn't conform to the bound 'A' of the type variable 'T' on 'foo4'.
 //                                       ^
-// [cfe] Type argument 'A Function(A)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'A Function(A)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                                        ^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -66,7 +66,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'U' doesn't conform to the bound 'B<S>' of the type variable 'T' on 'foo5'.
 //                       ^
-// [cfe] Type argument 'B<U> Function(B<U>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'B<U> Function(B<U>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                        ^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -78,7 +78,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'Null' doesn't conform to the bound 'B<S>' of the type variable 'T' on 'foo6'.
 //                                   ^
-// [cfe] Type argument 'B<Object?> Function(B<Object?>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'B<Object?> Function(B<Object?>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                                    ^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -89,7 +89,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'U' doesn't conform to the bound 'B<dynamic Function(S)>' of the type variable 'T' on 'foo7'.
 //                       ^
-// [cfe] Type argument 'B<dynamic Function(U)> Function(B<dynamic Function(U)>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'B<dynamic Function(U)> Function(B<dynamic Function(U)>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                        ^^^^^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -102,7 +102,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'U' doesn't conform to the bound 'B<dynamic Function(S)>' of the type variable 'T' on 'foo8'.
 //                       ^
-// [cfe] Type argument 'B<dynamic Function(A)> Function(B<dynamic Function(A)>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'B<dynamic Function(A)> Function(B<dynamic Function(A)>)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                        ^^^^^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
@@ -112,7 +112,7 @@
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Inferred type argument 'S' doesn't conform to the bound 'Object' of the type variable 'T' on 'foo9'.
 //                                        ^
-// [cfe] Type argument 'num Function(num)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'StaticType|expectStaticType'.
+// [cfe] Type argument 'num Function(num)' doesn't conform to the bound 'T Function(T)' of the type variable 'R' on 'expectStaticType'.
 //                                                         ^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
index 8cf0ab5..2eefa08 100644
--- a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
+++ b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
@@ -532,7 +532,7 @@
   //  ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE
   //    ^
-  // [cfe] The argument type 'int?' can't be assigned to the parameter type 'int'.
+  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int'.
 }
 
 class C34 {