diff --git a/packages/devtools_app/lib/src/extensions/extension_service.dart b/packages/devtools_app/lib/src/extensions/extension_service.dart index 19d43ab817e..7fbfcd25fe7 100644 --- a/packages/devtools_app/lib/src/extensions/extension_service.dart +++ b/packages/devtools_app/lib/src/extensions/extension_service.dart @@ -297,14 +297,14 @@ class ExtensionService extends DisposableController ...runtimeExtensions, ...staticExtensions, ].where((e) => e.name == extension.name); - await Future.wait([ + await [ for (final ext in allMatchingExtensions) server.extensionEnabledState( devtoolsOptionsFileUri: ext.devtoolsOptionsUri, extensionName: ext.name, enable: enable, ), - ]); + ].wait; await _refreshExtensionEnabledStates( availableExtensions: _currentExtensions.value.availableExtensions, ); diff --git a/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart b/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart index 0178b2030cf..ef65004887e 100644 --- a/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart +++ b/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart @@ -180,7 +180,7 @@ class BreakpointManager with DisposerMixin { } } - await Future.wait([ + await [ // Remove the breakpoints. for (final bp in breakpointsToRemove) removeBreakpoint(bp.breakpoint), // Add them back to the newer versions of those scripts. @@ -189,7 +189,7 @@ class BreakpointManager with DisposerMixin { if (scriptRef.uri == bp.scriptUri) addBreakpoint(scriptRef.id!, bp.line!), ], - ]); + ].wait; } Future> _getBreakpointsForIsolate(String isolateId) async { @@ -214,15 +214,17 @@ class BreakpointManager with DisposerMixin { }) async { _breakpoints.value = breakpoints; // Build _breakpointsWithLocation from _breakpoints. - await Future.wait( - _breakpoints.value.map(breakpointManager.createBreakpointWithLocation), - ).then((list) { - if (isolateId != _isolateRefId) { - // Current request is obsolete. - return; - } - _breakpointsWithLocation.value = list.toList()..sort(); - }); + final breakpointsWithLocation = + await _breakpoints.value + .map(breakpointManager.createBreakpointWithLocation) + .wait; + + if (isolateId != _isolateRefId) { + // Current request is obsolete. + return; + } + + _breakpointsWithLocation.value = breakpointsWithLocation.sorted(); } Future _setUpBreakpoints({ diff --git a/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart b/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart index 04c8f3b8f89..c65d410059a 100644 --- a/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart @@ -453,7 +453,7 @@ class DebuggerController extends DisposableController ); return _StackInfo( - await Future.wait(frames.map(_createStackFrameWithLocation)), + await frames.map(_createStackFrameWithLocation).wait, stack.truncated ?? false, ); } diff --git a/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart b/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart index 2e512c51d77..b7900f1286a 100644 --- a/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart @@ -254,47 +254,44 @@ class ProgramExplorerController extends DisposableController .id; Future> getObjects(Iterable objs) { - return Future.wait( - objs.map((o) => service!.getObject(isolateId!, o.id!)), - ); + return objs.map((o) => service!.getObject(isolateId!, o.id!)).wait; } Future> getFuncs( Iterable funcs, Iterable? fields, ) async { - return await Future.wait( - funcs - .where((f) => !_isSyntheticAccessor(f, fields as List)) - .map>( - (f) => service!.getObject(isolateId!, f.id!).then((f) async { - final func = f as Func; - final codeRef = func.code; - - // Populate the [Code] objects in each function if we want to - // show code nodes in the outline. - if (showCodeNodes && codeRef != null) { - final code = - await service.getObject(isolateId, codeRef.id!) as Code; - func.code = code; - Code unoptimizedCode = code; - // `func.code` could be unoptimized code, so don't bother - // fetching it again. - if (func.unoptimizedCode != null && - func.unoptimizedCode?.id! != code.id!) { - unoptimizedCode = - await service.getObject( - isolateId, - func.unoptimizedCode!.id!, - ) - as Code; - } - func.unoptimizedCode = unoptimizedCode; + return await funcs + .where((f) => !_isSyntheticAccessor(f, fields as List)) + .map>( + (f) => service!.getObject(isolateId!, f.id!).then((f) async { + final func = f as Func; + final codeRef = func.code; + + // Populate the [Code] objects in each function if we want to + // show code nodes in the outline. + if (showCodeNodes && codeRef != null) { + final code = + await service.getObject(isolateId, codeRef.id!) as Code; + func.code = code; + Code unoptimizedCode = code; + // `func.code` could be unoptimized code, so don't bother + // fetching it again. + if (func.unoptimizedCode != null && + func.unoptimizedCode?.id! != code.id!) { + unoptimizedCode = + await service.getObject( + isolateId, + func.unoptimizedCode!.id!, + ) + as Code; } - return func; - }), - ), - ); + func.unoptimizedCode = unoptimizedCode; + } + return func; + }), + ) + .wait; } try { @@ -302,21 +299,23 @@ class ProgramExplorerController extends DisposableController return; } else if (object is LibraryRef) { final lib = await service!.getObject(isolateId!, object.id!) as Library; - final results = await Future.wait([ - getObjects(lib.variables!), - getFuncs(lib.functions!, lib.variables), - ]); - lib.variables = results[0].cast(); - lib.functions = results[1].cast(); + final (variableObjects, functionObjects) = + await ( + getObjects(lib.variables!), + getFuncs(lib.functions!, lib.variables), + ).wait; + lib.variables = variableObjects.cast(); + lib.functions = functionObjects; node.updateObject(lib); } else if (object is ClassRef) { final clazz = await service!.getObject(isolateId!, object.id!) as Class; - final results = await Future.wait([ - getObjects(clazz.fields!), - getFuncs(clazz.functions!, clazz.fields), - ]); - clazz.fields = results[0].cast(); - clazz.functions = results[1].cast(); + final (fieldObjects, functionObjects) = + await ( + getObjects(clazz.fields!), + getFuncs(clazz.functions!, clazz.fields), + ).wait; + clazz.fields = fieldObjects.cast(); + clazz.functions = functionObjects; node.updateObject(clazz); } else { final obj = await service!.getObject(isolateId!, object.id!); diff --git a/packages/devtools_app/lib/src/screens/debugger/variables.dart b/packages/devtools_app/lib/src/screens/debugger/variables.dart index 7460bad14da..14a7be86e7a 100644 --- a/packages/devtools_app/lib/src/screens/debugger/variables.dart +++ b/packages/devtools_app/lib/src/screens/debugger/variables.dart @@ -54,7 +54,7 @@ class Variables extends StatelessWidget { Future onItemPressed(DartObjectNode v) async { // On expansion, lazily build the variables tree for performance reasons. if (v.isExpanded) { - await Future.wait(v.children.map(buildVariablesTree)); + await v.children.map(buildVariablesTree).wait; } } } diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart index 068f57647d2..a5749be7b47 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart @@ -331,10 +331,10 @@ class InspectorController extends DisposableController final detailsLocal = details; if (detailsLocal == null) return _waitForPendingUpdateDone(); - return Future.wait([ + return [ _waitForPendingUpdateDone(), detailsLocal._waitForPendingUpdateDone(), - ]); + ].wait; } // Note that this may be called after the controller is disposed. We need to handle nulls in the fields. diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart index b8f10af38cd..27c64d8dca2 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart @@ -129,7 +129,7 @@ class DiffPaneController extends DisposableController with Serializable { final item = SnapshotDataItem(defaultName: file.name); await _addSnapshot(HeapGraphLoaderFile(file), item); }); - await Future.wait(importers); + await importers.wait; derived._updateValues(); } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart index 84735fde240..3c777d7a6b4 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart @@ -195,7 +195,7 @@ class TracingIsolateState with Serializable { // All profile requests need to complete before we can consider the refresh // completed. - await Future.wait(profileRequests); + await profileRequests.wait; } void updateClassFilter(String newFilter, {bool force = false}) { diff --git a/packages/devtools_app/lib/src/screens/network/network_controller.dart b/packages/devtools_app/lib/src/screens/network/network_controller.dart index d2cd96e7fbd..768bb7ba3b2 100644 --- a/packages/devtools_app/lib/src/screens/network/network_controller.dart +++ b/packages/devtools_app/lib/src/screens/network/network_controller.dart @@ -310,10 +310,10 @@ class NetworkController extends DisposableController // TODO(kenz): only call these if http logging and socket profiling are not // already enabled. Listen to service manager streams for this info. - await Future.wait([ + await [ http_service.toggleHttpRequestLogging(true), networkService.toggleSocketProfiling(true), - ]); + ].wait; await togglePolling(true); } @@ -469,11 +469,11 @@ class NetworkController extends DisposableController ); } - Future fetchFullDataBeforeExport() => Future.wait( - filteredData.value.whereType().map( - (item) => item.getFullRequestData(), - ), - ); + Future fetchFullDataBeforeExport() => + filteredData.value + .whereType() + .map((item) => item.getFullRequestData()) + .wait; } /// Class for managing the set of all current sockets, and diff --git a/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart b/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart index ec9117e853a..0f37732bcdb 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart @@ -307,7 +307,7 @@ class TraceWidgetBuildsCheckbox extends StatelessWidget { value: extension.enabledValue, ); } else { - await Future.wait([ + await [ for (final extension in tracingExtensions) serviceConnection.serviceManager.serviceExtensionManager .setServiceExtensionState( @@ -315,7 +315,7 @@ class TraceWidgetBuildsCheckbox extends StatelessWidget { enabled: false, value: extension.disabledValue, ), - ]); + ].wait; } } } @@ -366,7 +366,7 @@ class TraceWidgetBuildsScopeSelector extends StatelessWidget { assert(enabled); final extension = type!.extensionForScope; final opposite = type.opposite.extensionForScope; - await Future.wait([ + await [ serviceConnection.serviceManager.serviceExtensionManager .setServiceExtensionState( opposite.extension, @@ -379,6 +379,6 @@ class TraceWidgetBuildsScopeSelector extends StatelessWidget { enabled: true, value: extension.enabledValue, ), - ]); + ].wait; } } diff --git a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart index 361450bf95a..a9b783b8dab 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart @@ -210,11 +210,10 @@ class PerformanceController extends DisposableController await futureOr(controller); } - final futures = >[]; - for (final controller in _featureControllers) { - futures.add(helper(callback, controller)); - } - await Future.wait(futures); + await [ + for (final controller in _featureControllers) + helper(callback, controller), + ].wait; } Future setActiveFeature( diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart index 4c9a8c06ef3..c2610f9fc26 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart @@ -26,10 +26,11 @@ class ClassHierarchyExplorerController { final isolateId = isolate.id!; final classList = await service.getClassList(isolateId); // TODO(bkonyi): we should cache the class list like we do the script list - final classes = await Future.wait([ - for (final cls in classList.classes!) - service.getObject(isolateId, cls.id!).then((e) => e as Class), - ]); + final classes = + await [ + for (final cls in classList.classes!) + service.getObject(isolateId, cls.id!).then((e) => e as Class), + ].wait; buildHierarchy(classes); } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart index 24aea578a48..013d5c4fdb8 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart @@ -33,7 +33,8 @@ class _VmICDataDisplayState extends State { final argumentsDescriptor = []; final entries = []; - late Future _initialized; + Future get _initialized => _initializingCompleter.future; + final Completer _initializingCompleter = Completer(); @override void initState() { @@ -64,7 +65,7 @@ class _VmICDataDisplayState extends State { final icDataEntries = icData.entries; if (icDataArgsDescriptor is Instance && icDataEntries is Instance) { populateLists(icDataArgsDescriptor, icDataEntries); - _initialized = Future.value(); + _initializingCompleter.complete(); return; } @@ -82,10 +83,10 @@ class _VmICDataDisplayState extends State { final entriesFuture = service .getObject(isolateId, icData.entries.id!) .then((e) => e as Instance); - _initialized = Future.wait([ - argumentsDescriptorFuture, - entriesFuture, - ]).then((result) => populateLists(result[0], result[1])); + final (argDescriptor, entryList) = + await (argumentsDescriptorFuture, entriesFuture).wait; + populateLists(argDescriptor, entryList); + _initializingCompleter.complete(); } @override diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart index bf5d6377680..3250f359190 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart @@ -67,9 +67,9 @@ class _VmInstanceDisplayState extends State { .then((_) => _root.expand()) .then( (_) => unawaited( - Future.wait([ + [ for (final child in _root.children) buildVariablesTree(child), - ]), + ].wait, ), ), ); diff --git a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart index ac377327d47..b0a60db4d14 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart @@ -21,12 +21,9 @@ class VMStatisticsViewController extends DisposableController { _refreshing.value = true; final vm = await _service.getVM(); _vm = vm; - _isolates = await Future.wait( - vm.isolates!.map((i) => _service.getIsolate(i.id!)), - ); - _systemIsolates = await Future.wait( - vm.systemIsolates!.map((i) => _service.getIsolate(i.id!)), - ); + _isolates = await vm.isolates!.map((i) => _service.getIsolate(i.id!)).wait; + _systemIsolates = + await vm.systemIsolates!.map((i) => _service.getIsolate(i.id!)).wait; _refreshing.value = false; } diff --git a/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart b/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart index 01729be83a8..5e151be0505 100644 --- a/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart +++ b/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart @@ -158,7 +158,7 @@ Future> _libraryMemberAndImportsAutocompletes( } } } - (await Future.wait(futures)).forEach(result.addAll); + (await futures.wait).forEach(result.addAll); } catch (_) { // Silently skip library completions if there is a failure. } @@ -227,7 +227,7 @@ Future> _libraryMemberAutocompletes( } } if (futures.isNotEmpty) { - (await Future.wait(futures)).forEach(result.addAll); + (await futures.wait).forEach(result.addAll); } } return result; diff --git a/packages/devtools_app/lib/src/shared/console/widgets/description.dart b/packages/devtools_app/lib/src/shared/console/widgets/description.dart index 4e1f4935ebb..a1145548461 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/description.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/description.dart @@ -234,7 +234,7 @@ class DiagnosticsNodeDescription extends StatelessWidget { if (!isHoverStale()) await buildVariablesTree(child); }()); } - await Future.wait(tasks); + await tasks.wait; variable.expand(); return HoverCardData( diff --git a/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart b/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart index a36dbbfd541..58f1dcbad8b 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/expandable_variable.dart @@ -57,7 +57,7 @@ class ExpandableVariable extends StatelessWidget { Future onItemPressed(DartObjectNode v) async { // On expansion, lazily build the variables tree for performance reasons. if (v.isExpanded) { - await Future.wait(v.children.map(buildVariablesTree)); + await v.children.map(buildVariablesTree).wait; } } } diff --git a/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart b/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart index 032a496739f..c68aec96c57 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart @@ -36,7 +36,7 @@ Future _addExpandableChildren( variable.addChild(child); } if (tasks.isNotEmpty) { - await Future.wait(tasks); + await tasks.wait; } } @@ -337,7 +337,7 @@ Future _addInspectorItems( tasks.add(maybeUpdateRef(child)); } if (tasks.isNotEmpty) { - await Future.wait(tasks); + await tasks.wait; unawaited(group?.dispose()); } } diff --git a/packages/devtools_app/lib/src/shared/diagnostics/variable_factory.dart b/packages/devtools_app/lib/src/shared/diagnostics/variable_factory.dart index e697ea1de99..5ffd61b7fca 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/variable_factory.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/variable_factory.dart @@ -327,7 +327,7 @@ Future> createVariablesForDiagnostics( if (diagnostic.level == DiagnosticLevel.hidden) continue; variables.add(_buildVariable(diagnostic, objectGroupApi, isolateRef)); } - return variables.isNotEmpty ? await Future.wait(variables) : const []; + return variables.isNotEmpty ? await variables.wait : const []; } List createVariablesForMap( diff --git a/packages/devtools_app/lib/src/shared/editor/editor_client.dart b/packages/devtools_app/lib/src/shared/editor/editor_client.dart index 78847d93780..8a29cc0e905 100644 --- a/packages/devtools_app/lib/src/shared/editor/editor_client.dart +++ b/packages/devtools_app/lib/src/shared/editor/editor_client.dart @@ -127,7 +127,7 @@ class EditorClient extends DisposableController } }), ); - await Future.wait([ + await [ _dtd.streamListen('Service'), _dtd.streamListen(editorStreamName).catchError((_) { // Because we currently call streamListen in two places (here and @@ -135,7 +135,7 @@ class EditorClient extends DisposableController // however we should refactor this code to better support using the DTD // connection in multiple places without them having to coordinate. }), - ]); + ].wait; } /// Close the connection to DTD. diff --git a/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart b/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart index d340d5e44a9..634a98ff2bf 100644 --- a/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart +++ b/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart @@ -288,7 +288,7 @@ class CustomPointerScrollable extends StatefulWidget { return Future.value(); } if (futures.length == 1) return futures.single; - return Future.wait(futures).then((List _) => null); + return futures.wait.then((List _) => null); } } diff --git a/packages/devtools_app/lib/src/shared/ui/common_widgets.dart b/packages/devtools_app/lib/src/shared/ui/common_widgets.dart index 81620de78ed..b69c007b2ad 100644 --- a/packages/devtools_app/lib/src/shared/ui/common_widgets.dart +++ b/packages/devtools_app/lib/src/shared/ui/common_widgets.dart @@ -1099,7 +1099,7 @@ class _JsonViewerState extends State { // Build the root node await buildVariablesTree(variable); // Build the contents of all children - await Future.wait(variable.children.map(buildVariablesTree)); + await variable.children.map(buildVariablesTree).wait; // Expand the root node to show the first level of contents variable.expand(); diff --git a/packages/devtools_app/test/test_infra/flutter_test_driver.dart b/packages/devtools_app/test/test_infra/flutter_test_driver.dart index 4cc4b6fae2e..8d1c602c4a9 100644 --- a/packages/devtools_app/test/test_infra/flutter_test_driver.dart +++ b/packages/devtools_app/test/test_infra/flutter_test_driver.dart @@ -366,10 +366,10 @@ class FlutterRunTestDriver extends FlutterTestDriver { final vmServiceLocal = vmService!; vmServiceLocal.onSend.listen((String s) => _debugPrint('==> $s')); vmServiceLocal.onReceive.listen((String s) => _debugPrint('<== $s')); - await Future.wait(>[ + await [ vmServiceLocal.streamListen(EventStreams.kIsolate), vmServiceLocal.streamListen(EventStreams.kDebug), - ]); + ].wait; // On hot restarts, the isolate ID we have for the Flutter thread will // exit so we need to invalidate our cached ID. diff --git a/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart b/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart index a24dd8ab5aa..fb82ee270c6 100644 --- a/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart +++ b/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart @@ -45,7 +45,7 @@ class SimulatedEditor { Stream get log => _logger.stream; Future _registerServices() { - return Future.wait([ + return [ _registerService(EditorMethod.getDevices, _getDevices), _registerService(EditorMethod.selectDevice, _selectDevice), _registerService(EditorMethod.getDebugSessions, _getDebugSessions), @@ -57,7 +57,7 @@ class SimulatedEditor { capabilities: {Field.supportsForceExternal: true}, ), _registerService(EditorMethod.enablePlatformType, _enablePlatformType), - ]); + ].wait; } /// Whether the editor is currently connected to DTD. diff --git a/packages/devtools_app_shared/lib/src/service/connected_app.dart b/packages/devtools_app_shared/lib/src/service/connected_app.dart index 2f0be729548..96d8cca0658 100644 --- a/packages/devtools_app_shared/lib/src/service/connected_app.dart +++ b/packages/devtools_app_shared/lib/src/service/connected_app.dart @@ -152,7 +152,7 @@ class ConnectedApp { assert(serviceManager!.isServiceAvailable); - await Future.wait([isFlutterApp, isProfileBuild, isDartWebApp]); + await [isFlutterApp, isProfileBuild, isDartWebApp].wait; _operatingSystem = serviceManager!.vm!.operatingSystem ?? unknownOS; diff --git a/packages/devtools_app_shared/lib/src/service/isolate_manager.dart b/packages/devtools_app_shared/lib/src/service/isolate_manager.dart index 5800e8f8743..9da67d86278 100644 --- a/packages/devtools_app_shared/lib/src/service/isolate_manager.dart +++ b/packages/devtools_app_shared/lib/src/service/isolate_manager.dart @@ -95,9 +95,9 @@ final class IsolateManager with DisposerMixin { Future initIsolates(List isolates) async { _clearIsolateStates(); - await Future.wait([ + await [ for (final isolateRef in isolates) _registerIsolate(isolateRef), - ]); + ].wait; // It is critical that the _serviceExtensionManager is already listening // for events indicating that new extension rpcs are registered before this diff --git a/packages/devtools_app_shared/lib/src/service/service_extension_manager.dart b/packages/devtools_app_shared/lib/src/service/service_extension_manager.dart index 96298c93879..623635227f7 100644 --- a/packages/devtools_app_shared/lib/src/service/service_extension_manager.dart +++ b/packages/devtools_app_shared/lib/src/service/service_extension_manager.dart @@ -149,10 +149,10 @@ final class ServiceExtensionManager with DisposerMixin { final extensionsToProcess = _pendingServiceExtensions.toList(); _pendingServiceExtensions.clear(); - await Future.wait([ + await [ for (final extension in extensionsToProcess) - _addServiceExtension(extension), - ]); + _addServiceExtension(extension) + ].wait; } Future _onMainIsolateChanged() async { @@ -185,15 +185,15 @@ final class ServiceExtensionManager with DisposerMixin { // Isolate has changed again. return; } - await Future.wait([ + await [ for (final extension in mainIsolate.extensionRPCs!) - _maybeAddServiceExtension(extension), - ]); + _maybeAddServiceExtension(extension) + ].wait; } else { - await Future.wait([ + await [ for (final extension in mainIsolate.extensionRPCs!) - _addServiceExtension(extension), - ]); + _addServiceExtension(extension) + ].wait; } } } diff --git a/packages/devtools_app_shared/lib/src/service/service_manager.dart b/packages/devtools_app_shared/lib/src/service/service_manager.dart index edc231654e9..3c26bf1be35 100644 --- a/packages/devtools_app_shared/lib/src/service/service_manager.dart +++ b/packages/devtools_app_shared/lib/src/service/service_manager.dart @@ -223,7 +223,7 @@ class ServiceManager { ) async { final callbacks = _lifecycleCallbacks[lifecycle] ?? >[]; - await Future.wait(callbacks.map((c) async => await c.call(service))); + await callbacks.map((c) async => await c.call(service)).wait; } final _overrides = >{}; diff --git a/packages/devtools_app_shared/lib/src/service/service_utils.dart b/packages/devtools_app_shared/lib/src/service/service_utils.dart index c560791accc..829490b0c61 100644 --- a/packages/devtools_app_shared/lib/src/service/service_utils.dart +++ b/packages/devtools_app_shared/lib/src/service/service_utils.dart @@ -76,10 +76,8 @@ Future forEachIsolateHelper( VmService vmService, Future Function(IsolateRef) callback, ) async { - final vm = await vmService.getVM(); - final futures = >[]; - for (final isolate in vm.isolates ?? []) { - futures.add(callback(isolate)); + if ((await vmService.getVM()).isolates case final vmIsolates? + when vmIsolates.isNotEmpty) { + await [for (final isolate in vmIsolates) callback(isolate)].wait; } - await Future.wait(futures); } diff --git a/packages/devtools_shared/lib/src/server/handlers/_general.dart b/packages/devtools_shared/lib/src/server/handlers/_general.dart index 378f5ba61c6..f8f7e3005c8 100644 --- a/packages/devtools_shared/lib/src/server/handlers/_general.dart +++ b/packages/devtools_shared/lib/src/server/handlers/_general.dart @@ -201,12 +201,9 @@ extension on VmService { /// 3. The isolate is the first in the list of isolates on the VM. Future get _detectMainIsolate async { final isolateRefs = (await getVM()).isolates!; - final isolateCandidates = - await Future.wait<({IsolateRef ref, Isolate isolate})>( - isolateRefs.map( - (ref) async => (ref: ref, isolate: await getIsolate(ref.id!)), - ), - ); + final isolateCandidates = await isolateRefs + .map((ref) async => (ref: ref, isolate: await getIsolate(ref.id!))) + .wait; Isolate? mainIsolate; for (final isolate in isolateCandidates) { diff --git a/packages/devtools_shared/lib/src/test/cli_test_driver.dart b/packages/devtools_shared/lib/src/test/cli_test_driver.dart index 31b0b5ae303..5808cf40e52 100644 --- a/packages/devtools_shared/lib/src/test/cli_test_driver.dart +++ b/packages/devtools_shared/lib/src/test/cli_test_driver.dart @@ -8,6 +8,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:collection/collection.dart'; import 'package:vm_service/utils.dart'; import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service_io.dart'; @@ -164,24 +165,21 @@ class CliAppFixture extends AppFixture { await waitFor(() async { const skipId = 'skip'; final vm = await serviceConnection.getVM(); - final List isolates = await Future.wait( - vm.isolates!.map( - (ref) => serviceConnection - .getIsolate(ref.id!) - // Calling getIsolate() can sometimes return a collected sentinel - // for an isolate that hasn't started yet. We can just ignore these - // as on the next trip around the Isolate will be returned. - // https://github.com/dart-lang/sdk/issues/33747 - .catchError((Object error) { - print('getIsolate(${ref.id}) failed, skipping\n$error'); - return Future.value(Isolate(id: skipId)); - }), - ), - ); - foundIsolate = isolates.firstWhere( + final isolates = await vm.isolates! + .map((ref) => serviceConnection + .getIsolate(ref.id!) + // Calling getIsolate() can sometimes return a collected sentinel + // for an isolate that hasn't started yet. We can just ignore these + // as on the next trip around the Isolate will be returned. + // https://github.com/dart-lang/sdk/issues/33747 + .catchError((Object error) { + print('getIsolate(${ref.id}) failed, skipping\n$error'); + return Future.value(Isolate(id: skipId)); + })) + .wait; + foundIsolate = isolates.firstWhereOrNull( (isolate) => - isolate!.id != skipId && isolate.pauseEvent?.kind == pauseEventKind, - orElse: () => null, + isolate.id != skipId && isolate.pauseEvent?.kind == pauseEventKind, ); return foundIsolate != null; }); diff --git a/packages/devtools_shared/lib/src/test/io_utils.dart b/packages/devtools_shared/lib/src/test/io_utils.dart index 0babcf8ed2d..84add7738ae 100644 --- a/packages/devtools_shared/lib/src/test/io_utils.dart +++ b/packages/devtools_shared/lib/src/test/io_utils.dart @@ -64,11 +64,11 @@ mixin IOMixin { } Future cancelAllStreamSubscriptions() async { - await Future.wait(streamSubscriptions.map((s) => s.cancel())); - await Future.wait([ + await streamSubscriptions.map((s) => s.cancel()).wait; + await [ stdoutController.close(), stderrController.close(), - ]); + ].wait; streamSubscriptions.clear(); } diff --git a/packages/devtools_test/lib/src/helpers/utils.dart b/packages/devtools_test/lib/src/helpers/utils.dart index 61d03d3056e..24d1945c472 100644 --- a/packages/devtools_test/lib/src/helpers/utils.dart +++ b/packages/devtools_test/lib/src/helpers/utils.dart @@ -189,7 +189,7 @@ Future loadFonts() async { await loader.load(); }); - await Future.wait(loadFontsFuture); + await loadFontsFuture.wait; } void verifyIsSearchMatch(