6c9dbb35b5
When a field is declared in a mixin, the front end creates a synthetic getter in the mixin application class that gets the value of the mixed in field. So if a piece of code accesses the mixed in field through the mixin application class rather than through the mixin directly, the resolved member is the synthetic getter rather than a field. In order to ensure that the field remains promotable even if it is accessed through the mixin application, the logic in `OperationsCfe.isPropertyPromotable` needs to be changed so that it doesn't treat these synthetic getters as non-promotable. The old logic was essentially this: 1. If the property is not private, it's not promotable. 2. Otherwise, if the property is listed in `FieldNonPromotabilityInfo.fieldNameInfo`, it's not promotable. (This happens either if the property is not promotable for an intrinsic reason, such as being a non-final field or a concrete getter, or if it has the same name as a non-promotable property elsewhere in the library). 3. Otherwise, if the property is a getter that was lowered from an abstract field, it's promotable. 4. Otherwise, if the property is a getter that was lowered from a late field, it's promotable. 5. Otherwise, the property isn't promotable. (This was intended to cover the case where the property is an abstract getter declaration). (Although conditions 3 and 4 were tested first, since they are more efficient to test). It turns out that once conditions 1-2 have been ruled out, the property must have been declared as a method (which is being torn off), a private abstract getter, or a (possibly abstract) non-external private final field. Of these three possibilities, only the last is promotable. So this can be simplified to: (conditions 1-2 as above) 3. Otherwise, if the property is a method tear-off, it's not promotable. 4. Otherwise, if the property is an abstract getter, it's not promotable. 5. Otherwise, the property is promotable. This makes the logic easier to follow, since conditions 1-4 are now all reasons for non-promotability (rather than a mix of promotability and non-promotability reasons). It also conveniently addresses the problem with fields accessed through mixin applications, since they aren't excluded by any of conditions 1-4. (We still test conditions 3 and 4 first, since they are more efficient to test.) Fixes #53742. Fixes #53617. Fixes #53436. Change-Id: I64df269c2a4a0714f9be239d832b61f4fb6a1a43 Bug: https://github.com/dart-lang/sdk/issues/53742 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330168 Reviewed-by: Nate Bosch <nbosch@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Commit-Queue: Paul Berry <paulberry@google.com> |
||
---|---|---|
.dart_tool | ||
.github | ||
benchmarks | ||
build | ||
docs | ||
pkg | ||
runtime | ||
samples | ||
sdk | ||
tests | ||
third_party | ||
tools | ||
utils | ||
.clang-format | ||
.gitattributes | ||
.gitconfig | ||
.gitignore | ||
.gn | ||
.mailmap | ||
.style.yapf | ||
.vpython | ||
AUTHORS | ||
BUILD.gn | ||
CHANGELOG.md | ||
codereview.settings | ||
CONTRIBUTING.md | ||
DEPS | ||
LICENSE | ||
OWNERS | ||
PATENT_GRANT | ||
PRESUBMIT.py | ||
README.dart-sdk | ||
README.md | ||
sdk.code-workspace | ||
sdk_args.gni | ||
SECURITY.md | ||
WATCHLISTS |
Dart
A client-optimized language for fast apps on any platform
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).
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 on our wiki.
Contributing to Dart
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.