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('+ ('),