Flow analysis: add assertions to verify that API is used correctly This change adds assertions to ensure that the first phase of flow analysis (calls to the AssignedVariables class) is complete before the FlowAnalysis class is created. It also calls AssignedVariables.finish (which does additional assertions) from the FlowAnalysis constructor (if the client hasn't done so already). Adding these assersions exposed a few minor (but benign) bugs in the usage of the flow analysis API. - The flow analysis unit tests were failing to call AssignedVariables.declare. This should have been caught by AssignedVariables.finish, but the flow analysis unit tests were failing to call that as well. - Several flow analysis unit tests failed to declare the variables they were using (or in one case, the declaration was at the wrong location). - In the CFE, DeclaredSourceConstructorBuilder.buildOutlineExpressions was failing to set up scopes properly when compiling a const constructor. - In the CFE, SourceLoader.buildExpression was failing to call AssignedVariables.declare for variables in scope. - In the CFE, the TypeInferrerImpl constructor was constructing the FlowAnalysis object eagerly, even though the AssignedVariables phase often hadn't completed yet. I've fixed this by constructing FlowAnalysis lazily. A follow-up CL will take advantage of the invariants checked by these assertions to introduce the logic necessary to fix issue #47991. Change-Id: Id680020dcd525632afa0820bc49c7b966b1ea534 Bug: https://github.com/dart-lang/sdk/issues/47991 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/227320 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Paul Berry <paulberry@google.com>
Dart is:
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
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).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
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).
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 on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.