From 683ef059f52100a8a7bc01162ab066f64d27d829 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 12 Jan 2026 11:28:17 -0800 Subject: [PATCH] Add a --no-plugins option to prevent analyzer plugins from running Fixes https://github.com/dart-lang/sdk/issues/62353 Change-Id: I902badd0a7a072b98691d88ad7b382828227b1fc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/471660 Reviewed-by: Brian Wilkerson Commit-Queue: Samuel Rawlins --- .../lib/src/analysis_server.dart | 7 ++++++- .../lib/src/legacy_analysis_server.dart | 3 +++ .../lib/src/lsp/lsp_analysis_server.dart | 3 ++- .../lib/src/plugin/plugin_watcher.dart | 21 ++++++++++++++++--- .../lib/src/server/driver.dart | 10 +++++++++ .../test/src/plugin/plugin_watcher_test.dart | 2 +- pkg/dartdev/lib/src/analysis_server.dart | 6 +++++- pkg/dartdev/lib/src/commands/analyze.dart | 4 ++++ pkg/dartdev/lib/src/commands/fix.dart | 3 +++ pkg/dartdev/test/analysis_server_test.dart | 2 ++ 10 files changed, 54 insertions(+), 7 deletions(-) diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart index 9988c221799..8577ddfce86 100644 --- a/pkg/analysis_server/lib/src/analysis_server.dart +++ b/pkg/analysis_server/lib/src/analysis_server.dart @@ -310,6 +310,7 @@ abstract class AnalysisServer { PluginManager? pluginManager, MessageSchedulerListener? messageSchedulerListener, this.performanceLogger, + required bool usePlugins, }) : resourceProvider = OverlayResourceProvider(baseResourceProvider), pubApi = PubApi( instrumentationService, @@ -359,7 +360,11 @@ abstract class AnalysisServer { instrumentationService, sessionLogger, ); - var pluginWatcher = PluginWatcher(resourceProvider, pluginManager); + var pluginWatcher = PluginWatcher( + resourceProvider, + pluginManager, + pluginsAreEnabled: usePlugins, + ); var logName = options.newAnalysisDriverLog; if (logName != null) { diff --git a/pkg/analysis_server/lib/src/legacy_analysis_server.dart b/pkg/analysis_server/lib/src/legacy_analysis_server.dart index 1200a59692e..7c78bbc339f 100644 --- a/pkg/analysis_server/lib/src/legacy_analysis_server.dart +++ b/pkg/analysis_server/lib/src/legacy_analysis_server.dart @@ -180,6 +180,8 @@ class AnalysisServerOptions { /// Whether to enable fine-grained dependencies. bool withFineDependencies = false; + + bool usePlugins = true; } /// Instances of the class [LegacyAnalysisServer] implement a server that @@ -416,6 +418,7 @@ class LegacyAnalysisServer extends AnalysisServer { httpClient, processRunner, NotificationManager(channel, baseResourceProvider.pathContext), + usePlugins: options.usePlugins, ) { var contextManagerCallbacks = ServerContextManagerCallbacks( this, diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart index 1c9732288d1..a341b1566d8 100644 --- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart +++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart @@ -164,6 +164,7 @@ class LspAnalysisServer extends AnalysisServer { httpClient, processRunner, LspNotificationManager(baseResourceProvider.pathContext), + usePlugins: options.usePlugins, ) { notificationManager.server = this; messageHandler = UninitializedStateMessageHandler(this); @@ -264,8 +265,8 @@ class LspAnalysisServer extends AnalysisServer { } @override + @visibleForTesting set pluginManager(PluginManager value) { - // we exchange the plugin manager in tests super.pluginManager = value; _pluginChangeSubscription?.cancel(); diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart index 4a103cee9e7..eb7c17cbe52 100644 --- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart +++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart @@ -31,12 +31,25 @@ class PluginWatcher implements DriverWatcher { final Map _driverInfo = {}; + final bool _pluginsAreEnabled; + /// Initialize a newly created plugin watcher. - PluginWatcher(this.resourceProvider, this.manager) - : _locator = PluginLocator(resourceProvider); + PluginWatcher( + this.resourceProvider, + this.manager, { + required bool pluginsAreEnabled, + }) : _locator = PluginLocator(resourceProvider), + _pluginsAreEnabled = pluginsAreEnabled; @override void addedDriver(AnalysisDriver driver) { + if (!_pluginsAreEnabled) { + // Call the plugin manager "initialized." + if (!manager.initializedCompleter.isCompleted) { + manager.initializedCompleter.complete(); + } + return; + } var contextRoot = driver.analysisContext!.contextRoot; _driverInfo[driver] = _DriverInfo(contextRoot, [ contextRoot.root.path, @@ -66,9 +79,11 @@ class PluginWatcher implements DriverWatcher { _addPlugins(driver); } - /// The context manager has just removed the given analysis [driver]. @override void removedDriver(AnalysisDriver driver) { + if (!_pluginsAreEnabled) { + return; + } var info = _driverInfo[driver]; if (info == null) { throw StateError('Cannot remove a driver that was not added'); diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart index 8cfbba0680c..3ff090490a6 100644 --- a/pkg/analysis_server/lib/src/server/driver.dart +++ b/pkg/analysis_server/lib/src/server/driver.dart @@ -155,6 +155,8 @@ class Driver implements ServerStarter { /// The name of the flag to enable fine-grained dependencies. static const String withFineDependenciesOption = 'with-fine-dependencies'; + static const String pluginsFlag = 'plugins'; + /// The builder for attachments that should be included into crash reports. CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder = CrashReportingAttachmentsBuilder.empty; @@ -221,6 +223,8 @@ class Driver implements ServerStarter { var sdkConfig = SdkConfiguration.readFromSdk(); analysisServerOptions.configurationOverrides = sdkConfig; + analysisServerOptions.usePlugins = results.flag(pluginsFlag); + // Analytics (legacy, and unified) var disableAnalyticsForSession = results.flag(suppressAnalyticsFlag); @@ -948,6 +952,12 @@ class Driver implements ServerStarter { help: 'disable all search features', hide: true, ); + parser.addFlag( + pluginsFlag, + help: 'Use analyzer plugins', + defaultsTo: true, + hide: true, + ); parser.addFlag( disableSilentAnalysisExceptionsOption, negatable: false, diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart index 2b109ba0e03..2a4d664424e 100644 --- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart +++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart @@ -28,7 +28,7 @@ class PluginWatcherTest extends AbstractContextTest { void setUp() { super.setUp(); manager = TestPluginManager(); - watcher = PluginWatcher(resourceProvider, manager); + watcher = PluginWatcher(resourceProvider, manager, pluginsAreEnabled: true); } Future test_addedDriver() async { diff --git a/pkg/dartdev/lib/src/analysis_server.dart b/pkg/dartdev/lib/src/analysis_server.dart index 53c0c6627d0..75d33bf2689 100644 --- a/pkg/dartdev/lib/src/analysis_server.dart +++ b/pkg/dartdev/lib/src/analysis_server.dart @@ -34,11 +34,13 @@ class AnalysisServer { this.cacheDirectoryPath, required this.commandName, required this.argResults, + required bool usePlugins, this.enabledExperiments = const [], this.disableStatusNotificationDebouncing = false, this.suppressAnalytics = false, bool useAotSnapshot = false, - }) : _useAotSnapshot = useAotSnapshot; + }) : _useAotSnapshot = useAotSnapshot, + _usePlugins = usePlugins; final String? cacheDirectoryPath; final File? packagesFile; @@ -50,6 +52,7 @@ class AnalysisServer { final bool disableStatusNotificationDebouncing; final bool suppressAnalytics; final bool _useAotSnapshot; + final bool _usePlugins; Process? _process; @@ -212,6 +215,7 @@ class AnalysisServer { if (packagesFile != null) '--packages=${packagesFile!.path}', if (enabledExperiments.isNotEmpty) '--$experimentFlagName=${enabledExperiments.join(',')}', + if (!_usePlugins) '--no-plugins' ]; log.trace('$executable ${arguments.join(' ')}'); diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart index 6678090612e..714bdbfcbec 100644 --- a/pkg/dartdev/lib/src/commands/analyze.dart +++ b/pkg/dartdev/lib/src/commands/analyze.dart @@ -96,6 +96,8 @@ class AnalyzeCommand extends DartdevCommand { defaultsTo: true, hide: true, ) + ..addFlag('plugins', + help: 'Use analyzer plugins', defaultsTo: true, hide: true) ..addExperimentalFlags(); } @@ -136,6 +138,7 @@ class AnalyzeCommand extends DartdevCommand { final machineFormat = args.option('format') == 'machine'; final jsonFormat = args.option('format') == 'json'; final printMemory = args.flag('memory') && jsonFormat; + final usePlugins = args.flag('plugins'); io.Directory sdkPath; final useAotSnapshot = args.flag(useAotSnapshotFlag); @@ -189,6 +192,7 @@ class AnalyzeCommand extends DartdevCommand { cacheDirectoryPath: args.option('cache'), commandName: 'analyze', argResults: args, + usePlugins: usePlugins, disableStatusNotificationDebouncing: true, enabledExperiments: args.enabledExperiments, suppressAnalytics: suppressAnalytics, diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart index 9d92e91f150..ddfb979e095 100644 --- a/pkg/dartdev/lib/src/commands/fix.dart +++ b/pkg/dartdev/lib/src/commands/fix.dart @@ -128,6 +128,9 @@ To use the tool, run either ['dart fix --dry-run'] for a preview of the proposed [target], commandName: 'fix', argResults: argResults, + // TODO(srawlins): Flip to `true` (or flag value) when plugins can bulk + // fix. + usePlugins: false, suppressAnalytics: suppressAnalytics, enabledExperiments: args.enabledExperiments, useAotSnapshot: args.flag(useAotSnapshotFlag), diff --git a/pkg/dartdev/test/analysis_server_test.dart b/pkg/dartdev/test/analysis_server_test.dart index 5d2ea30886d..4d1db6a2c26 100644 --- a/pkg/dartdev/test/analysis_server_test.dart +++ b/pkg/dartdev/test/analysis_server_test.dart @@ -28,6 +28,7 @@ void main() { [p.dir], commandName: 'testing', argResults: null, + usePlugins: false, suppressAnalytics: true, ); await server.start(); @@ -41,6 +42,7 @@ void main() { [p.dir], commandName: 'testing', argResults: null, + usePlugins: false, suppressAnalytics: true, ); await server.start();