| Index: pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart
|
| diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart
|
| index 4e6ba423446fee6bf1eebe606b319ffbc72e26c8..eb4d6cfcaaf090a9c862cdaabeac192afdff1a69 100644
|
| --- a/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart
|
| +++ b/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart
|
| @@ -128,14 +128,14 @@ class _FutureListener<S, T> {
|
| }
|
|
|
| dynamic/*T|Future<T>*/ handleValue(S sourceResult) {
|
| - return _zone.runUnary<dynamic/*T|Future<T>*/, S>(
|
| + return _zone.runUnary/*<dynamic/*T|Future<T>*/, S>*/(
|
| _onValue, sourceResult);
|
| }
|
|
|
| bool matchesErrorTest(AsyncError asyncError) {
|
| if (!hasErrorTest) return true;
|
| _FutureErrorTest test = _errorTest;
|
| - return _zone.runUnary<bool, dynamic>(_errorTest, asyncError.error);
|
| + return _zone.runUnary/*<bool, dynamic>*/(_errorTest, asyncError.error);
|
| }
|
|
|
| dynamic/*T|Future<T>*/ handleError(AsyncError asyncError) {
|
| @@ -147,7 +147,7 @@ class _FutureListener<S, T> {
|
| asyncError.error,
|
| asyncError.stackTrace);
|
| } else {
|
| - return _zone.runUnary<dynamic/*T|Future<T>*/, dynamic>(
|
| + return _zone.runUnary/*<dynamic/*T|Future<T>*/, dynamic>*/(
|
| errorCallback, asyncError.error);
|
| }
|
| }
|
| @@ -230,33 +230,33 @@ class _Future<T> implements Future<T> {
|
| _resultOrListeners = source;
|
| }
|
|
|
| - Future<E> then<E>(
|
| - FutureOr<E> f(T value), { Function onError }) {
|
| + Future/*<E>*/ then/*<E>*/(
|
| + /*=dynamic/*E|Future<E>*/*/ f(T value), { Function onError }) {
|
| Zone currentZone = Zone.current;
|
| ZoneUnaryCallback registered;
|
| if (!identical(currentZone, _ROOT_ZONE)) {
|
| - f = currentZone.registerUnaryCallback<FutureOr<E>, T>(f);
|
| + f = currentZone.registerUnaryCallback/*<dynamic, T>*/(f);
|
| if (onError != null) {
|
| - onError = _registerErrorHandler<T>(onError, currentZone);
|
| + onError = _registerErrorHandler/*<T>*/(onError, currentZone);
|
| }
|
| }
|
| - return _thenNoZoneRegistration<E>(f, onError);
|
| + return _thenNoZoneRegistration/*<E>*/(f, onError);
|
| }
|
|
|
| // This method is used by async/await.
|
| - Future<E> _thenNoZoneRegistration<E>(f(T value), Function onError) {
|
| - _Future<E> result = new _Future<E>();
|
| - _addListener(new _FutureListener<T, E>.then(result, f, onError));
|
| + Future/*<E>*/ _thenNoZoneRegistration/*<E>*/(f(T value), Function onError) {
|
| + _Future/*<E>*/ result = new _Future/*<E>*/();
|
| + _addListener(new _FutureListener/*<T, E>*/.then(result, f, onError));
|
| return result;
|
| }
|
|
|
| - Future<T> catchError(Function onError, { bool test(error) }) {
|
| - _Future<T> result = new _Future<T>();
|
| + Future/*<T>*/ catchError(Function onError, { bool test(error) }) {
|
| + _Future/*<T>*/ result = new _Future/*<T>*/();
|
| if (!identical(result._zone, _ROOT_ZONE)) {
|
| - onError = _registerErrorHandler<T>(onError, result._zone);
|
| + onError = _registerErrorHandler/*<T>*/(onError, result._zone);
|
| if (test != null) test = result._zone.registerUnaryCallback(test);
|
| }
|
| - _addListener(new _FutureListener<T, T>.catchError(
|
| + _addListener(new _FutureListener/*<T, T>*/.catchError(
|
| result, onError, test));
|
| return result;
|
| }
|
| @@ -264,9 +264,9 @@ class _Future<T> implements Future<T> {
|
| Future<T> whenComplete(action()) {
|
| _Future<T> result = new _Future<T>();
|
| if (!identical(result._zone, _ROOT_ZONE)) {
|
| - action = result._zone.registerCallback<dynamic>(action);
|
| + action = result._zone.registerCallback/*<dynamic>*/(action);
|
| }
|
| - _addListener(new _FutureListener<T, T>.whenComplete(result, action));
|
| + _addListener(new _FutureListener/*<T, T>*/.whenComplete(result, action));
|
| return result;
|
| }
|
|
|
| @@ -277,11 +277,6 @@ class _Future<T> implements Future<T> {
|
| _state = _PENDING_COMPLETE;
|
| }
|
|
|
| - void _clearPendingComplete() {
|
| - assert(_isPendingComplete);
|
| - _state = _INCOMPLETE;
|
| - }
|
| -
|
| AsyncError get _error {
|
| assert(_hasError);
|
| return _resultOrListeners;
|
| @@ -410,11 +405,7 @@ class _Future<T> implements Future<T> {
|
| try {
|
| source.then((value) {
|
| assert(target._isPendingComplete);
|
| - // The "value" may be another future if the foreign future
|
| - // implementation is mis-behaving,
|
| - // so use _complete instead of _completeWithValue.
|
| - target._clearPendingComplete(); // Clear this first, it's set again.
|
| - target._complete(value);
|
| + target._completeWithValue(value);
|
| },
|
| // TODO(floitsch): eventually we would like to make this non-optional
|
| // and dependent on the listeners of the target future. If none of
|
| @@ -659,7 +650,7 @@ class _Future<T> implements Future<T> {
|
| }
|
| }
|
|
|
| -
|
| +
|
| if (listener.handlesComplete) {
|
| handleWhenCompleteCallback();
|
| } else if (!hasError) {
|
| @@ -671,7 +662,7 @@ class _Future<T> implements Future<T> {
|
| handleError();
|
| }
|
| }
|
| -
|
| +
|
| // If we changed zone, oldZone will not be null.
|
| if (oldZone != null) Zone._leave(oldZone);
|
|
|
|
|