Index: pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart |
index 9e05eb412429e84d6dd30f98ae957c3a307b4d8b..a1fe16acc6476fd1ea34479e634651b2aac17e9b 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart |
@@ -4,19 +4,38 @@ |
library fasta.kernel_function_type_builder; |
-import 'package:kernel/ast.dart' show DartType, DynamicType, Supertype; |
+import 'package:kernel/ast.dart' |
+ show |
+ DartType, |
+ DynamicType, |
+ FunctionType, |
+ NamedType, |
+ Supertype, |
+ TypeParameter; |
import 'kernel_builder.dart' |
- show FunctionTypeBuilder, KernelTypeBuilder, LibraryBuilder; |
+ show |
+ FormalParameterBuilder, |
+ FunctionTypeBuilder, |
+ KernelFormalParameterBuilder, |
+ KernelTypeBuilder, |
+ KernelTypeVariableBuilder, |
+ LibraryBuilder, |
+ TypeVariableBuilder; |
class KernelFunctionTypeBuilder extends FunctionTypeBuilder |
implements KernelTypeBuilder { |
- KernelFunctionTypeBuilder(int charOffset, Uri fileUri, |
- KernelTypeBuilder returnType, List typeVariables, List formals) |
+ KernelFunctionTypeBuilder( |
+ int charOffset, |
+ Uri fileUri, |
+ KernelTypeBuilder returnType, |
+ List<TypeVariableBuilder> typeVariables, |
+ List<FormalParameterBuilder> formals) |
: super(charOffset, fileUri, returnType, typeVariables, formals); |
- // TODO(ahe): Return a proper function type. |
- DartType build(LibraryBuilder library) => const DynamicType(); |
+ DartType build(LibraryBuilder library) { |
+ return buildFunctionType(library, returnType, typeVariables, formals); |
+ } |
Supertype buildSupertype(LibraryBuilder library) { |
library.addCompileTimeError( |
@@ -25,3 +44,40 @@ class KernelFunctionTypeBuilder extends FunctionTypeBuilder |
return null; |
} |
} |
+ |
+FunctionType buildFunctionType( |
+ LibraryBuilder library, |
+ KernelTypeBuilder returnType, |
+ List<TypeVariableBuilder> typeVariables, |
+ List<FormalParameterBuilder> formals) { |
+ DartType builtReturnType = returnType?.build(library) ?? const DynamicType(); |
+ List<DartType> positionalParameters = <DartType>[]; |
+ List<NamedType> namedParameters; |
+ int requiredParameterCount = 0; |
+ if (formals != null) { |
+ for (KernelFormalParameterBuilder formal in formals) { |
+ DartType type = formal.type?.build(library) ?? const DynamicType(); |
+ if (formal.isPositional) { |
+ positionalParameters.add(type); |
+ if (formal.isRequired) requiredParameterCount++; |
+ } else if (formal.isNamed) { |
+ namedParameters ??= <NamedType>[]; |
+ namedParameters.add(new NamedType(formal.name, type)); |
+ } |
+ } |
+ if (namedParameters != null) { |
+ namedParameters.sort(); |
+ } |
+ } |
+ List<TypeParameter> typeParameters; |
+ if (typeVariables != null) { |
+ typeParameters = <TypeParameter>[]; |
+ for (KernelTypeVariableBuilder t in typeVariables) { |
+ typeParameters.add(t.parameter); |
+ } |
+ } |
+ return new FunctionType(positionalParameters, builtReturnType, |
+ namedParameters: namedParameters ?? const <NamedType>[], |
+ typeParameters: typeParameters ?? const <TypeParameter>[], |
+ requiredParameterCount: requiredParameterCount); |
+} |