Resolve 'call' on FunctionType(s), and Never in TypePropertyResolver.
Change-Id: I357e3704ab48378d4f4f87dbc41148193c23d592
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162980
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 77e033b..e8c0531 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -414,16 +414,6 @@
void _resolveReceiverInterfaceType(MethodInvocation node, Expression receiver,
InterfaceType receiverType, SimpleIdentifier nameNode, String name) {
- if (_isCoreFunction(receiverType) &&
- name == FunctionElement.CALL_METHOD_NAME) {
- _resolver.nullableDereferenceVerifier.expression(
- receiver,
- type: receiverType,
- );
- _setDynamicResolution(node);
- return;
- }
-
_resolveReceiverType(
node: node,
receiver: receiver,
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index fd6587a..db73a0c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -177,36 +177,21 @@
nameErrorEntity: propertyName,
);
- if (targetType is DynamicTypeImpl || targetType is NeverTypeImpl) {
- // OK
- } else {
- // TODO(scheglov) It is not nice that we check for `call` here.
- // We can find `call` in these types, is should be `single`, but `null`.
- if (hasRead && result.getter == null && !result.isAmbiguous) {
- if (targetType is FunctionType &&
- propertyName.name == FunctionElement.CALL_METHOD_NAME) {
- // Referencing `.call` on a FunctionType is OK.
- } else if (targetType is InterfaceType &&
- targetType.isDartCoreFunction &&
- propertyName.name == FunctionElement.CALL_METHOD_NAME) {
- // Referencing `.call` on a `Function` type is OK.
- } else if (result.needsGetterError) {
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.UNDEFINED_GETTER,
- propertyName,
- [propertyName.name, targetType],
- );
- }
- }
+ if (hasRead && result.needsGetterError) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.UNDEFINED_GETTER,
+ propertyName,
+ [propertyName.name, targetType],
+ );
+ }
- if (hasWrite && result.needsSetterError) {
- AssignmentVerifier(_definingLibrary, _errorReporter).verify(
- node: propertyName,
- requested: null,
- recovery: result.getter,
- receiverTypeObject: targetType,
- );
- }
+ if (hasWrite && result.needsSetterError) {
+ AssignmentVerifier(_definingLibrary, _errorReporter).verify(
+ node: propertyName,
+ requested: null,
+ recovery: result.getter,
+ receiverTypeObject: targetType,
+ );
}
return PropertyElementResolverResult(
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
index e544c4f..f9ae35c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
@@ -111,6 +111,22 @@
if (_hasGetterOrSetter) {
return _toResult();
}
+ if (receiverType.isDartCoreFunction && _name == 'call') {
+ _needsGetterError = false;
+ _needsSetterError = false;
+ return _toResult();
+ }
+ }
+
+ if (receiverType is FunctionType && _name == 'call') {
+ return _toResult();
+ }
+
+ if (receiverType is NeverType) {
+ _lookupInterfaceType(_typeProvider.objectType);
+ _needsGetterError = false;
+ _needsSetterError = false;
+ return _toResult();
}
_lookupExtension(receiverType);
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index d9d9872..c5129ed 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -558,13 +558,11 @@
}
test_binaryExpression_plus() async {
- await assertErrorsInCode(r'''
+ await assertNoErrorsInCode(r'''
void main() {
(throw '') + (1 + 2);
}
-''', [
- error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 27, 1),
- ]);
+''');
assertBinaryExpression(
findNode.binary('+ ('),