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);
}