Index: tool/input_sdk/private/ddc_runtime/types.dart |
diff --git a/tool/input_sdk/private/ddc_runtime/types.dart b/tool/input_sdk/private/ddc_runtime/types.dart |
index 0246c6750e3decf45beb8f9fa4d30548d32e498e..c4045a4bff657f9cda99c7e85e72a2aa7aff36d2 100644 |
--- a/tool/input_sdk/private/ddc_runtime/types.dart |
+++ b/tool/input_sdk/private/ddc_runtime/types.dart |
@@ -241,7 +241,26 @@ final Typedef = JS('', ''' |
} |
'''); |
+final _typeFormalCount = JS('', 'Symbol("_typeFormalCount")'); |
+ |
_functionType(definite, returnType, args, extra) => JS('', '''(() => { |
+ // TODO(jmesserly): this is a bit of a retrofit, to easily fit |
+ // generic functions into all of the existing ways we generate function |
+ // signatures. Given `(T) => [T, [T]]` we'll return a function that does |
+ // `(T) => _functionType(definite, T, [T])` ... we could do this in the |
+ // compiler instead, at a slight cost to code size. |
+ if ($args === void 0 && $extra === void 0) { |
+ const fnTypeParts = $returnType; |
+ // A closure that computes the remaining arguments. |
+ // Return a function that makes the type. |
+ function makeGenericFnType(...types) { |
+ let parts = fnTypeParts(...types); |
+ return $_functionType($definite, parts[0], parts[1], parts[2]); |
+ } |
+ makeGenericFnType[$_typeFormalCount] = fnTypeParts.length; |
+ return makeGenericFnType; |
+ } |
+ |
// TODO(vsm): Cache / memomize? |
let optionals; |
let named; |
@@ -274,9 +293,7 @@ definiteFunctionType(returnType, args, extra) => |
typedef(name, closure) => JS('', 'new #(#, #)', Typedef, name, closure); |
-bool isDartType(type) { |
- return JS('bool', '#(#) === #', read, type, Type); |
-} |
+bool isDartType(type) => JS('bool', '#(#) === #', read, type, Type); |
typeName(type) => JS('', '''(() => { |
// Non-instance types |