Skip to content

Make serviceManager.isolateManager source of truth for current isolate. #5004

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

Merged
merged 4 commits into from
Jan 4, 2023
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -1155,7 +1155,7 @@ class _LineItemState extends State<LineItem>
if (word != '') {
try {
final response = await evalService.evalAtCurrentFrame(word);
final isolateRef = serviceManager.appState.isolateRef.value;
final isolateRef = serviceManager.isolateManager.selectedIsolate.value;
if (response is! InstanceRef) return null;
final variable = DartObjectNode.fromValue(
value: response,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ import '../../shared/routing.dart';
import 'codeview_controller.dart';
import 'debugger_model.dart';

// TODO(devoncarew): Add some delayed resume value notifiers (to be used to
// help debounce stepping operations).

// Make sure this a checked in with `mute: true`.
final _log = DebugTimingLogger('debugger', mute: true);

Expand Down Expand Up @@ -82,7 +79,6 @@ class DebuggerController extends DisposableController

final appState = serviceManager.appState;

appState.setIsolateRef(null);
appState.setPausedOnBreakpoint(false);
_resuming.value = false;
_lastEvent = null;
Expand All @@ -102,14 +98,17 @@ class DebuggerController extends DisposableController
_initialize();
}

ValueListenable<IsolateRef?> get _isolate =>
serviceManager.isolateManager.selectedIsolate;

void _initialize() {
if (_initialSwitchToIsolate) {
assert(serviceManager.isolateManager.selectedIsolate.value != null);
_switchToIsolate(serviceManager.isolateManager.selectedIsolate.value);
assert(_isolate.value != null);
_switchToIsolate(_isolate.value);
}

addAutoDisposeListener(serviceManager.isolateManager.selectedIsolate, () {
_switchToIsolate(serviceManager.isolateManager.selectedIsolate.value);
addAutoDisposeListener(_isolate, () {
_switchToIsolate(_isolate.value);
});
autoDisposeStreamSubscription(
_service.onDebugEvent.listen(_handleDebugEvent),
Expand Down Expand Up @@ -156,11 +155,10 @@ class DebuggerController extends DisposableController

ValueListenable<String?> get exceptionPauseMode => _exceptionPauseMode;

bool get isSystemIsolate =>
serviceManager.appState.isolateRef.value?.isSystemIsolate ?? false;
bool get isSystemIsolate => _isolate.value?.isSystemIsolate ?? false;

String get _isolateRefId {
final id = serviceManager.appState.isolateRef.value?.id;
final id = _isolate.value?.id;
if (id == null) return '';
return id;
}
Expand All @@ -170,9 +168,7 @@ class DebuggerController extends DisposableController
// and modify to detect if app is paused from the isolate
// https://github.com/flutter/devtools/pull/4993#discussion_r1060845351

serviceManager.appState
..setIsolateRef(ref)
..setPausedOnBreakpoint(false);
serviceManager.appState.setPausedOnBreakpoint(false);
await _pause(false);

_clearCaches();
Expand Down Expand Up @@ -315,7 +311,7 @@ class DebuggerController extends DisposableController
// ignore: unused_local_variable
final status = reloadEvent.status;

final theIsolateRef = serviceManager.appState.isolateRef.value;
final theIsolateRef = _isolate.value;
if (theIsolateRef == null) return;
// Refresh the list of scripts.
final previousScriptRefs = scriptManager.sortedScripts.value;
Expand Down Expand Up @@ -469,7 +465,7 @@ class DebuggerController extends DisposableController
}

Future<void> _populateScripts(Isolate isolate) async {
final theIsolateRef = serviceManager.appState.isolateRef.value;
final theIsolateRef = _isolate.value;
if (theIsolateRef == null) return;
final scriptRefs =
await scriptManager.retrieveAndSortScripts(theIsolateRef);
Expand Down Expand Up @@ -540,7 +536,7 @@ class DebuggerController extends DisposableController
.map(
(v) => DartObjectNode.create(
v,
serviceManager.appState.isolateRef.value,
_isolate.value,
),
)
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ class ServiceConnectionManager {
connectedApp = ConnectedApp();

_appState?.dispose();
_appState = AppState();
_appState = AppState(isolateManager.selectedIsolate);

// It is critical we call vmServiceOpened on each manager class before
// performing any async operations. Otherwise, we may get end up with
Expand Down
15 changes: 6 additions & 9 deletions packages/devtools_app/lib/src/shared/connected_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'console/primitives/eval_history.dart';
import 'eval_on_dart_library.dart';
import 'globals.dart';
import 'object_tree.dart';
import 'primitives/auto_dispose.dart';
import 'title.dart';
import 'version.dart';

Expand Down Expand Up @@ -239,15 +240,9 @@ class AutocompleteCache {
}
}

class AppState {
// TODO(CoderDake or polina-c): It might be good to move the isolateRef
// lifecycle code to this context from DebuggerController.
ValueListenable<IsolateRef?> get isolateRef => _isolateRef;
final _isolateRef = ValueNotifier<IsolateRef?>(null);
void setIsolateRef(IsolateRef? value) {
if (value == isolateRef.value) return;
_isolateRef.value = value;
cache._clear();
class AppState extends DisposableController with AutoDisposeControllerMixin {
AppState(ValueListenable<IsolateRef?> isolateRef) {
addAutoDisposeListener(isolateRef, () => cache._clear());
}

// TODO(polina-c): add explanation for variables.
Expand All @@ -269,9 +264,11 @@ class AppState {

final cache = AutocompleteCache();

@override
void dispose() {
_variables.dispose();
_isPaused.dispose();
_currentFrame.dispose();
super.dispose();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class EvalService extends DisposableController with AutoDisposeControllerMixin {
}

String get _isolateRefId {
final id = serviceManager.appState.isolateRef.value?.id;
final id = serviceManager.isolateManager.selectedIsolate.value?.id;
// TODO(polina-c): it is not clear why returning '' is ok.
if (id == null) return '';
return id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ class ExpressionEvalFieldState extends State<ExpressionEvalField>

try {
// Response is either a ErrorRef, InstanceRef, or Sentinel.
final isolateRef = _appState.isolateRef.value;
final isolateRef = serviceManager.isolateManager.selectedIsolate.value;
final response = await evalService.evalAtCurrentFrame(expressionText);

// Display the response to the user.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';

void main() {
final appState = AppState();
final mockServiceManager = MockServiceConnectionManager();
when(mockServiceManager.service).thenReturn(null);
when(mockServiceManager.connectedAppInitialized).thenReturn(false);
when(mockServiceManager.connectedState).thenReturn(
ValueNotifier<ConnectedState>(const ConnectedState(false)),
);
when(mockServiceManager.appState).thenReturn(appState);
when(mockServiceManager.isolateManager).thenReturn(FakeIsolateManager());
when(mockServiceManager.appState)
.thenReturn(AppState(mockServiceManager.isolateManager.selectedIsolate));

final mockErrorBadgeManager = MockErrorBadgeManager();
when(mockServiceManager.errorBadgeManager).thenReturn(mockErrorBadgeManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ void main() {
when(mockServiceManager.connectedState).thenReturn(
ValueNotifier<ConnectedState>(const ConnectedState(false)),
);
when(mockServiceManager.appState).thenReturn(AppState());
when(mockServiceManager.isolateManager).thenReturn(FakeIsolateManager());
when(mockServiceManager.appState)
.thenReturn(AppState(mockServiceManager.isolateManager.selectedIsolate));

final mockErrorBadgeManager = MockErrorBadgeManager();
when(mockServiceManager.errorBadgeManager).thenReturn(mockErrorBadgeManager);
Expand All @@ -43,13 +45,15 @@ void main() {
testWidgets(
'displays floating debugger controls',
(WidgetTester tester) async {
final appState = AppState();
final mockConnectedApp = MockConnectedAppLegacy();
when(mockConnectedApp.isFlutterAppNow).thenReturn(true);
when(mockConnectedApp.isProfileBuildNow).thenReturn(false);
when(mockServiceManager.connectedAppInitialized).thenReturn(true);
when(mockServiceManager.connectedApp).thenReturn(mockConnectedApp);
when(mockServiceManager.appState).thenReturn(appState);
when(mockServiceManager.isolateManager).thenReturn(FakeIsolateManager());
when(mockServiceManager.appState).thenReturn(
AppState(mockServiceManager.isolateManager.selectedIsolate),
);
final mockDebuggerController = MockDebuggerController();
mockServiceManager.appState.setPausedOnBreakpoint(true);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ void main() {
when(mockServiceManager.connectedState).thenReturn(
ValueNotifier<ConnectedState>(const ConnectedState(false)),
);
when(mockServiceManager.appState).thenReturn(AppState());
when(mockServiceManager.isolateManager).thenReturn(FakeIsolateManager());
when(mockServiceManager.appState)
.thenReturn(AppState(mockServiceManager.isolateManager.selectedIsolate));

final mockErrorBadgeManager = MockErrorBadgeManager();
when(mockServiceManager.errorBadgeManager).thenReturn(mockErrorBadgeManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ Future<void> main() async {
final mockServiceManager = MockServiceConnectionManager();
when(mockServiceManager.serviceExtensionManager)
.thenReturn(FakeServiceExtensionManager());
when(mockServiceManager.appState).thenReturn(AppState());
when(mockServiceManager.isolateManager).thenReturn(FakeIsolateManager());
when(mockServiceManager.appState)
.thenReturn(AppState(mockServiceManager.isolateManager.selectedIsolate));
when(mockServiceManager.runDeviceBusyTask(Future<void>.value()))
.thenAnswer((_) => Future<void>.value());
setGlobal(ServiceConnectionManager, mockServiceManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class FakeServiceManager extends Fake implements ServiceConnectionManager {
ConnectedApp? connectedApp = MockConnectedApp();

@override
AppState appState = AppState();
late final AppState appState = AppState(isolateManager.selectedIsolate);

@override
final ConsoleService consoleService = ConsoleService();
Expand Down