@@ -171,8 +171,8 @@ class MethodInvocationResolver {
171171 return ;
172172 }
173173
174- if (receiverType == NeverTypeImpl .instance ) {
175- _reportUseOfNeverType (node, receiver);
174+ if (receiverType is NeverTypeImpl ) {
175+ _resolveReceiverNever (node, receiver, receiverType );
176176 return ;
177177 }
178178 }
@@ -290,14 +290,6 @@ class MethodInvocationResolver {
290290 );
291291 }
292292
293- void _reportUseOfNeverType (MethodInvocation node, AstNode errorNode) {
294- _setDynamicResolution (node);
295- _resolver.errorReporter.reportErrorForNode (
296- StaticWarningCode .INVALID_USE_OF_NEVER_VALUE ,
297- errorNode,
298- );
299- }
300-
301293 void _reportUseOfVoidType (MethodInvocation node, AstNode errorNode) {
302294 _setDynamicResolution (node);
303295 _resolver.errorReporter.reportErrorForNode (
@@ -306,12 +298,19 @@ class MethodInvocationResolver {
306298 );
307299 }
308300
309- void _resolveArguments_finishInference (MethodInvocation node) {
301+ /// [InvocationExpression.staticInvokeType] has been set for the [node] .
302+ /// Use it to set context for arguments, and resolve them.
303+ void _resolveArguments (MethodInvocation node) {
310304 _inferenceHelper.inferArgumentTypesForInvocation (node);
311305 node.argumentList.accept (_resolver);
306+ }
307+
308+ void _resolveArguments_finishInference (MethodInvocation node) {
309+ _resolveArguments (node);
312310
313311 _inferenceHelper.inferGenericInvocationExpression (node);
314312
313+ // TODO(scheglov) Call this only when member lookup failed?
315314 var inferred = _inferenceHelper.inferMethodInvocationObject (node);
316315
317316 if (! inferred) {
@@ -589,6 +588,49 @@ class MethodInvocationResolver {
589588 }
590589 }
591590
591+ void _resolveReceiverNever (
592+ MethodInvocation node,
593+ Expression receiver,
594+ DartType receiverType,
595+ ) {
596+ _setExplicitTypeArgumentTypes ();
597+
598+ if (receiverType == NeverTypeImpl .instanceNullable) {
599+ var methodName = node.methodName;
600+ var objectElement = _resolver.typeProvider.objectElement;
601+ var objectMember = objectElement.getMethod (methodName.name);
602+ if (objectMember != null ) {
603+ objectMember = _resolver.toLegacyElement (objectMember);
604+ methodName.staticElement = objectMember;
605+ _setResolution (
606+ node,
607+ _elementTypeProvider.getExecutableType (objectMember),
608+ );
609+ } else {
610+ _setDynamicResolution (node);
611+ _resolver.errorReporter.reportErrorForNode (
612+ StaticWarningCode .UNCHECKED_USE_OF_NULLABLE_VALUE ,
613+ receiver,
614+ );
615+ }
616+ return ;
617+ }
618+
619+ if (receiverType == NeverTypeImpl .instance) {
620+ node.methodName.staticType = _dynamicType;
621+ node.staticInvokeType = _dynamicType;
622+ node.staticType = NeverTypeImpl .instance;
623+
624+ _resolveArguments (node);
625+
626+ _resolver.errorReporter.reportErrorForNode (
627+ StaticWarningCode .INVALID_USE_OF_NEVER_VALUE ,
628+ receiver,
629+ );
630+ return ;
631+ }
632+ }
633+
592634 void _resolveReceiverNull (
593635 MethodInvocation node, SimpleIdentifier nameNode, String name) {
594636 var element = nameScope.lookup (nameNode, _definingLibrary);
@@ -958,10 +1000,6 @@ class MethodInvocationResolver {
9581000 return _reportUseOfVoidType (node, node.methodName);
9591001 }
9601002
961- if (type == NeverTypeImpl .instance) {
962- return _reportUseOfNeverType (node, node.methodName);
963- }
964-
9651003 _reportInvocationOfNonFunction (node);
9661004 }
9671005
0 commit comments