From 92633cf4af881f23a7625e9a5d817b3361d17f4f Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Tue, 30 Jul 2019 16:03:10 +0000 Subject: [PATCH] Tests for using getter in MethodInvocation. R=brianwilkerson@google.com Change-Id: If63713da5e01608b63d697360faac1fce376550b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111261 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../resolver/method_invocation_resolver.dart | 6 ++--- .../resolution/extension_method_test.dart | 21 ++++++++++++++++ .../resolution/extension_override_test.dart | 24 +++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) 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 402cde8349b..321f0cb8244 100644 --- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart @@ -339,7 +339,8 @@ class MethodInvocationResolver { return; } nameNode.staticElement = member; - _setResolution(node, member.type); + var calleeType = _getCalleeType(node, member); + _setResolution(node, calleeType); return; } @@ -371,9 +372,6 @@ class MethodInvocationResolver { throw new UnsupportedError('cascaded extension override'); } - // TODO(brianwilkerson) Handle the case where the name resolved to a getter. - // It might be that the getter returns a function that is being invoked, or - // it might be an error to have an argument list. nameNode.staticElement = member; var calleeType = _getCalleeType(node, member); _setResolution(node, calleeType); diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart index 6a039851b0e..0e6c15a9e49 100644 --- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart @@ -187,6 +187,27 @@ f(C c) { assertInvokeType(invocation, 'int Function(int)'); } + test_instance_getter_methodInvocation() async { + await assertNoErrorsInCode(''' +class C {} + +extension E on C { + double Function(int) get a => (b) => 2.0; +} + +f(C c) { + c.a(0); +} +'''); + var invocation = findNode.methodInvocation('a(0);'); + assertMethodInvocation( + invocation, + findElement.getter('a'), + 'double Function(int)', + expectedMethodNameType: 'double Function(int) Function()', + ); + } + test_instance_getter_noMatch() async { await assertErrorsInCode(r''' class C {} diff --git a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart index 44ace256d63..f6625c90981 100644 --- a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart @@ -135,6 +135,30 @@ void f(A a) { validatePropertyAccess(); } + test_getter_noPrefix_noTypeArguments_methodInvocation() async { + await assertNoErrorsInCode(''' +class A {} + +extension E on A { + double Function(int) get g => (b) => 2.0; +} + +void f(A a) { + E(a).g(0); +} +'''); + findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)'); + validateOverride(); + + var invocation = findNode.methodInvocation('g(0);'); + assertMethodInvocation( + invocation, + findElement.getter('g'), + 'double Function(int)', + expectedMethodNameType: 'double Function(int) Function()', + ); + } + test_getter_noPrefix_typeArguments() async { await assertNoErrorsInCode(''' class A {}