Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate service_manager to null safety. #3729

Merged
merged 7 commits into from
Feb 24, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/devtools_app/lib/src/service/service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ Future<VmServiceWrapper> _connectWithSse(
client.stream!.asBroadcastStream() as Stream<String>;
final service = VmServiceWrapper.fromNewVmService(
stream,
client.sink!.add,
client.sink.add,
uri,
);

unawaited(client.sink?.done.whenComplete(() {
unawaited(client.sink.done.whenComplete(() {
finishedCompleter.complete();
service.dispose();
}));
Expand Down
121 changes: 60 additions & 61 deletions packages/devtools_app/lib/src/service/service_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart=2.9
// ignore_for_file: import_of_legacy_library_into_null_safe

import 'dart:async';
import 'dart:core';
Expand Down Expand Up @@ -44,32 +44,32 @@ class ServiceConnectionManager {
_serviceExtensionManager = ServiceExtensionManager(isolateManager);
}

final StreamController<VmServiceWrapper> _connectionAvailableController =
StreamController<VmServiceWrapper>.broadcast();
final StreamController<VmServiceWrapper?> _connectionAvailableController =
StreamController<VmServiceWrapper?>.broadcast();

Completer<VmService> _serviceAvailable = Completer();

Future<VmService> get onServiceAvailable => _serviceAvailable.future;

bool get isServiceAvailable => _serviceAvailable.isCompleted;

VmServiceCapabilities _serviceCapabilities;
VmServiceTrafficLogger serviceTrafficLogger;
VmServiceCapabilities? _serviceCapabilities;
VmServiceTrafficLogger? serviceTrafficLogger;

Future<VmServiceCapabilities> get serviceCapabilities async {
Future<VmServiceCapabilities?> get serviceCapabilities async {
polina-c marked this conversation as resolved.
Show resolved Hide resolved
if (_serviceCapabilities == null) {
await _serviceAvailable.future;
final version = await service.getVersion();
final version = await service!.getVersion();
_serviceCapabilities = VmServiceCapabilities(version);
}
return _serviceCapabilities;
}

final _registeredServiceNotifiers = <String, ImmediateValueNotifier<bool>>{};
final _registeredServiceNotifiers = <String?, ImmediateValueNotifier<bool>>{};
polina-c marked this conversation as resolved.
Show resolved Hide resolved

Map<String, List<String>> get registeredMethodsForService =>
Map<String?, List<String?>> get registeredMethodsForService =>
_registeredMethodsForService;
final Map<String, List<String>> _registeredMethodsForService = {};
final Map<String?, List<String?>> _registeredMethodsForService = {};
polina-c marked this conversation as resolved.
Show resolved Hide resolved

final vmFlagManager = VmFlagManager();

Expand All @@ -79,33 +79,33 @@ class ServiceConnectionManager {

final consoleService = ConsoleService();

InspectorServiceBase get inspectorService => _inspectorService;
InspectorServiceBase _inspectorService;
InspectorServiceBase? get inspectorService => _inspectorService;
InspectorServiceBase? _inspectorService;

ErrorBadgeManager get errorBadgeManager => _errorBadgeManager;
final _errorBadgeManager = ErrorBadgeManager();

ServiceExtensionManager get serviceExtensionManager =>
ServiceExtensionManager? get serviceExtensionManager =>
_serviceExtensionManager;
ServiceExtensionManager _serviceExtensionManager;
ServiceExtensionManager? _serviceExtensionManager;
polina-c marked this conversation as resolved.
Show resolved Hide resolved

ConnectedApp connectedApp;
ConnectedApp? connectedApp;

VmServiceWrapper service;
VM vm;
String sdkVersion;
VmServiceWrapper? service;
VM? vm;
String? sdkVersion;

bool get hasConnection => service != null && connectedApp != null;

bool get connectedAppInitialized =>
hasConnection && connectedApp.connectedAppInitialized;
hasConnection && connectedApp!.connectedAppInitialized;

ValueListenable<ConnectedState> get connectedState => _connectedState;

final ValueNotifier<ConnectedState> _connectedState =
ValueNotifier(const ConnectedState(false));

Stream<VmServiceWrapper> get onConnectionAvailable =>
Stream<VmServiceWrapper?> get onConnectionAvailable =>
_connectionAvailableController.stream;

Stream<void> get onConnectionClosed => _connectionClosedController.stream;
Expand Down Expand Up @@ -136,18 +136,17 @@ class ServiceConnectionManager {
/// Call a service that is registered by exactly one client.
Future<Response> callService(
String name, {
String isolateId,
Map args,
String? isolateId,
Map? args,
polina-c marked this conversation as resolved.
Show resolved Hide resolved
}) async {
final registered = _registeredMethodsForService[name] ?? const [];
if (registered.isEmpty) {
throw Exception('There are no registered methods for service "$name"');
}
assert(isolateId != null);
return service.callMethod(
registered.first,
return service!.callMethod(
registered.first!,
isolateId: isolateId,
args: args,
args: args as Map<String, dynamic>?,
);
}

Expand All @@ -160,15 +159,15 @@ class ServiceConnectionManager {
}

Future<void> vmServiceOpened(
VmServiceWrapper service, {
@required Future<void> onClosed,
VmServiceWrapper? service, {
polina-c marked this conversation as resolved.
Show resolved Hide resolved
required Future<void> onClosed,
}) async {
if (service == this.service) {
// Service already opened.
return;
}
this.service = service;
await service.initServiceVersions();
await service!.initServiceVersions();
if (_serviceAvailable.isCompleted) {
_serviceAvailable = Completer();
}
Expand All @@ -179,9 +178,9 @@ class ServiceConnectionManager {
// race conditions where managers cannot listen for events soon enough.
isolateManager.vmServiceOpened(service);
consoleService.vmServiceOpened(service);
serviceExtensionManager.vmServiceOpened(service, connectedApp);
serviceExtensionManager!.vmServiceOpened(service, connectedApp);
polina-c marked this conversation as resolved.
Show resolved Hide resolved
await vmFlagManager.vmServiceOpened(service);
await timelineStreamManager.vmServiceOpened(service, connectedApp);
await timelineStreamManager.vmServiceOpened(service, connectedApp!);
// This needs to be called last in the above group of `vmServiceOpened`
// calls.
errorBadgeManager.vmServiceOpened(service);
Expand All @@ -204,9 +203,9 @@ class ServiceConnectionManager {
// A different service has been opened.
return;
}
sdkVersion = vm.version;
if (sdkVersion.contains(' ')) {
sdkVersion = sdkVersion.substring(0, sdkVersion.indexOf(' '));
sdkVersion = vm!.version;
if (sdkVersion?.contains(' ') == true) {
sdkVersion = sdkVersion!.substring(0, sdkVersion!.indexOf(' '));
}

if (_serviceAvailable.isCompleted) {
Expand Down Expand Up @@ -279,9 +278,9 @@ class ServiceConnectionManager {

_connectedState.value = const ConnectedState(true);

final isolates = [
...vm.isolates,
if (preferences.vmDeveloperModeEnabled.value) ...vm.systemIsolates,
final List<IsolateRef> isolates = [
polina-c marked this conversation as resolved.
Show resolved Hide resolved
...vm?.isolates ?? [],
if (preferences.vmDeveloperModeEnabled.value) ...vm?.systemIsolates ?? [],
];

await isolateManager.init(isolates);
Expand All @@ -292,7 +291,7 @@ class ServiceConnectionManager {

// This needs to be called before calling
// `ga.setupUserApplicationDimensions()`.
await connectedApp.initializeValues();
await connectedApp!.initializeValues();
if (service != this.service) {
// A different service has been opened.
return;
Expand Down Expand Up @@ -330,7 +329,7 @@ class ServiceConnectionManager {

vmFlagManager.vmServiceClosed();
timelineStreamManager.vmServiceClosed();
serviceExtensionManager.vmServiceClosed();
serviceExtensionManager!.vmServiceClosed();

serviceTrafficLogger?.dispose();

Expand All @@ -348,14 +347,14 @@ class ServiceConnectionManager {

/// This can throw an [RPCError].
Future<void> performHotReload() async {
return await _callServiceOnMainIsolate(
await _callServiceOnMainIsolate(
registrations.hotReload.service,
);
}

/// This can throw an [RPCError].
Future<void> performHotRestart() async {
return await _callServiceOnMainIsolate(
await _callServiceOnMainIsolate(
registrations.hotRestart.service,
);
}
Expand All @@ -367,11 +366,11 @@ class ServiceConnectionManager {
}

Future<void> sendDwdsEvent({
@required String screen,
@required String action,
required String screen,
required String action,
}) async {
if (!kIsWeb) return;
return await _callServiceExtensionOnMainIsolate(registrations.dwdsSendEvent,
await _callServiceExtensionOnMainIsolate(registrations.dwdsSendEvent,
args: {
'type': 'DevtoolsEvent',
'payload': {
Expand All @@ -383,16 +382,16 @@ class ServiceConnectionManager {

Future<Response> _callServiceOnMainIsolate(String name) async {
final isolate = await whenValueNonNull(isolateManager.mainIsolate);
return await callService(name, isolateId: isolate.id);
return await callService(name, isolateId: isolate.id!);
}

Future<Response> _callServiceExtensionOnMainIsolate(
String method, {
Map<String, dynamic> args,
Map<String, dynamic>? args,
}) async {
final isolate = await whenValueNonNull(isolateManager.mainIsolate);

return await service.callServiceExtension(
return await service!.callServiceExtension(
method,
args: args,
isolateId: isolate.id,
Expand All @@ -411,7 +410,7 @@ class ServiceConnectionManager {
final flutterViewListResponse = await _callServiceExtensionOnMainIsolate(
registrations.flutterListViews);
final List<dynamic> views =
flutterViewListResponse.json['views'].cast<Map<String, dynamic>>();
flutterViewListResponse.json!['views'].cast<Map<String, dynamic>>();

// Each isolate should only have one FlutterView.
final flutterView = views.firstWhere(
Expand All @@ -435,23 +434,23 @@ class ServiceConnectionManager {
/// Call to returns JSON payload 'EstimateRasterCacheMemory' with two entries:
/// layerBytes - layer raster cache entries in bytes
/// pictureBytes - picture raster cache entries in bytes
Future<Response> get rasterCacheMetrics async {
if (connectedApp == null || !await connectedApp.isFlutterApp) {
Future<Response?> get rasterCacheMetrics async {
if (connectedApp == null || !await connectedApp!.isFlutterApp) {
return null;
}

final viewId = await flutterViewId;

return await _callServiceExtensionOnMainIsolate(
registrations.flutterEngineEstimateRasterCache,
args: <String, String>{
args: <String, String?>{
polina-c marked this conversation as resolved.
Show resolved Hide resolved
'viewId': viewId,
},
);
}

Future<double> get queryDisplayRefreshRate async {
if (connectedApp == null || !await connectedApp.isFlutterApp) {
Future<double?> get queryDisplayRefreshRate async {
if (connectedApp == null || !await connectedApp!.isFlutterApp) {
return null;
}

Expand All @@ -462,26 +461,26 @@ class ServiceConnectionManager {
registrations.displayRefreshRate,
args: {'viewId': viewId},
);
final double fps = displayRefreshRateResponse.json['fps'];
final double? fps = displayRefreshRateResponse.json!['fps'];
polina-c marked this conversation as resolved.
Show resolved Hide resolved

// The Flutter engine returns 0.0 if the refresh rate is unknown. Return
// [defaultRefreshRate] instead.
if (fps == unknownRefreshRate) {
return defaultRefreshRate;
}

return fps.roundToDouble();
return fps!.roundToDouble();
}

bool libraryUriAvailableNow(String uri) {
bool libraryUriAvailableNow(String? uri) {
if (uri == null) return false;
assert(_serviceAvailable.isCompleted);
assert(serviceManager.isolateManager.mainIsolate.value != null);
final isolate = isolateManager.mainIsolateDebuggerState.isolateNow;
assert(isolate != null);
return isolate.libraries
final isolate = isolateManager.mainIsolateDebuggerState!.isolateNow!;
return (isolate.libraries ?? [])
.map((ref) => ref.uri)
.toList()
.any((u) => u.startsWith(uri));
.any((u) => u?.startsWith(uri) == true);
}

Future<bool> libraryUriAvailable(String uri) async {
Expand All @@ -497,7 +496,7 @@ class VmServiceCapabilities {
final Version version;

bool get supportsGetScripts =>
version.major > 3 || (version.major == 3 && version.minor >= 12);
version.major! > 3 || (version.major == 3 && version.minor! >= 12);
}

class ConnectedState {
Expand Down
2 changes: 1 addition & 1 deletion packages/devtools_app/lib/src/shared/connected_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class ConnectedApp {
}

// If eval works we're not a profile build.
final io = EvalOnDartLibrary('dart:io', serviceManager.service);
final io = EvalOnDartLibrary('dart:io', serviceManager.service!);
// Do not log the error if this eval fails - we expect it to fail for a
// profile build.
final value = await io.eval(
Expand Down
4 changes: 2 additions & 2 deletions packages/devtools_app/lib/src/shared/console_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ class ConsoleService extends Disposer {
bool _stdioTrailingNewline = false;

ObjectGroupBase? get objectGroup {
final inspectorService = serviceManager.inspectorService;
final inspectorService = serviceManager.inspectorService!;
if (_objectGroup?.inspectorService == inspectorService) {
return _objectGroup;
}
Expand Down Expand Up @@ -231,7 +231,7 @@ class ConsoleService extends Disposer {
void _handleExtensionEvent(Event e) async {
if (e.extensionKind == 'Flutter.Error' ||
e.extensionKind == 'Flutter.Print') {
if (serviceManager.connectedApp.isProfileBuildNow != true) {
if (serviceManager.connectedApp?.isProfileBuildNow != true) {
// The app isn't a debug build.
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class FrameworkController {
serviceManager.connectedState.addListener(() {
final connectionState = serviceManager.connectedState.value;
if (connectionState.connected) {
_connectedController.add(serviceManager.service.connectedUri);
_connectedController.add(serviceManager.service!.connectedUri);
} else {
_disconnectedController.add(null);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/devtools_app/lib/src/shared/scaffold.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ class DevToolsScaffoldState extends State<DevToolsScaffold>
if (isExternalBuild) return;
if (_internalFlutterWebWarningShown) return;

serviceManager.onConnectionAvailable?.listen((_) {
serviceManager.onConnectionAvailable.listen((_) {
if (serviceManager.connectedApp!.isFlutterWebAppNow) {
_showWarning(const InternalFlutterWebWarningText());
_internalFlutterWebWarningShown = true;
Expand Down
Loading