Add support for `Function` syntax to analyzer/CFE integration.

Fixes #33846.

Change-Id: I5b8836e55d2d3d450e368cd1e234dc01e2630269
Reviewed-on: https://dart-review.googlesource.com/65166
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 8fb175a..a3903958 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -349,6 +349,13 @@
   }
 
   @override
+  void visitGenericFunctionType(GenericFunctionType node) {
+    super.visitGenericFunctionType(node);
+    var data = _get(node.functionKeyword);
+    (node as GenericFunctionTypeImpl).type = data.inferredType;
+  }
+
+  @override
   void visitIndexExpression(IndexExpression node) {
     node.target?.accept(this);
 
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index d456789..9924ebb 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -294,6 +294,11 @@
       genericExpression("functionExpression", location, inferredType);
 
   @override
+  void functionType(int location, DartType type) {
+    _store(location, inferredType: type);
+  }
+
+  @override
   void functionTypedFormalParameter(int location, DartType type) {
     _store(location, inferredType: type);
   }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 6f40a3c..05e55e1 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -63,6 +63,13 @@
 
   @override
   @failingTest
+  test_argumentTypeNotAssignable_optionalNew() {
+    // NoSuchMethodError: The method 'encloseElement' was called on null.
+    return super.test_argumentTypeNotAssignable_optionalNew();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index 8240c6c..82823cb 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -75,20 +75,6 @@
   }
 
   @override
-  @failingTest
-  test_unnecessaryCast_function() {
-    // NoSuchMethodError: The getter 'isBottom' was called on null.
-    return super.test_unnecessaryCast_function();
-  }
-
-  @override
-  @failingTest
-  test_unnecessaryCast_function2() {
-    // NoSuchMethodError: The getter 'isBottom' was called on null.
-    return super.test_unnecessaryCast_function2();
-  }
-
-  @override
   test_unnecessaryCast_generics() async {
     // dartbug.com/18953
     // Overridden because type inference now produces more information and there
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index d5956cf..ed008ef 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -75,14 +75,6 @@
 
   @override
   @failingTest
-  test_local_type_parameter_reference_function_return_type() {
-    // type 'DynamicTypeImpl' is not a subtype of type 'TypeParameterType' in
-    // type cast
-    return super.test_local_type_parameter_reference_function_return_type();
-  }
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_unresolved_assignment_left_indexed1_simple() async {
     await super.test_unresolved_assignment_left_indexed1_simple();
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 9282ec7..739aac9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2258,8 +2258,7 @@
     DartType returnType = pop();
     List<TypeParameter> typeVariables = typeVariableBuildersToKernel(pop());
     FunctionType type = formals.toFunctionType(returnType, typeVariables);
-    // TODO(paulberry): communicate resolution information to the
-    // TypeInferenceListener (dartbug.com/33846).
+    _typeInferrer.functionType(functionToken.offset, type);
     exitLocalScope();
     push(type);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/factory.dart b/pkg/front_end/lib/src/fasta/kernel/factory.dart
index 5ede5ca..2976ba9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/factory.dart
@@ -204,6 +204,8 @@
   Expression functionExpression(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType);
 
+  Object functionType(int fileOffset, DartType type);
+
   Object functionTypedFormalParameter(int fileOffset, DartType type);
 
   Expression ifNull(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
index 31c1598..7305d14 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
@@ -303,6 +303,9 @@
   }
 
   @override
+  void functionType(int fileOffset, DartType type) {}
+
+  @override
   void functionTypedFormalParameter(int fileOffset, DartType type) {}
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
index 60e7542..f0161b3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
@@ -241,6 +241,9 @@
       ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
 
   @override
+  void functionType(int fileOffset, DartType type) {}
+
+  @override
   void functionTypedFormalParameter(int fileOffset, DartType type) {}
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index 17332eb..42aa400 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -216,6 +216,8 @@
   void functionExpression(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
+  void functionType(Location location, DartType type);
+
   void functionTypedFormalParameter(Location location, DartType type);
 
   void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
@@ -688,6 +690,8 @@
   void functionExpression(
       ExpressionJudgment judgment, location, DartType inferredType) {}
 
+  void functionType(int location, DartType type) {}
+
   void functionTypedFormalParameter(int location, DartType type) {}
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 9c31cf3..5ded6a7b 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -342,6 +342,8 @@
   Object binderForTypeVariable(
       KernelTypeVariableBuilder builder, int fileOffset, String name);
 
+  void functionType(int offset, DartType type);
+
   void functionTypedFormalParameter(int offset, DartType type);
 
   /// Performs full type inference on the given field initializer.
@@ -418,6 +420,8 @@
   void binderForTypeVariable(
       KernelTypeVariableBuilder builder, int fileOffset, String name) {}
 
+  void functionType(int offset, DartType type) {}
+
   void functionTypedFormalParameter(int offset, DartType type) {}
 
   @override
@@ -547,6 +551,10 @@
     return listener.binderForTypeVariable(builder, fileOffset, name);
   }
 
+  void functionType(int offset, DartType type) {
+    listener.functionType(offset, type);
+  }
+
   void functionTypedFormalParameter(int offset, DartType type) {
     listener.functionTypedFormalParameter(offset, type);
   }