Version 2.15.0-138.0.dev

Merge commit '24c20d48449fa52e9283f1dde05a778ccfeb1287' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/error/ffi_code.dart b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
index d8600d8..d011515 100644
--- a/pkg/analyzer/lib/src/dart/error/ffi_code.dart
+++ b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
@@ -383,9 +383,6 @@
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_WITH',
   );
 
-  @override
-  final ErrorType type;
-
   /// Initialize a newly created error code to have the given [name]. If
   /// [uniqueName] is provided, then it will be used to construct the unique
   /// name for the code, otherwise the name will be used to construct the unique
@@ -401,10 +398,8 @@
     bool hasPublishedDocs = false,
     required String message,
     required String name,
-    ErrorType type = ErrorType.COMPILE_TIME_ERROR,
     String? uniqueName,
-  })  : type = type,
-        super(
+  }) : super(
           correction: correction,
           hasPublishedDocs: hasPublishedDocs,
           message: message,
@@ -414,4 +409,7 @@
 
   @override
   ErrorSeverity get errorSeverity => type.severity;
+
+  @override
+  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index a5faee7..9956d82 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -3047,7 +3047,9 @@
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, node.propertyName, node.writeOffset,
-        setter: true, instrumented: true, includeExtensionMethods: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        instrumented: true,
+        includeExtensionMethods: true);
     DartType writeType = inferrer.getSetterType(writeTarget, receiverType);
 
     ExpressionInferenceResult binaryResult = _computeBinaryExpression(
@@ -3108,7 +3110,9 @@
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, node.propertyName, receiver.fileOffset,
-        setter: true, instrumented: true, includeExtensionMethods: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        instrumented: true,
+        includeExtensionMethods: true);
     DartType writeContext = inferrer.getSetterType(writeTarget, receiverType);
 
     inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
@@ -3235,7 +3239,8 @@
 
     ObjectAccessTarget indexGetTarget = inferrer.findInterfaceMember(
         receiverType, indexGetName, node.fileOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     DartType indexType = inferrer.getIndexKeyType(indexGetTarget, receiverType);
 
@@ -3277,7 +3282,8 @@
 
     ObjectAccessTarget indexSetTarget = inferrer.findInterfaceMember(
         receiverType, indexSetName, node.fileOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     DartType indexType = inferrer.getIndexKeyType(indexSetTarget, receiverType);
     DartType valueType =
@@ -3500,7 +3506,8 @@
 
     ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
         receiverType, indexGetName, node.readOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     MethodContravarianceCheckKind checkKind =
         inferrer.preCheckInvocationContravariance(receiverType, readTarget,
@@ -3510,7 +3517,8 @@
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, indexSetName, node.writeOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     DartType writeIndexType =
         inferrer.getIndexKeyType(writeTarget, receiverType);
@@ -4031,7 +4039,8 @@
 
     ObjectAccessTarget equalsTarget = inferrer.findInterfaceMember(
         leftType, equalsName, fileOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     assert(
         equalsTarget.isInstanceMember ||
@@ -4077,7 +4086,8 @@
       // Ensure operator == member even for `Never`.
       Member target = inferrer
           .findInterfaceMember(const DynamicType(), equalsName, -1,
-              instrumented: false)
+              instrumented: false,
+              callSiteAccessKind: CallSiteAccessKind.operatorInvocation)
           .member!;
       equals = new EqualsCall(left, right,
           functionType: functionType, interfaceTarget: target as Procedure)
@@ -4115,7 +4125,8 @@
 
     ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember(
         leftType, binaryName, fileOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     MethodContravarianceCheckKind binaryCheckKind =
         inferrer.preCheckInvocationContravariance(leftType, binaryTarget,
@@ -4296,7 +4307,8 @@
       Map<DartType, NonPromotionReason> Function() whyNotPromoted) {
     ObjectAccessTarget unaryTarget = inferrer.findInterfaceMember(
         expressionType, unaryName, fileOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     MethodContravarianceCheckKind unaryCheckKind =
         inferrer.preCheckInvocationContravariance(expressionType, unaryTarget,
@@ -4656,7 +4668,8 @@
 
     ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
         receiverType, propertyName, fileOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.getterInvocation);
 
     DartType readType = inferrer.getGetterType(readTarget, receiverType);
 
@@ -4945,7 +4958,8 @@
 
     ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
         receiverType, indexGetName, node.readOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     MethodContravarianceCheckKind readCheckKind =
         inferrer.preCheckInvocationContravariance(receiverType, readTarget,
@@ -4997,7 +5011,8 @@
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, indexSetName, node.writeOffset,
-        includeExtensionMethods: true);
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.operatorInvocation);
 
     DartType writeIndexType =
         inferrer.getIndexKeyType(writeTarget, receiverType);
@@ -5143,7 +5158,8 @@
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         nonNullReceiverType, node.propertyName, node.writeOffset,
-        setter: true, includeExtensionMethods: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        includeExtensionMethods: true);
 
     DartType valueType =
         inferrer.getSetterType(writeTarget, nonNullReceiverType);
@@ -5611,7 +5627,9 @@
 
     ObjectAccessTarget target = inferrer.findInterfaceMember(
         receiverType, node.name, node.fileOffset,
-        setter: true, instrumented: true, includeExtensionMethods: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        instrumented: true,
+        includeExtensionMethods: true);
     if (target.isInstanceMember || target.isObjectMember) {
       if (inferrer.instrumentation != null &&
           receiverType == const DynamicType()) {
@@ -5673,7 +5691,8 @@
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         nonNullReceiverType, node.name, node.writeOffset,
-        setter: true, includeExtensionMethods: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        includeExtensionMethods: true);
 
     DartType valueType =
         inferrer.getSetterType(writeTarget, nonNullReceiverType);
@@ -6980,7 +6999,9 @@
     DartType receiverType = receiverResult.inferredType;
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, propertySet.name, propertySet.fileOffset,
-        setter: true, instrumented: true, includeExtensionMethods: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        instrumented: true,
+        includeExtensionMethods: true);
     DartType elementType =
         _writeType = inferrer.getSetterType(writeTarget, receiverType);
     Expression? error = inferrer.reportMissingInterfaceMember(
@@ -7038,7 +7059,8 @@
     DartType receiverType = inferrer.thisType!;
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, superPropertySet.name, superPropertySet.fileOffset,
-        setter: true, instrumented: true);
+        callSiteAccessKind: CallSiteAccessKind.setterInvocation,
+        instrumented: true);
     if (writeTarget.isInstanceMember || writeTarget.isObjectMember) {
       superPropertySet.interfaceTarget = writeTarget.member;
     }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 90b5822..cf74dd7 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -879,57 +879,20 @@
   ObjectAccessTarget _findShownExtensionTypeMember(
       ExtensionType receiverType, Name name, int fileOffset,
       {required ObjectAccessTarget defaultTarget,
-      required bool isSetter,
+      required CallSiteAccessKind callSiteAccessKind,
       required bool isPotentiallyNullable}) {
     Extension extension = receiverType.extension;
     ExtensionTypeShowHideClause? showHideClause = extension.showHideClause;
     if (showHideClause == null) return defaultTarget;
 
-    kernel.Reference? findMember(Name name, List<kernel.Reference> references,
-        List<Supertype> interfaces,
-        {required bool isSetter}) {
-      for (kernel.Reference reference in references) {
-        if (reference.asMember.name == name) {
-          return reference;
-        }
-      }
-      for (Supertype interface in interfaces) {
-        Member? member = classHierarchy
-            .getInterfaceMember(interface.classNode, name, setter: isSetter);
-        if (member != null) {
-          return member.reference;
-        }
-      }
-      return null;
-    }
-
-    List<kernel.Reference> shownReferences = isSetter
-        ? showHideClause.shownSetters
-        : <kernel.Reference>[
-            ...showHideClause.shownGetters,
-            ...showHideClause.shownMethods,
-            ...showHideClause.shownOperators
-          ];
-    List<kernel.Reference> hiddenReferences = isSetter
-        ? showHideClause.hiddenSetters
-        : <kernel.Reference>[
-            ...showHideClause.hiddenGetters,
-            ...showHideClause.hiddenMethods,
-            ...showHideClause.hiddenOperators
-          ];
-
-    kernel.Reference? reference = findMember(
-        name, shownReferences, showHideClause.shownSupertypes,
-        isSetter: isSetter);
-    if (reference != null &&
-        findMember(name, hiddenReferences, showHideClause.hiddenSupertypes,
-                isSetter: isSetter) ==
-            null) {
+    kernel.Reference? reference = showHideClause.findShownReference(
+        name, callSiteAccessKind, classHierarchy);
+    if (reference != null) {
       return new ObjectAccessTarget.interfaceMember(reference.asMember,
           isPotentiallyNullable: isPotentiallyNullable);
+    } else {
+      return defaultTarget;
     }
-
-    return defaultTarget;
   }
 
   /// Returns extension member declared immediately for [receiverType].
@@ -1163,12 +1126,14 @@
   /// be targeted due to, e.g., an incorrect argument count).
   ObjectAccessTarget findInterfaceMember(
       DartType receiverType, Name name, int fileOffset,
-      {bool setter: false,
+      {required CallSiteAccessKind callSiteAccessKind,
       bool instrumented: true,
       bool includeExtensionMethods: false}) {
     // ignore: unnecessary_null_comparison
     assert(receiverType != null && isKnown(receiverType));
 
+    bool isSetter = callSiteAccessKind == CallSiteAccessKind.setterInvocation;
+
     DartType receiverBound = resolveTypeParameter(receiverType);
 
     bool isReceiverTypePotentiallyNullable = isNonNullableByDefault &&
@@ -1181,8 +1146,8 @@
         : coreTypes.objectClass;
 
     if (isReceiverTypePotentiallyNullable) {
-      Member? member =
-          _getInterfaceMember(coreTypes.objectClass, name, setter, fileOffset);
+      Member? member = _getInterfaceMember(
+          coreTypes.objectClass, name, isSetter, fileOffset);
       if (member != null) {
         // Null implements all Object members so this is not considered a
         // potentially nullable access.
@@ -1194,7 +1159,7 @@
             coreTypes.objectClass,
             name,
             fileOffset,
-            setter: setter);
+            setter: isSetter);
         if (target != null) {
           return target;
         }
@@ -1212,7 +1177,8 @@
         case Nullability.nullable:
         case Nullability.legacy:
           // Never? and Never* are equivalent to Null.
-          return findInterfaceMember(const NullType(), name, fileOffset);
+          return findInterfaceMember(const NullType(), name, fileOffset,
+              callSiteAccessKind: callSiteAccessKind);
         case Nullability.undetermined:
           return internalProblem(
               templateInternalProblemUnsupportedNullability.withArguments(
@@ -1226,7 +1192,7 @@
 
     ObjectAccessTarget? target;
     Member? interfaceMember =
-        _getInterfaceMember(classNode, name, setter, fileOffset);
+        _getInterfaceMember(classNode, name, isSetter, fileOffset);
     if (interfaceMember != null) {
       target = new ObjectAccessTarget.interfaceMember(interfaceMember,
           isPotentiallyNullable: isReceiverTypePotentiallyNullable);
@@ -1243,10 +1209,11 @@
     } else if (library.enableExtensionTypesInLibrary &&
         receiverBound is ExtensionType) {
       target = _findDirectExtensionTypeMember(receiverBound, name, fileOffset,
-          isSetter: setter, defaultTarget: const ObjectAccessTarget.missing());
+          isSetter: isSetter,
+          defaultTarget: const ObjectAccessTarget.missing());
       if (target.kind == ObjectAccessTargetKind.missing) {
         target = _findShownExtensionTypeMember(receiverBound, name, fileOffset,
-            isSetter: setter,
+            callSiteAccessKind: callSiteAccessKind,
             isPotentiallyNullable: isReceiverTypePotentiallyNullable,
             defaultTarget: const ObjectAccessTarget.missing());
       }
@@ -1276,7 +1243,7 @@
             classNode,
             name,
             fileOffset,
-            setter: setter,
+            setter: isSetter,
             defaultTarget: target,
             isPotentiallyNullableAccess: true)!;
       } else {
@@ -1285,7 +1252,7 @@
             classNode,
             name,
             fileOffset,
-            setter: setter,
+            setter: isSetter,
             defaultTarget: target)!;
       }
     }
@@ -3665,7 +3632,9 @@
 
     ObjectAccessTarget target = findInterfaceMember(
         receiverType, name, fileOffset,
-        instrumented: true, includeExtensionMethods: true);
+        instrumented: true,
+        includeExtensionMethods: true,
+        callSiteAccessKind: CallSiteAccessKind.methodInvocation);
 
     switch (target.kind) {
       case ObjectAccessTargetKind.instanceMember:
diff --git a/pkg/front_end/testcases/extension_types/call_not_get.dart b/pkg/front_end/testcases/extension_types/call_not_get.dart
new file mode 100644
index 0000000..8253bcd
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/call_not_get.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension type E on int show get ceil, floor hide get floor {}
+
+test(E e) {
+  e.ceil; // Ok.
+  e.ceil(); // Error.
+  e.ceil = 42; // Error.
+
+  e.floor; // Error.
+  e.floor(); // Ok.
+  e.ceil = 42; // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/call_not_get.dart.strong.expect b/pkg/front_end/testcases/extension_types/call_not_get.dart.strong.expect
new file mode 100644
index 0000000..a787e50
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/call_not_get.dart.strong.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:9:5: Error: The method 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+//   e.ceil(); // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:10:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+//   e.ceil = 42; // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:12:5: Error: The getter 'floor' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'floor'.
+//   e.floor; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:14:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+//   e.ceil = 42; // Error.
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type E on core::int show-methods core::int::floor show-getters core::int::floor, core::int::ceil hide-getters core::int::floor {
+}
+static method test(self::E e) → dynamic {
+  e.{core::int::ceil}{() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:9:5: Error: The method 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+  e.ceil(); // Error.
+    ^^^^" in e{<unresolved>}.ceil();
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:10:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+  e.ceil = 42; // Error.
+    ^^^^" in e{<unresolved>}.ceil = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:12:5: Error: The getter 'floor' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'floor'.
+  e.floor; // Error.
+    ^^^^^" in e{<unresolved>}.floor;
+  e.{core::int::floor}(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:14:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+  e.ceil = 42; // Error.
+    ^^^^" in e{<unresolved>}.ceil = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/call_not_get.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/call_not_get.dart.textual_outline.expect
new file mode 100644
index 0000000..c7dd52e
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/call_not_get.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+extension type E on int show get ceil, floor hide get floor {}
+test(E e) {}
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.expect b/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.expect
new file mode 100644
index 0000000..a787e50
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:9:5: Error: The method 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+//   e.ceil(); // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:10:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+//   e.ceil = 42; // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:12:5: Error: The getter 'floor' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'floor'.
+//   e.floor; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:14:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+//   e.ceil = 42; // Error.
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type E on core::int show-methods core::int::floor show-getters core::int::floor, core::int::ceil hide-getters core::int::floor {
+}
+static method test(self::E e) → dynamic {
+  e.{core::int::ceil}{() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:9:5: Error: The method 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+  e.ceil(); // Error.
+    ^^^^" in e{<unresolved>}.ceil();
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:10:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+  e.ceil = 42; // Error.
+    ^^^^" in e{<unresolved>}.ceil = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:12:5: Error: The getter 'floor' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'floor'.
+  e.floor; // Error.
+    ^^^^^" in e{<unresolved>}.floor;
+  e.{core::int::floor}(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:14:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+  e.ceil = 42; // Error.
+    ^^^^" in e{<unresolved>}.ceil = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.outline.expect
new file mode 100644
index 0000000..aca4fe0
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.outline.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension type E on core::int show-methods core::int::floor show-getters core::int::floor, core::int::ceil hide-getters core::int::floor {
+}
+static method test(self::E e) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 4158e04..d331e38 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -5,6 +5,7 @@
 const_functions/const_functions_const_factory: VerificationError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
+extension_types/call_not_get: ExpectationFileMismatchSerialized # Expected.
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/show_and_run_ceil: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index c0b3a90..6b92aed 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -12,6 +12,7 @@
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
+extension_types/call_not_get: ExpectationFileMismatchSerialized # Expected.
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/show_and_run_ceil: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 3187786..6eff171 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -9,6 +9,7 @@
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
+extension_types/call_not_get: ExpectationFileMismatchSerialized # Expected.
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/show_and_run_ceil: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 65cb5bc..076e9ed 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,6 +28,7 @@
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
 extension_types/basic_show: FormatterCrash
+extension_types/call_not_get: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
 extension_types/show_and_run_ceil: FormatterCrash
 extension_types/show_hide_all_kinds: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index a08f3fe..fe8d64f 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -15,6 +15,7 @@
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
+extension_types/call_not_get: ExpectationFileMismatchSerialized # Expected.
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/show_and_run_ceil: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index b2a0317..2b27632 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -79,6 +79,7 @@
 import 'transformations/flags.dart';
 import 'text/ast_to_text.dart' as astToText;
 import 'core_types.dart';
+import 'class_hierarchy.dart';
 import 'type_algebra.dart';
 import 'type_environment.dart';
 import 'src/assumptions.dart';
@@ -1725,6 +1726,13 @@
   }
 }
 
+enum CallSiteAccessKind {
+  methodInvocation,
+  getterInvocation,
+  setterInvocation,
+  operatorInvocation,
+}
+
 /// Elements of the 'show' and 'hide' clauses of an extension type declaration.
 class ExtensionTypeShowHideClause {
   /// The types in the 'show clause' of the extension type declaration.
@@ -1834,6 +1842,62 @@
   ///   }
   ///   extension type E on A hide operator +, operator * {}
   final List<Reference> hiddenOperators = <Reference>[];
+
+  Reference? findShownReference(Name name,
+      CallSiteAccessKind callSiteAccessKind, ClassHierarchy hierarchy) {
+    List<Reference> shownReferences;
+    List<Reference> hiddenReferences;
+    switch (callSiteAccessKind) {
+      case CallSiteAccessKind.getterInvocation:
+        shownReferences = shownGetters;
+        hiddenReferences = hiddenGetters;
+        break;
+      case CallSiteAccessKind.setterInvocation:
+        shownReferences = shownSetters;
+        hiddenReferences = hiddenSetters;
+        break;
+      case CallSiteAccessKind.methodInvocation:
+        shownReferences = shownMethods;
+        hiddenReferences = hiddenMethods;
+        break;
+      case CallSiteAccessKind.operatorInvocation:
+        shownReferences = shownOperators;
+        hiddenReferences = hiddenOperators;
+        break;
+    }
+
+    Reference? reference = _findMember(
+        name, shownReferences, shownSupertypes, hierarchy, callSiteAccessKind);
+    if (reference != null &&
+        _findMember(name, hiddenReferences, hiddenSupertypes, hierarchy,
+                callSiteAccessKind) ==
+            null) {
+      return reference;
+    }
+
+    return null;
+  }
+
+  Reference? _findMember(
+      Name name,
+      List<Reference> references,
+      List<Supertype> interfaces,
+      ClassHierarchy hierarchy,
+      CallSiteAccessKind callSiteAccessKind) {
+    for (Reference reference in references) {
+      if (reference.asMember.name == name) {
+        return reference;
+      }
+    }
+    for (Supertype interface in interfaces) {
+      Member? member = hierarchy.getInterfaceMember(interface.classNode, name,
+          setter: callSiteAccessKind == CallSiteAccessKind.setterInvocation);
+      if (member != null) {
+        return member.reference;
+      }
+    }
+    return null;
+  }
 }
 
 // ------------------------------------------------------------------------
diff --git a/tools/VERSION b/tools/VERSION
index 2b2499a..b875bc9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 137
+PRERELEASE 138
 PRERELEASE_PATCH 0
\ No newline at end of file