From 566c85bccc642463d7f83347882551752c98069a Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Wed, 29 Jul 2026 16:58:38 -0700 Subject: [PATCH 1/6] Remove unused code in inspector_service.dart --- analysis_options.yaml | 1 - .../shared/diagnostics/inspector_service.dart | 49 +------------------ .../inspector/inspector_integration_test.dart | 20 ++++++++ 3 files changed, 22 insertions(+), 48 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 7438d8d372a..3cc274db29d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -172,7 +172,6 @@ dart_code_metrics: # excludes as findings are resolved. # Investigate internal usages of inspector logic before removing. - lib/src/screens/inspector/**_controller.dart - - lib/src/shared/diagnostics/inspector_service.dart - lib/src/shared/diagnostics/diagnostics_node.dart # This fixture has unused code for testing the debugger. - test/test_infra/fixtures/flutter_app/** diff --git a/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart b/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart index 2d4e8a794ff..eadbd00263c 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart @@ -29,7 +29,6 @@ import 'diagnostics_node.dart'; import 'generic_instance_reference.dart'; import 'object_group_api.dart'; import 'primitives/instance_ref.dart'; -import 'primitives/source_location.dart'; const _inspectorLibraryUri = 'package:flutter/src/widgets/widget_inspector.dart'; @@ -466,6 +465,7 @@ class InspectorService extends InspectorServiceBase { ); } + @visibleForTesting Future isWidgetCreationTracked() { return invokeBoolServiceMethodNoArgs( WidgetInspectorServiceExtensions.isWidgetCreationTracked.name, @@ -536,6 +536,7 @@ abstract class InspectorObjectGroupBase ); } + // ignore: unused-code, this is used in g3. Future invokeServiceMethodWithArgReturningNode( String methodName, String arg, @@ -834,27 +835,6 @@ abstract class InspectorObjectGroupBase return properties; } - Future getPropertyLocationHelper( - ClassRef classRef, - String name, - ) async { - final clazz = await inspectorLibrary.getClass(classRef, this) as Class; - for (final f in clazz.functions!) { - // TODO(pq): check for properties that match name. - if (f.name == name) { - final func = await inspectorLibrary.getFunc(f, this) as Func; - final location = func.location; - throw UnimplementedError( - 'getSourcePosition not implemented. $location', - ); - } - } - final superClass = clazz.superClass; - return superClass == null - ? null - : getPropertyLocationHelper(superClass, name); - } - Future> getListHelper( InspectorInstanceRef? instanceRef, String methodName, @@ -1135,22 +1115,6 @@ class ObjectGroup extends InspectorObjectGroupBase { ); } - Future getDetailsSubtree( - RemoteDiagnosticsNode? node, { - int subtreeDepth = 2, - }) async { - if (node == null) return null; - final args = { - 'objectGroup': groupName, - 'arg': node.valueRef.id, - 'subtreeDepth': subtreeDepth.toString(), - }; - final json = await invokeServiceMethodDaemonParams( - WidgetInspectorServiceExtensions.getDetailsSubtree.name, - args, - ); - return parseDiagnosticsNodeHelper(json as Map?); - } Future invokeSetFlexProperties( InspectorInstanceRef ref, @@ -1203,15 +1167,6 @@ class ObjectGroup extends InspectorObjectGroupBase { ), ); } - - Future> getPubRootDirectories() async { - final invocationResult = await invokeServiceMethodDaemonParams( - WidgetInspectorServiceExtensions.getPubRootDirectories.name, - {}, - ); - final directories = (invocationResult as List?)?.cast(); - return List.from(directories ?? []); - } } abstract class InspectorServiceClient { diff --git a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart index 3f09b29eb1f..7fdebb15762 100644 --- a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart +++ b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart @@ -708,3 +708,23 @@ Future _resetPubRootDirectories(InspectorService inspectorService) async { await inspectorService.addPubRootDirectories([rootLibrary]); } } + +extension _ObjectGroupTestExtension on ObjectGroup { + Future getDetailsSubtree( + RemoteDiagnosticsNode? node, { + int subtreeDepth = 2, + }) async { + if (node == null) return null; + final args = { + 'objectGroup': groupName, + 'arg': node.valueRef.id, + 'subtreeDepth': subtreeDepth.toString(), + }; + final json = await invokeServiceMethodDaemonParams( + WidgetInspectorServiceExtensions.getDetailsSubtree.name, + args, + ); + return parseDiagnosticsNodeHelper(json as Map?); + } +} + From 33f1d547c0df00a0eee8dc599067de1d05d050c1 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 30 Jul 2026 09:52:09 -0700 Subject: [PATCH 2/6] Remove unused code in inspector controllers --- analysis_options.yaml | 1 - .../inspector/inspector_controller.dart | 80 ------------------- .../inspector/inspector_tree_controller.dart | 17 +--- 3 files changed, 2 insertions(+), 96 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 3cc274db29d..edd93e1ad4c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -171,7 +171,6 @@ dart_code_metrics: # TODO(https://github.com/flutter/devtools/issues/9906) remove these # excludes as findings are resolved. # Investigate internal usages of inspector logic before removing. - - lib/src/screens/inspector/**_controller.dart - lib/src/shared/diagnostics/diagnostics_node.dart # This fixture has unused code for testing the debugger. - test/test_infra/fixtures/flutter_app/** 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 9484ecb422e..0ce23ad3040 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart @@ -223,17 +223,12 @@ class InspectorController extends DisposableController InspectorObjectGroupManager? _layoutGroups; - /// Node being highlighted due to the current hover. - InspectorTreeNode? get currentShowNode => inspectorTree.hover; - set currentShowNode(InspectorTreeNode? node) => inspectorTree.hover = node; bool flutterAppFrameReady = false; bool treeLoadStarted = false; - RemoteDiagnosticsNode? subtreeRoot; - bool programmaticSelectionChangeInProgress = false; ValueListenable get selectedNode => _selectedNode; @@ -252,8 +247,6 @@ class InspectorController extends DisposableController _implementationWidgetsHidden; final _implementationWidgetsHidden = ValueNotifier(true); - InspectorTreeNode? lastExpanded; - bool isActive = false; final valueToInspectorTreeNode = {}; @@ -262,8 +255,6 @@ class InspectorController extends DisposableController /// not perform any actions. bool visibleToUser = false; - bool highlightNodesShownInBothTrees = false; - RemoteDiagnosticsNode? get selectedDiagnostic => selectedNode.value?.diagnostic; @@ -276,10 +267,6 @@ class InspectorController extends DisposableController /// inspector tree load timing. bool firstInspectorTreeLoadCompleted = false; - FlutterTreeType getTreeType() { - return treeType; - } - Future setVisibleToUser(bool visible) async { if (visibleToUser == visible) { return; @@ -293,22 +280,10 @@ class InspectorController extends DisposableController } } - bool hasDiagnosticsValue(InspectorInstanceRef ref) { - return valueToInspectorTreeNode.containsKey(ref); - } - - RemoteDiagnosticsNode? findDiagnosticsValue(InspectorInstanceRef ref) { - return valueToInspectorTreeNode[ref]?.diagnostic; - } - void endShowNode() { highlightShowNode(null); } - bool highlightShowFromNodeInstanceRef(InspectorInstanceRef ref) { - return highlightShowNode(valueToInspectorTreeNode[ref]); - } - bool highlightShowNode(InspectorTreeNode? node) { currentShowNode = node; return true; @@ -352,9 +327,6 @@ class InspectorController extends DisposableController currentShowNode = null; _selectedNode.value = null; - lastExpanded = null; - - subtreeRoot = null; inspectorTree.root = inspectorTree.createNode(); programmaticSelectionChangeInProgress = false; @@ -622,35 +594,6 @@ class InspectorController extends DisposableController valueToInspectorTreeNode.clear(); } - void setSubtreeRoot( - RemoteDiagnosticsNode? node, - RemoteDiagnosticsNode? selection, - ) { - selection ??= node; - if (node != null && node == subtreeRoot) { - // Select the new node in the existing subtree. - applyNewSelection(selection); - return; - } - subtreeRoot = node; - if (node == null) { - // Passing in a null node indicates we should clear the subtree and free any memory allocated. - shutdownTree(false); - return; - } - - // Clear now to eliminate frame of highlighted nodes flicker. - _clearValueToInspectorTreeNodeMapping(); - unawaited(_recomputeTreeRoot(selection)); - } - - InspectorTreeNode? getSubtreeRootNode() { - if (subtreeRoot == null) { - return null; - } - return valueToInspectorTreeNode[subtreeRoot!.valueRef]; - } - void refreshSelection(RemoteDiagnosticsNode? newSelection) { newSelection ??= selectedDiagnostic; final matchingNode = findMatchingInspectorTreeNode(newSelection); @@ -676,26 +619,6 @@ class InspectorController extends DisposableController animateTo(selectedNode.value); } - void selectAndShowNode(RemoteDiagnosticsNode? node) { - if (node == null) { - return; - } - selectAndShowInspectorInstanceRef(node.valueRef); - } - - void selectAndShowInspectorInstanceRef(InspectorInstanceRef ref) { - final node = valueToInspectorTreeNode[ref]; - if (node == null) { - return; - } - setSelectedNode(node); - syncTreeSelection(); - } - - InspectorTreeNode? getTreeNode(RemoteDiagnosticsNode node) { - return valueToInspectorTreeNode[node.valueRef]; - } - @override void onFlutterFrame() { flutterAppFrameReady = true; @@ -754,8 +677,6 @@ class InspectorController extends DisposableController selectionGroups.promoteNext(); - subtreeRoot = newSelection; - applyNewSelection(newSelection); await _maybeShowNotificationForSelectedNode( @@ -804,7 +725,6 @@ class InspectorController extends DisposableController _selectedNode.value = newSelection; - lastExpanded = null; // New selected node takes precedence. endShowNode(); _updateSelectedErrorFromNode(_selectedNode.value); diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart index de13f6173f2..52e3db192bb 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart @@ -225,8 +225,6 @@ class InspectorTreeController extends DisposableController double? lastContentWidth; - InspectorTreeRow? _cachedSelectedRow; - /// All cached rows of the tree. /// /// Similar to [rowsInTree] but: @@ -290,23 +288,11 @@ class InspectorTreeController extends DisposableController InspectorTreeRow? rowAtIndex(int index) => _rowsInTree.value.safeGet(index); + @visibleForTesting double rowOffset(int index) { return (rowAtIndex(index)?.depth ?? 0) * inspectorColumnIndent; } - List getPathFromSelectedRowToRoot() { - final selectedItem = _cachedSelectedRow?.node; - if (selectedItem == null) return []; - - final pathToRoot = [selectedItem]; - InspectorTreeNode? nextParentNode = selectedItem.parent; - while (nextParentNode != null) { - pathToRoot.add(nextParentNode); - nextParentNode = nextParentNode.parent; - } - return pathToRoot.reversed.toList(); - } - set hover(InspectorTreeNode? node) { if (node == _hover) { return; @@ -527,6 +513,7 @@ class InspectorTreeController extends DisposableController return rowAtIndex(_rowIndexFromNode(node)); } + @visibleForTesting InspectorTreeRow? rowForOffset(Offset offset) { final rootLocal = root; if (rootLocal == null) return null; From 6089b558c305979131d74234a1de700087c8b28a Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 30 Jul 2026 10:47:12 -0700 Subject: [PATCH 3/6] ignore diagnostics node warnings --- analysis_options.yaml | 2 -- .../shared/diagnostics/diagnostics_node.dart | 2 ++ pubspec.lock | 36 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index edd93e1ad4c..a50ef32e527 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -170,8 +170,6 @@ dart_code_metrics: # devtools_app/. # TODO(https://github.com/flutter/devtools/issues/9906) remove these # excludes as findings are resolved. - # Investigate internal usages of inspector logic before removing. - - lib/src/shared/diagnostics/diagnostics_node.dart # This fixture has unused code for testing the debugger. - test/test_infra/fixtures/flutter_app/** rules: diff --git a/packages/devtools_app/lib/src/shared/diagnostics/diagnostics_node.dart b/packages/devtools_app/lib/src/shared/diagnostics/diagnostics_node.dart index 128f2cba2be..032080ababb 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/diagnostics_node.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/diagnostics_node.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. +// ignore_for_file: unused-code, contains the full model class for DiagnosticsNode. + /// @docImport '../console/widgets/description.dart'; library; diff --git a/pubspec.lock b/pubspec.lock index 71542ee8c28..e746a9dc16d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -61,34 +61,34 @@ packages: dependency: transitive description: name: build - sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + sha256: "45d14a0fb23e018d8287c32fc98d726ce466b231928ed9b9200f29bd3ccd39ae" url: "https://pub.dev" source: hosted - version: "4.0.6" + version: "4.0.7" build_config: dependency: transitive description: name: build_config - sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" + sha256: "94eaf6708fe64408c632ef2689ca3777b112f9421306ccf4f8c84d7c5c9f83f8" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + sha256: "8c0535c3b2f625619f4dd1036ef1127f2e77bfedf89ed2eb2676ef076e0b6712" url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.1.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + sha256: "5367e521935b102bdf1e735d2aab461e36b2edca6517662d088dd04cc39f8d16" url: "https://pub.dev" source: hosted - version: "2.15.0" + version: "2.15.1" built_collection: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: cross_file - sha256: d687bec93342bf6a764a116d15c8694ebeff10e633dc28a39dd3144f7195024e + sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" url: "https://pub.dev" source: hosted - version: "0.3.5+3" + version: "0.3.5+4" crypto: dependency: transitive description: @@ -286,10 +286,10 @@ packages: dependency: transitive description: name: file_selector_android - sha256: "6a26687fa65cbc28a5345c7ae6f227e89f0b47740978a4c475b1a625da7a331b" + sha256: "1d45e9910f68c16eb0c74f0b10097ad81aed516ea28054c027137e8f7d75e840" url: "https://pub.dev" source: hosted - version: "0.5.2+8" + version: "0.5.2+9" file_selector_ios: dependency: transitive description: @@ -682,10 +682,10 @@ packages: dependency: transitive description: name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.5.2" process: dependency: transitive description: @@ -767,10 +767,10 @@ packages: dependency: transitive description: name: source_gen - sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + sha256: a603f1fb984a7391ae5978d1b92bfaaa08b350dca5c825256f925818f7943bf5 url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" source_map_stack_trace: dependency: transitive description: @@ -967,10 +967,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "1d774bbdf6b72a0b12122fc1560c9c2d2a67db5a4a4cc2bd8a5c990ab20e3188" + sha256: f36f9f3be64c6198714492bb455c11056e33e2f85d9a0b676a48301e44fdcf47 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.2" vm_service: dependency: transitive description: From 1395576c75e912ad4c6a504197659cd38c5299a7 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 30 Jul 2026 10:48:08 -0700 Subject: [PATCH 4/6] formatting --- .../lib/src/shared/diagnostics/inspector_service.dart | 1 - .../test/screens/inspector/inspector_integration_test.dart | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart b/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart index eadbd00263c..e9837552292 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart @@ -1115,7 +1115,6 @@ class ObjectGroup extends InspectorObjectGroupBase { ); } - Future invokeSetFlexProperties( InspectorInstanceRef ref, MainAxisAlignment? mainAxisAlignment, diff --git a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart index 7fdebb15762..47eb4923e4d 100644 --- a/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart +++ b/packages/devtools_app/test/screens/inspector/inspector_integration_test.dart @@ -727,4 +727,3 @@ extension _ObjectGroupTestExtension on ObjectGroup { return parseDiagnosticsNodeHelper(json as Map?); } } - From 9543d305254f32f5e38c555c2ceb1469b4068982 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 30 Jul 2026 10:55:25 -0700 Subject: [PATCH 5/6] review comments --- .../lib/src/screens/inspector/inspector_controller.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 0ce23ad3040..b9049b0fb24 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart @@ -223,8 +223,6 @@ class InspectorController extends DisposableController InspectorObjectGroupManager? _layoutGroups; - set currentShowNode(InspectorTreeNode? node) => inspectorTree.hover = node; - bool flutterAppFrameReady = false; bool treeLoadStarted = false; @@ -285,7 +283,7 @@ class InspectorController extends DisposableController } bool highlightShowNode(InspectorTreeNode? node) { - currentShowNode = node; + inspectorTree.hover = node; return true; } @@ -325,7 +323,7 @@ class InspectorController extends DisposableController _treeGroups?.clear(isolateStopped); _selectionGroups?.clear(isolateStopped); - currentShowNode = null; + inspectorTree.hover = null; _selectedNode.value = null; inspectorTree.root = inspectorTree.createNode(); From 25cc83f6b353e8c6a818347397a569f4993d05f1 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 30 Jul 2026 11:25:44 -0700 Subject: [PATCH 6/6] remove unused getter --- .../lib/src/screens/inspector/inspector_tree_controller.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart index 52e3db192bb..957364a2f92 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart @@ -220,7 +220,6 @@ class InspectorTreeController extends DisposableController return true; } - InspectorTreeNode? get hover => _hover; InspectorTreeNode? _hover; double? lastContentWidth;