Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart

Issue 2876813002: Implement generalized function types. (Closed)
Patch Set: Fixes for analyzer and dart2js. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+}

Powered by Google App Engine
This is Rietveld 408576698