Add specialized classes for ZoneFunction<Function> to handle generics.

Type arguments cannot be generic functions, so we add specialized
classes for each generic function type we need to make ZoneFunctions for.

Fixes #41253.

BUG= http://dartbug.com/41253

Change-Id: Idf84f04576465ea9e5ea749ece4a7d843a037e46
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141884
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index fa77273..e200ad0 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -70,6 +70,42 @@
   const _ZoneFunction(this.zone, this.function);
 }
 
+class _RunNullaryZoneFunction {
+  final _Zone zone;
+  final RunHandler function;
+  const _RunNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RunUnaryZoneFunction {
+  final _Zone zone;
+  final RunUnaryHandler function;
+  const _RunUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RunBinaryZoneFunction {
+  final _Zone zone;
+  final RunBinaryHandler function;
+  const _RunBinaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterNullaryZoneFunction {
+  final _Zone zone;
+  final RegisterCallbackHandler function;
+  const _RegisterNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterUnaryZoneFunction {
+  final _Zone zone;
+  final RegisterUnaryCallbackHandler function;
+  const _RegisterUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterBinaryZoneFunction {
+  final _Zone zone;
+  final RegisterBinaryCallbackHandler function;
+  const _RegisterBinaryZoneFunction(this.zone, this.function);
+}
+
 /**
  * This class provides the specification for a forked zone.
  *
@@ -820,12 +856,12 @@
 
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
   // all fields.
-  _ZoneFunction<Function> get _run;
-  _ZoneFunction<Function> get _runUnary;
-  _ZoneFunction<Function> get _runBinary;
-  _ZoneFunction<Function> get _registerCallback;
-  _ZoneFunction<Function> get _registerUnaryCallback;
-  _ZoneFunction<Function> get _registerBinaryCallback;
+  _RunNullaryZoneFunction get _run;
+  _RunUnaryZoneFunction get _runUnary;
+  _RunBinaryZoneFunction get _runBinary;
+  _RegisterNullaryZoneFunction get _registerCallback;
+  _RegisterUnaryZoneFunction get _registerUnaryCallback;
+  _RegisterBinaryZoneFunction get _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
   _ZoneFunction<CreateTimerHandler> get _createTimer;
@@ -848,12 +884,12 @@
   // inheritable zone functions.
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
   // all fields.
-  _ZoneFunction<Function> _run;
-  _ZoneFunction<Function> _runUnary;
-  _ZoneFunction<Function> _runBinary;
-  _ZoneFunction<Function> _registerCallback;
-  _ZoneFunction<Function> _registerUnaryCallback;
-  _ZoneFunction<Function> _registerBinaryCallback;
+  _RunNullaryZoneFunction _run;
+  _RunUnaryZoneFunction _runUnary;
+  _RunBinaryZoneFunction _runBinary;
+  _RegisterNullaryZoneFunction _registerCallback;
+  _RegisterUnaryZoneFunction _registerUnaryCallback;
+  _RegisterBinaryZoneFunction _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
   _ZoneFunction<CreateTimerHandler> _createTimer;
@@ -884,22 +920,23 @@
     // specification, so it will never try to access the (null) parent.
     // All other zones have a non-null parent.
     _run = (specification.run != null)
-        ? new _ZoneFunction<Function>(this, specification.run)
+        ? new _RunNullaryZoneFunction(this, specification.run)
         : parent._run;
     _runUnary = (specification.runUnary != null)
-        ? new _ZoneFunction<Function>(this, specification.runUnary)
+        ? new _RunUnaryZoneFunction(this, specification.runUnary)
         : parent._runUnary;
     _runBinary = (specification.runBinary != null)
-        ? new _ZoneFunction<Function>(this, specification.runBinary)
+        ? new _RunBinaryZoneFunction(this, specification.runBinary)
         : parent._runBinary;
     _registerCallback = (specification.registerCallback != null)
-        ? new _ZoneFunction<Function>(this, specification.registerCallback)
+        ? new _RegisterNullaryZoneFunction(this, specification.registerCallback)
         : parent._registerCallback;
     _registerUnaryCallback = (specification.registerUnaryCallback != null)
-        ? new _ZoneFunction<Function>(this, specification.registerUnaryCallback)
+        ? new _RegisterUnaryZoneFunction(
+            this, specification.registerUnaryCallback)
         : parent._registerUnaryCallback;
     _registerBinaryCallback = (specification.registerBinaryCallback != null)
-        ? new _ZoneFunction<Function>(
+        ? new _RegisterBinaryZoneFunction(
             this, specification.registerBinaryCallback)
         : parent._registerBinaryCallback;
     _errorCallback = (specification.errorCallback != null)
@@ -1262,18 +1299,18 @@
 class _RootZone extends _Zone {
   const _RootZone();
 
-  _ZoneFunction<Function> get _run =>
-      const _ZoneFunction<Function>(_rootZone, _rootRun);
-  _ZoneFunction<Function> get _runUnary =>
-      const _ZoneFunction<Function>(_rootZone, _rootRunUnary);
-  _ZoneFunction<Function> get _runBinary =>
-      const _ZoneFunction<Function>(_rootZone, _rootRunBinary);
-  _ZoneFunction<Function> get _registerCallback =>
-      const _ZoneFunction<Function>(_rootZone, _rootRegisterCallback);
-  _ZoneFunction<Function> get _registerUnaryCallback =>
-      const _ZoneFunction<Function>(_rootZone, _rootRegisterUnaryCallback);
-  _ZoneFunction<Function> get _registerBinaryCallback =>
-      const _ZoneFunction<Function>(_rootZone, _rootRegisterBinaryCallback);
+  _RunNullaryZoneFunction get _run =>
+      const _RunNullaryZoneFunction(_rootZone, _rootRun);
+  _RunUnaryZoneFunction get _runUnary =>
+      const _RunUnaryZoneFunction(_rootZone, _rootRunUnary);
+  _RunBinaryZoneFunction get _runBinary =>
+      const _RunBinaryZoneFunction(_rootZone, _rootRunBinary);
+  _RegisterNullaryZoneFunction get _registerCallback =>
+      const _RegisterNullaryZoneFunction(_rootZone, _rootRegisterCallback);
+  _RegisterUnaryZoneFunction get _registerUnaryCallback =>
+      const _RegisterUnaryZoneFunction(_rootZone, _rootRegisterUnaryCallback);
+  _RegisterBinaryZoneFunction get _registerBinaryCallback =>
+      const _RegisterBinaryZoneFunction(_rootZone, _rootRegisterBinaryCallback);
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
       const _ZoneFunction<ErrorCallbackHandler>(_rootZone, _rootErrorCallback);
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
diff --git a/sdk_nnbd/lib/async/zone.dart b/sdk_nnbd/lib/async/zone.dart
index 3c50e19..b4e3994c 100644
--- a/sdk_nnbd/lib/async/zone.dart
+++ b/sdk_nnbd/lib/async/zone.dart
@@ -69,6 +69,42 @@
   const _ZoneFunction(this.zone, this.function);
 }
 
+class _RunNullaryZoneFunction {
+  final _Zone zone;
+  final RunHandler function;
+  const _RunNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RunUnaryZoneFunction {
+  final _Zone zone;
+  final RunUnaryHandler function;
+  const _RunUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RunBinaryZoneFunction {
+  final _Zone zone;
+  final RunBinaryHandler function;
+  const _RunBinaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterNullaryZoneFunction {
+  final _Zone zone;
+  final RegisterCallbackHandler function;
+  const _RegisterNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterUnaryZoneFunction {
+  final _Zone zone;
+  final RegisterUnaryCallbackHandler function;
+  const _RegisterUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterBinaryZoneFunction {
+  final _Zone zone;
+  final RegisterBinaryCallbackHandler function;
+  const _RegisterBinaryZoneFunction(this.zone, this.function);
+}
+
 /**
  * This class provides the specification for a forked zone.
  *
@@ -814,12 +850,12 @@
 
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
   // all fields.
-  _ZoneFunction<Function> get _run;
-  _ZoneFunction<Function> get _runUnary;
-  _ZoneFunction<Function> get _runBinary;
-  _ZoneFunction<Function> get _registerCallback;
-  _ZoneFunction<Function> get _registerUnaryCallback;
-  _ZoneFunction<Function> get _registerBinaryCallback;
+  _RunNullaryZoneFunction get _run;
+  _RunUnaryZoneFunction get _runUnary;
+  _RunBinaryZoneFunction get _runBinary;
+  _RegisterNullaryZoneFunction get _registerCallback;
+  _RegisterUnaryZoneFunction get _registerUnaryCallback;
+  _RegisterBinaryZoneFunction get _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
   _ZoneFunction<CreateTimerHandler> get _createTimer;
@@ -844,12 +880,12 @@
   // inheritable zone functions.
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
   // all fields, but we can't use generic function types as type arguments.
-  _ZoneFunction<Function> _run;
-  _ZoneFunction<Function> _runUnary;
-  _ZoneFunction<Function> _runBinary;
-  _ZoneFunction<Function> _registerCallback;
-  _ZoneFunction<Function> _registerUnaryCallback;
-  _ZoneFunction<Function> _registerBinaryCallback;
+  _RunNullaryZoneFunction _run;
+  _RunUnaryZoneFunction _runUnary;
+  _RunBinaryZoneFunction _runBinary;
+  _RegisterNullaryZoneFunction _registerCallback;
+  _RegisterUnaryZoneFunction _registerUnaryCallback;
+  _RegisterBinaryZoneFunction _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
   _ZoneFunction<CreateTimerHandler> _createTimer;
@@ -891,29 +927,29 @@
     // All other zones have a non-null parent.
     var run = specification.run;
     if (run != null) {
-      _run = _ZoneFunction<Function>(this, run);
+      _run = _RunNullaryZoneFunction(this, run);
     }
     var runUnary = specification.runUnary;
     if (runUnary != null) {
-      _runUnary = _ZoneFunction<Function>(this, runUnary);
+      _runUnary = _RunUnaryZoneFunction(this, runUnary);
     }
     var runBinary = specification.runBinary;
     if (runBinary != null) {
-      _runBinary = _ZoneFunction<Function>(this, runBinary);
+      _runBinary = _RunBinaryZoneFunction(this, runBinary);
     }
     var registerCallback = specification.registerCallback;
     if (registerCallback != null) {
-      _registerCallback = _ZoneFunction<Function>(this, registerCallback);
+      _registerCallback = _RegisterNullaryZoneFunction(this, registerCallback);
     }
     var registerUnaryCallback = specification.registerUnaryCallback;
     if (registerUnaryCallback != null) {
       _registerUnaryCallback =
-          _ZoneFunction<Function>(this, registerUnaryCallback);
+          _RegisterUnaryZoneFunction(this, registerUnaryCallback);
     }
     var registerBinaryCallback = specification.registerBinaryCallback;
     if (registerBinaryCallback != null) {
       _registerBinaryCallback =
-          _ZoneFunction<Function>(this, registerBinaryCallback);
+          _RegisterBinaryZoneFunction(this, registerBinaryCallback);
     }
     var errorCallback = specification.errorCallback;
     if (errorCallback != null) {
@@ -1274,18 +1310,18 @@
 class _RootZone extends _Zone {
   const _RootZone();
 
-  _ZoneFunction<Function> get _run =>
-      const _ZoneFunction<Function>(_rootZone, _rootRun);
-  _ZoneFunction<Function> get _runUnary =>
-      const _ZoneFunction<Function>(_rootZone, _rootRunUnary);
-  _ZoneFunction<Function> get _runBinary =>
-      const _ZoneFunction<Function>(_rootZone, _rootRunBinary);
-  _ZoneFunction<Function> get _registerCallback =>
-      const _ZoneFunction<Function>(_rootZone, _rootRegisterCallback);
-  _ZoneFunction<Function> get _registerUnaryCallback =>
-      const _ZoneFunction<Function>(_rootZone, _rootRegisterUnaryCallback);
-  _ZoneFunction<Function> get _registerBinaryCallback =>
-      const _ZoneFunction<Function>(_rootZone, _rootRegisterBinaryCallback);
+  _RunNullaryZoneFunction get _run =>
+      const _RunNullaryZoneFunction(_rootZone, _rootRun);
+  _RunUnaryZoneFunction get _runUnary =>
+      const _RunUnaryZoneFunction(_rootZone, _rootRunUnary);
+  _RunBinaryZoneFunction get _runBinary =>
+      const _RunBinaryZoneFunction(_rootZone, _rootRunBinary);
+  _RegisterNullaryZoneFunction get _registerCallback =>
+      const _RegisterNullaryZoneFunction(_rootZone, _rootRegisterCallback);
+  _RegisterUnaryZoneFunction get _registerUnaryCallback =>
+      const _RegisterUnaryZoneFunction(_rootZone, _rootRegisterUnaryCallback);
+  _RegisterBinaryZoneFunction get _registerBinaryCallback =>
+      const _RegisterBinaryZoneFunction(_rootZone, _rootRegisterBinaryCallback);
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
       const _ZoneFunction<ErrorCallbackHandler>(_rootZone, _rootErrorCallback);
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>