Files
sdk/pkg/analysis_server_plugin
Sam Rawlins cbd61d792e DAS plugins: Make better use of the analysis driver
Fixes https://github.com/dart-lang/sdk/issues/62649

This change overhauls what the PluginServer does when it receives requests from DAS like watch events, overlay changes, setting context roots, and setting priority files, to use the AnalysisDriver APIs. These APIs provide a much smarter, more fine-grained mechanism for determining which files need to be re-analyzed.

This requires a lot of changes that really don't seem obvious (or just,
to me, they are not intuitive), because they relate to Streams being
processed, drained, read, etc. So I'll summarize as much as I can:

* In order to track that results coming from AnalysisDriver are
  definitely for the same AnalysisSession we are concerned with, at
  any given time, we add `_filesBeingAnalyzed` and
  `_filesBeingResolved`. These two maps are cleared any time the plugin
  isolate is notified of changes, so there is not a memory concern.
* We add a `waitForIdle` method which is just used by tests
  occasionally, in order to ensure analysis is complete.
* We tackle a related bug mentioned in the issue thread regarding
  adding or removing overlays without changing the source contents.
  There are now a few checks that old-content is not equal to
  new-content.
* Due to the more async nature of reading events off of the analysis
  driver, we have to be more particular in tests about sending
  `AnalysisSetContextRootsParams` and reading from the notification
  stream, so there are a lot of changes in tests to re-position these
  calls.

This results in massive savings in re-analysis time. Using the example in https://github.com/dart-lang/sdk/issues/62649, typing in the
`build_runner/lib/src/logging/build_log_logger.dart` file, I see the
following:

* Before this fix, every keystroke results in 183 files being
  re-analyzed by the plugin (always 183).
* After this fix:
  * keystrokes that do not result in a summary change (or maybe
    fine-grained deps analysis), like whitespace, results in 1 file
    being re-analyzed (the file I'm editing).
  * A keystroke that results in slightly changed summary, like changing
    an import to something invalid, results 2 or 4 files being
    re-analyzed.
  * A keystroke that changes the name of class BuildLogLogger (large
    change to summary) results in 9-10 files being re-analyzed.

Change-Id: Ie35053b0d90457b5b4b53bc8803188def0308d2a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/503040
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2026-05-14 09:57:59 -07:00
..
2025-11-03 11:49:49 -08:00

analysis_server_plugin package

This package offers support for writing Dart analysis server plugins, for Dart 3.10 (Flutter 3.38) and later.

Analysis server plugins empower developers to contribute their own Dart static analysis in IDEs and at the command line via dart analyze and flutter analyze. Analysis server plugins can offer the following static analyses:

  • analysis rules, which report diagnostics in the IDE, and at the command line
  • IDE quick fixes, which are local refactorings offered to users to correct a given diagnostic
  • IDE quick assists, which are local refactorings that are offered at specific syntax nodes in code, but do not necessarily correct a static code issue

Review the following documents for how to write and how to use analysis server plugins: