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