Commit 987b2056 authored by xster's avatar xster Committed by GitHub

Delinting future awaits round 2 (#10790)

* round 2

* deal with null futures

* review

* review

* review

* review
parent d15907b5
...@@ -15,6 +15,7 @@ import '../base/logger.dart'; ...@@ -15,6 +15,7 @@ import '../base/logger.dart';
import '../base/port_scanner.dart'; import '../base/port_scanner.dart';
import '../base/process.dart'; import '../base/process.dart';
import '../base/process_manager.dart'; import '../base/process_manager.dart';
import '../base/utils.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../commands/build_apk.dart'; import '../commands/build_apk.dart';
import '../device.dart'; import '../device.dart';
...@@ -452,8 +453,10 @@ class AndroidDevice extends Device { ...@@ -452,8 +453,10 @@ class AndroidDevice extends Device {
printError('Error waiting for a debug connection: $error'); printError('Error waiting for a debug connection: $error');
return new LaunchResult.failed(); return new LaunchResult.failed();
} finally { } finally {
observatoryDiscovery.cancel(); await waitGroup<Null>(<Future<Null>>[
diagnosticDiscovery.cancel(); observatoryDiscovery.cancel(),
diagnosticDiscovery.cancel(),
]);
} }
} }
...@@ -524,8 +527,10 @@ class AndroidDevice extends Device { ...@@ -524,8 +527,10 @@ class AndroidDevice extends Device {
'shell', 'am', 'broadcast', '-a', 'io.flutter.view.DISCOVER' 'shell', 'am', 'broadcast', '-a', 'io.flutter.view.DISCOVER'
])); ]));
await new Future<Null>.delayed(const Duration(seconds: 1)); await waitGroup<Null>(<Future<Null>>[
logs.cancel(); new Future<Null>.delayed(const Duration(seconds: 1)),
logs.cancel(),
]);
return result; return result;
} }
} }
......
...@@ -11,6 +11,7 @@ import '../base/os.dart'; ...@@ -11,6 +11,7 @@ import '../base/os.dart';
import '../base/platform.dart'; import '../base/platform.dart';
import '../base/process.dart'; import '../base/process.dart';
import '../base/process_manager.dart'; import '../base/process_manager.dart';
import '../base/utils.dart';
import '../doctor.dart'; import '../doctor.dart';
import '../globals.dart'; import '../globals.dart';
import 'android_sdk.dart'; import 'android_sdk.dart';
...@@ -189,9 +190,12 @@ class AndroidWorkflow extends DoctorValidator implements Workflow { ...@@ -189,9 +190,12 @@ class AndroidWorkflow extends DoctorValidator implements Workflow {
<String>[sdkManagerPath, '--licenses'], <String>[sdkManagerPath, '--licenses'],
environment: sdkManagerEnv, environment: sdkManagerEnv,
); );
stdout.addStream(process.stdout);
stderr.addStream(process.stderr); waitGroup<Null>(<Future<Null>>[
process.stdin.addStream(stdin); stdout.addStream(process.stdout),
stderr.addStream(process.stderr),
process.stdin.addStream(stdin),
]);
final int exitCode = await process.exitCode; final int exitCode = await process.exitCode;
return exitCode == 0; return exitCode == 0;
......
...@@ -9,6 +9,7 @@ import '../globals.dart'; ...@@ -9,6 +9,7 @@ import '../globals.dart';
import 'file_system.dart'; import 'file_system.dart';
import 'io.dart'; import 'io.dart';
import 'process_manager.dart'; import 'process_manager.dart';
import 'utils.dart';
typedef String StringConverter(String string); typedef String StringConverter(String string);
...@@ -156,12 +157,15 @@ Future<int> runCommandAndStreamOutput(List<String> cmd, { ...@@ -156,12 +157,15 @@ Future<int> runCommandAndStreamOutput(List<String> cmd, {
// Wait for stdout to be fully processed // Wait for stdout to be fully processed
// because process.exitCode may complete first causing flaky tests. // because process.exitCode may complete first causing flaky tests.
await Future.wait(<Future<Null>>[ await waitGroup<Null>(<Future<Null>>[
stdoutSubscription.asFuture<Null>(), stdoutSubscription.asFuture<Null>(),
stderrSubscription.asFuture<Null>(), stderrSubscription.asFuture<Null>(),
]); ]);
stdoutSubscription.cancel();
stderrSubscription.cancel(); await waitGroup<Null>(<Future<Null>>[
stdoutSubscription.cancel(),
stderrSubscription.cancel(),
]);
return await process.exitCode; return await process.exitCode;
} }
......
...@@ -256,3 +256,14 @@ class Poller { ...@@ -256,3 +256,14 @@ class Poller {
_timer = null; _timer = null;
} }
} }
/// Returns a [Future] that completes when all given [Future]s complete.
///
/// Uses [Future.wait] but removes null elements from the provided
/// `futures` iterable first.
///
/// The returned [Future<List>] will be shorter than the given `futures` if
/// it contains nulls.
Future<List<T>> waitGroup<T>(Iterable<Future<T>> futures) {
return Future.wait<T>(futures.where((Future<T> future) => future != null));
}
...@@ -172,7 +172,8 @@ class AnalysisServer { ...@@ -172,7 +172,8 @@ class AnalysisServer {
printTrace('dart ${command.skip(1).join(' ')}'); printTrace('dart ${command.skip(1).join(' ')}');
_process = await processManager.start(command); _process = await processManager.start(command);
_process.exitCode.whenComplete(() => _process = null); // This callback hookup can't throw.
_process.exitCode.whenComplete(() => _process = null); // ignore: unawaited_futures
final Stream<String> errorStream = _process.stderr.transform(UTF8.decoder).transform(const LineSplitter()); final Stream<String> errorStream = _process.stderr.transform(UTF8.decoder).transform(const LineSplitter());
errorStream.listen(printError); errorStream.listen(printError);
......
...@@ -394,7 +394,9 @@ class AppDomain extends Domain { ...@@ -394,7 +394,9 @@ class AppDomain extends Domain {
if (options.debuggingEnabled) { if (options.debuggingEnabled) {
connectionInfoCompleter = new Completer<DebugConnectionInfo>(); connectionInfoCompleter = new Completer<DebugConnectionInfo>();
connectionInfoCompleter.future.then<Null>((DebugConnectionInfo info) { // We don't want to wait for this future to complete and callbacks won't fail.
// As it just writes to stdout.
connectionInfoCompleter.future.then<Null>((DebugConnectionInfo info) { // ignore: unawaited_futures
final Map<String, dynamic> params = <String, dynamic>{ final Map<String, dynamic> params = <String, dynamic>{
'port': info.httpUri.port, 'port': info.httpUri.port,
'wsUri': info.wsUri.toString(), 'wsUri': info.wsUri.toString(),
...@@ -405,7 +407,9 @@ class AppDomain extends Domain { ...@@ -405,7 +407,9 @@ class AppDomain extends Domain {
}); });
} }
final Completer<Null> appStartedCompleter = new Completer<Null>(); final Completer<Null> appStartedCompleter = new Completer<Null>();
appStartedCompleter.future.then<Null>((Null value) { // We don't want to wait for this future to complete and callbacks won't fail.
// As it just writes to stdout.
appStartedCompleter.future.then<Null>((Null value) { // ignore: unawaited_futures
_sendAppEvent(app, 'started'); _sendAppEvent(app, 'started');
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment