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