Repository navigation
[tool] Migrate DaemonCommand and DebugAdapterCommand to modular dependency injection - #190793
Conversation
117122d to
fae00c4
Compare
…e run.dart for Daemon and DebugAdapter DI
fae00c4 to
a87a721
Compare
There was a problem hiding this comment.
Code Review
This pull request refactors DaemonCommand, DebugAdapterCommand, and related domain classes to explicitly inject dependencies via ToolContext and constructor parameters, reducing reliance on global variables. The review feedback suggests replacing LocalFileSystem with MemoryFileSystem in flutter_adapter_test.dart to ensure the tests remain hermetic and do not leak resources.
|
/gemini review |
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request refactors DaemonCommand and DebugAdapterCommand to inject dependencies via ToolContext and constructors rather than relying on global variables. The review identified a compilation error in executable.dart due to an incorrect import, missing critical dependencies in Daemon.createMachineDaemon within run.dart, and formatting violations in daemon_test.dart where lines exceed standard length limits.
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request refactors the DaemonCommand, Daemon, and DebugAdapterCommand classes to remove direct references to global variables and instead inject dependencies such as FileSystem, Logger, Platform, ProcessManager, AnsiTerminal, Stdio, and FeatureFlags via constructors and ToolContext. Related commands, adapters, and unit tests are updated to support this dependency injection, and a new test file is added for DebugAdapterCommand. I have no feedback to provide.
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request refactors the daemon and debug adapter commands, servers, and domains to use dependency injection instead of relying on the global globals object. Dependencies such as FileSystem, Logger, Platform, ProcessManager, Stdio, and FeatureFlags are now explicitly passed through constructors. Corresponding tests have been updated to supply these dependencies, and a new test file has been added to verify DebugAdapterCommand properties and behavior. There are no review comments, so I have no feedback to provide.
…roid dependencies
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request refactors DaemonCommand, DebugAdapterCommand, Daemon, and its associated domains to use explicit dependency injection instead of relying on global variables, updating the corresponding tests to pass these dependencies. Feedback on these changes suggests making fileSystem a required parameter in the Daemon constructor to prevent non-hermetic fallbacks and broken shutdown hooks, and wrapping the temporary directory cleanup in tests with try-catch blocks to avoid flaky failures on Windows.
| FileSystem? fileSystem, | ||
| FileTransfer fileTransfer = const FileTransfer(), | ||
| }) { | ||
| Java? java, | ||
| this.logToStdout = false, | ||
| Logger? logger, | ||
| this.notifyingLogger, | ||
| OutputPreferences? outputPreferences, | ||
| Platform? platform, | ||
| ProcessManager? processManager, | ||
| Stdio? stdio, | ||
| SystemClock? systemClock, | ||
| AnsiTerminal? terminal, | ||
| }) : _stdio = stdio, | ||
| _logger = logger ?? BufferLogger.test(), | ||
| _fs = | ||
| fileSystem ?? | ||
| LocalFileSystem(LocalSignals.instance, Signals.defaultExitSignals, ShutdownHooks()) { |
There was a problem hiding this comment.
Simplify and Refactor Dependency Injection
Defaulting to LocalFileSystem in the Daemon constructor introduces two issues:
- Non-hermetic fallback: It can cause tests to accidentally touch the real disk if they omit the
fileSystemparameter. - Broken Shutdown Hooks: Instantiating
ShutdownHooks()directly viaShutdownHooks()creates a new instance that is not registered with the main process exit signals. Consequently, any cleanup hooks registered byLocalFileSystem(such as deleting temporary directories) will never be executed, leading to resource leaks.
Since all production and test instantiations of Daemon in this PR have already been updated to pass a FileSystem, we can make fileSystem a required parameter. This simplifies the constructor, removes the fragile fallback, and ensures hermeticity.
required FileSystem fileSystem,
FileTransfer fileTransfer = const FileTransfer(),
Java? java,
this.logToStdout = false,
Logger? logger,
this.notifyingLogger,
OutputPreferences? outputPreferences,
Platform? platform,
ProcessManager? processManager,
Stdio? stdio,
SystemClock? systemClock,
AnsiTerminal? terminal,
}) : _stdio = stdio,
_logger = logger ?? BufferLogger.test(),
_fs = fileSystem {References
- Suggest simplification and refactoring to enhance readability and maintainability. (link)
| final Directory tempDir = fs.systemTempDirectory.createTempSync( | ||
| 'dap_flutter_attach_vmServiceInfoFile', | ||
| ); | ||
| addTearDown(() => tempDir.deleteSync(recursive: true)); |
There was a problem hiding this comment.
On Windows, tempDir.deleteSync(recursive: true) can fail with a FileSystemException (such as Access Denied or Sharing Violation) if the file watcher or any other process still holds an active handle on the directory or its contents.
To prevent flaky test failures, wrap the deletion in a try-catch block to silently ignore transient deletion failures during teardown.
| addTearDown(() => tempDir.deleteSync(recursive: true)); | |
| addTearDown(() { | |
| try { | |
| tempDir.deleteSync(recursive: true); | |
| } catch (_) { | |
| // Ignore transient deletion failures on Windows. | |
| } | |
| }); |
| final Directory tempDir = fs.systemTempDirectory.createTempSync( | ||
| 'dap_flutter_attach_vmServiceInfoFile', | ||
| ); | ||
| addTearDown(() => tempDir.deleteSync(recursive: true)); |
There was a problem hiding this comment.
On Windows, tempDir.deleteSync(recursive: true) can fail with a FileSystemException (such as Access Denied or Sharing Violation) if the file watcher or any other process still holds an active handle on the directory or its contents.
To prevent flaky test failures, wrap the deletion in a try-catch block to silently ignore transient deletion failures during teardown.
| addTearDown(() => tempDir.deleteSync(recursive: true)); | |
| addTearDown(() { | |
| try { | |
| tempDir.deleteSync(recursive: true); | |
| } catch (_) { | |
| // Ignore transient deletion failures on Windows. | |
| } | |
| }); |
flutter/flutter@b444e78...63b9518 2026-09-09 [email protected] Roll Packages from 9af9c60 to 36e088a (24 revisions) (flutter/flutter#192485) 2026-09-09 [email protected] Re-add Xcode and OpenJDK dependencies to macOS wasm local_engine builders (flutter/flutter#192238) 2026-09-09 [email protected] Roll Dart SDK from 77094991d1c1 to 4be1b711b4ba (5 revisions) (flutter/flutter#192453) 2026-09-09 [email protected] [material] Use super parameters in more places (flutter/flutter#192149) 2026-09-09 [email protected] [cupertino] Use super parameters in more places (flutter/flutter#192148) 2026-09-09 [email protected] [flutter_tools] Gracefully handle EROFS and write-protected file system errors (flutter/flutter#192431) 2026-09-09 [email protected] [tool] Migrate BuildIOSCommand and BuildIOSArchiveCommand to modular dependency injection (flutter/flutter#192250) 2026-09-09 [email protected] Replace more enum instances comparison to use `equality ==` instead of `identical` and update related tests (flutter/flutter#192229) 2026-09-09 [email protected] [web] Support local screenshot and golden testing in felt test (flutter/flutter#191318) 2026-09-09 [email protected] [tool] Migrate DaemonCommand and DebugAdapterCommand to modular dependency injection (flutter/flutter#190793) 2026-09-09 [email protected] [web] Support local golden testing in flutter test (flutter/flutter#191386) 2026-09-09 [email protected] [flutter_tools] Ignore widget previews outside lib/ during LSP code generation (flutter/flutter#192326) 2026-09-09 [email protected] [flutter_tools] Read package_config.json asynchronously in loadPackageConfigWithLogging (flutter/flutter#192443) 2026-09-08 [email protected] Add precacheTestImage to flutter_test and unskip web image tests (flutter/flutter#191435) 2026-09-08 [email protected] et: Fix compile_commands.json post-processing (flutter/flutter#192395) 2026-09-08 [email protected] Refactor createDebuggingOptions and option registrations to OptionDescriptor (flutter/flutter#192307) 2026-09-08 [email protected] [flutter_tools] Fix test separation between `VersionFreshnessValidator` and `FlutterVersion.checkFlutterVersionFreshness` (flutter/flutter#191593) 2026-09-08 [email protected] [tool] Migrate EmulatorsCommand to modular dependency injection (flutter/flutter#190769) 2026-09-08 [email protected] [tool] Migrate Desktop build subcommands and toolchain to modular dependency injection (flutter/flutter#190781) 2026-09-08 [email protected] [tool] Migrate Tooling and Analysis commands to modular dependency injection (flutter/flutter#190788) 2026-09-08 [email protected] Skip KGP version validation for AGP built-in Kotlin (flutter/flutter#192206) If this roll has caused a breakage, revert this CL and set the roller to dry run mode using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…r#12814) flutter/flutter@b444e78...63b9518 2026-09-09 [email protected] Roll Packages from 9af9c60 to 36e088a (24 revisions) (flutter/flutter#192485) 2026-09-09 [email protected] Re-add Xcode and OpenJDK dependencies to macOS wasm local_engine builders (flutter/flutter#192238) 2026-09-09 [email protected] Roll Dart SDK from 77094991d1c1 to 4be1b711b4ba (5 revisions) (flutter/flutter#192453) 2026-09-09 [email protected] [material] Use super parameters in more places (flutter/flutter#192149) 2026-09-09 [email protected] [cupertino] Use super parameters in more places (flutter/flutter#192148) 2026-09-09 [email protected] [flutter_tools] Gracefully handle EROFS and write-protected file system errors (flutter/flutter#192431) 2026-09-09 [email protected] [tool] Migrate BuildIOSCommand and BuildIOSArchiveCommand to modular dependency injection (flutter/flutter#192250) 2026-09-09 [email protected] Replace more enum instances comparison to use `equality ==` instead of `identical` and update related tests (flutter/flutter#192229) 2026-09-09 [email protected] [web] Support local screenshot and golden testing in felt test (flutter/flutter#191318) 2026-09-09 [email protected] [tool] Migrate DaemonCommand and DebugAdapterCommand to modular dependency injection (flutter/flutter#190793) 2026-09-09 [email protected] [web] Support local golden testing in flutter test (flutter/flutter#191386) 2026-09-09 [email protected] [flutter_tools] Ignore widget previews outside lib/ during LSP code generation (flutter/flutter#192326) 2026-09-09 [email protected] [flutter_tools] Read package_config.json asynchronously in loadPackageConfigWithLogging (flutter/flutter#192443) 2026-09-08 [email protected] Add precacheTestImage to flutter_test and unskip web image tests (flutter/flutter#191435) 2026-09-08 [email protected] et: Fix compile_commands.json post-processing (flutter/flutter#192395) 2026-09-08 [email protected] Refactor createDebuggingOptions and option registrations to OptionDescriptor (flutter/flutter#192307) 2026-09-08 [email protected] [flutter_tools] Fix test separation between `VersionFreshnessValidator` and `FlutterVersion.checkFlutterVersionFreshness` (flutter/flutter#191593) 2026-09-08 [email protected] [tool] Migrate EmulatorsCommand to modular dependency injection (flutter/flutter#190769) 2026-09-08 [email protected] [tool] Migrate Desktop build subcommands and toolchain to modular dependency injection (flutter/flutter#190781) 2026-09-08 [email protected] [tool] Migrate Tooling and Analysis commands to modular dependency injection (flutter/flutter#190788) 2026-09-08 [email protected] Skip KGP version validation for AGP built-in Kotlin (flutter/flutter#192206) If this roll has caused a breakage, revert this CL and set the roller to dry run mode using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…r#12814) flutter/flutter@b444e78...63b9518 2026-09-09 [email protected] Roll Packages from 9af9c60 to 36e088a (24 revisions) (flutter/flutter#192485) 2026-09-09 [email protected] Re-add Xcode and OpenJDK dependencies to macOS wasm local_engine builders (flutter/flutter#192238) 2026-09-09 [email protected] Roll Dart SDK from 77094991d1c1 to 4be1b711b4ba (5 revisions) (flutter/flutter#192453) 2026-09-09 [email protected] [material] Use super parameters in more places (flutter/flutter#192149) 2026-09-09 [email protected] [cupertino] Use super parameters in more places (flutter/flutter#192148) 2026-09-09 [email protected] [flutter_tools] Gracefully handle EROFS and write-protected file system errors (flutter/flutter#192431) 2026-09-09 [email protected] [tool] Migrate BuildIOSCommand and BuildIOSArchiveCommand to modular dependency injection (flutter/flutter#192250) 2026-09-09 [email protected] Replace more enum instances comparison to use `equality ==` instead of `identical` and update related tests (flutter/flutter#192229) 2026-09-09 [email protected] [web] Support local screenshot and golden testing in felt test (flutter/flutter#191318) 2026-09-09 [email protected] [tool] Migrate DaemonCommand and DebugAdapterCommand to modular dependency injection (flutter/flutter#190793) 2026-09-09 [email protected] [web] Support local golden testing in flutter test (flutter/flutter#191386) 2026-09-09 [email protected] [flutter_tools] Ignore widget previews outside lib/ during LSP code generation (flutter/flutter#192326) 2026-09-09 [email protected] [flutter_tools] Read package_config.json asynchronously in loadPackageConfigWithLogging (flutter/flutter#192443) 2026-09-08 [email protected] Add precacheTestImage to flutter_test and unskip web image tests (flutter/flutter#191435) 2026-09-08 [email protected] et: Fix compile_commands.json post-processing (flutter/flutter#192395) 2026-09-08 [email protected] Refactor createDebuggingOptions and option registrations to OptionDescriptor (flutter/flutter#192307) 2026-09-08 [email protected] [flutter_tools] Fix test separation between `VersionFreshnessValidator` and `FlutterVersion.checkFlutterVersionFreshness` (flutter/flutter#191593) 2026-09-08 [email protected] [tool] Migrate EmulatorsCommand to modular dependency injection (flutter/flutter#190769) 2026-09-08 [email protected] [tool] Migrate Desktop build subcommands and toolchain to modular dependency injection (flutter/flutter#190781) 2026-09-08 [email protected] [tool] Migrate Tooling and Analysis commands to modular dependency injection (flutter/flutter#190788) 2026-09-08 [email protected] Skip KGP version validation for AGP built-in Kotlin (flutter/flutter#192206) If this roll has caused a breakage, revert this CL and set the roller to dry run mode using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Summary
Part 24 of the modular dependency injection migration.
DaemonCommandandDebugAdapterCommand(DAP) to modular constructor dependency injection:DaemonCommand({required super.toolContext, required AndroidContext androidContext, AndroidWorkflow? androidWorkflow, DeviceManager? deviceManager, this.hidden = false})DebugAdapterCommand({required super.toolContext, bool verboseHelp = false})AndroidContextintoDaemonCommandinstead of individual platform dependencies.vmServiceInfoFiletests execute against real disk viaLocalFileSystemfor file watching support.test/commands.shard/hermetic/daemon_test.dartanddebug_adapter_test.dartto hermetictestWithoutContext.Part of #188471