Ensure that function reference resolution assigns an element and type when the method is inherited.

Change-Id: I2053c625617aa03bcad9ffa920c0ff27823a0a9d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/217701
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 192c7e5..6257b73 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -656,6 +656,8 @@
         }
 
         if (method is PropertyAccessorElement) {
+          function.staticElement = method;
+          function.staticType = method.returnType;
           _resolve(node: node, rawType: method.variable.type);
           return;
         }
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index 9a56b92..92e8e49 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -578,6 +578,23 @@
         findElement.getter('foo'), 'void Function(int)');
   }
 
+  test_instanceGetter_functionTyped_inherited() async {
+    await assertNoErrorsInCode('''
+abstract class A {
+  late void Function<T>(T) foo;
+}
+abstract class B extends A {
+  bar() {
+    foo<int>;
+  }
+}
+
+''');
+
+    assertFunctionReference(findNode.functionReference('foo<int>;'),
+        findElement.getter('foo'), 'void Function(int)');
+  }
+
   test_instanceMethod() async {
     await assertNoErrorsInCode('''
 class A {