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>
Dart
An approachable, portable, and productive language for high-quality apps on any platform
Dart is:
-
Approachable: Develop with a strongly typed programming language that is consistent, concise, and offers modern language features like null safety and patterns.
-
Portable: Compile to ARM, x64, or RISC-V machine code for mobile, desktop, and backend. Compile to JavaScript or WebAssembly for the web.
-
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app. Diagnose app issues using DevTools.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
-
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
-
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
License & patents
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Using Dart
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
Building Dart
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents in our repo at docs.
Contributing to Dart
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.
Roadmap
Future plans for Dart are included in the combined Dart and Flutter roadmap on the Flutter wiki.