commit | c317c66458a9be84e38699b3c22f33f971493df5 | [log] [tgz] |
---|---|---|
author | Paul Berry <paulberry@google.com> | Wed Jan 31 15:40:38 2024 +0000 |
committer | dart-internal-monorepo <dart-internal-monorepo@dart-ci-internal.iam.gserviceaccount.com> | Wed Jan 31 07:42:27 2024 -0800 |
tree | 2d39a13e7e5fd15ce7fa424cab8458527dce7640 | |
parent | 8a53df95e59016527bb0a6f9f53366e35870ff9f [diff] |
Fix assertion failure computing "why not promoted" for a public getter. The data structure in the front end for recording which getter names can be type promoted via "field promotion", `fieldNonPromotabilityInfo`, is a field in the `SourceLibraryBuilder` class. This means that each library tracks its own notion of which getter names are promotable. This makes sense because only private getter names are eligible for field promotion, and private getter names can only be used to access declarations in the same library. Prior to this commit, if the user tried to perform type promotion on a _public_ getter name, the shared flow analysis logic would correctly deem that public name non-promotable and reject the promotion. If the front end then called `FlowAnalysis.whyNotPromoted` (which it typically does to get details about failed type promotions that lead to compile-time errors), flow analysis would then use `FlowAnalysisOperations.whyPropertyIsNotPromotable` to query the `fieldNonPromotabilityInfo` data structure. Since `fieldNonPromotabilityInfo` is tracked separately for each library, if the public getter referred to a field declared in some other library, no information would be found, so `FlowAnalysisOperations.whyPropertyIsNotPromotable` would return `null`. This would lead flow analysis to incorrectly conclude that the reason for the getter name being non-promotable was due to a conflict with some other getter with the same name in the same library, so it would return `PropertyNotPromotedForNonInherentReason` to the front end. The front end would then iterate through `fieldNonPromotabilityInfo` looking for conflicting getters, again finding nothing. This led to an assertion failure, because it doesn't make logical sense for a getter name to be non-promotale due to conflicts if there are no conflicts. In production builds of the front end (with assertions disabled), the behavior was that the compile-time error would simply have no "why not promoted" context message (which is fairly benign, but still undesirable). This commit fixes the bug by modifying the shared logic for `FlowAnalysis.whyNotPromoted` so that if the getter name in question doesn't begin with `_` (meaning it's public), then it doesn't bother calling `FlowAnalysisOperations.whyPropertyIsNotPromotable` at all, because it knows the non-promotion reason is because the name is public. As a result, the correct context message gets generated, and there is no assertion failure. Note that the language test included in this commit doesn't check that the correct context message is generated, because the test infrastructure isn't capable of testing context messages that point to other files. But it does still serve to validate that the assertion no longer fires. Fixes https://github.com/dart-lang/sdk/issues/54777. Change-Id: I697f55acad7c162bc5f49f2824c91d172497f344 Bug: https://github.com/dart-lang/sdk/issues/54777 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349405 Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> https://dart.googlesource.com/sdk/+/2958754ed8402f0c1da5bb6b93289eefbc33f59c
Monorepo is:
With depot_tools installed and on your path, create a directory for your monorepo checkout and run these commands to create a gclient solution in that directory:
mkdir monorepo cd monorepo gclient config --unmanaged https://dart.googlesource.com/monorepo gclient sync -D
This gives you a checkout in the monorepo directory that contains:
monorepo/ DEPS - the DEPS used for this gclient checkout commits.json - the pinned commits for Dart, flutter/engine, and flutter/flutter tools/ - scripts used to create monorepo DEPS engine/src/ - the flutter/buildroot repo flutter/ - the flutter/engine repo out/ - the build directory, where Flutter engine builds are created third_party/ - Flutter dependencies checked out by DEPS dart/ - the Dart SDK checkout. third_party - Dart dependencies, also used by Flutter flutter/ - the flutter/flutter repo
Flutter's instructions for building the engine are at Compiling the engine
They can be followed closely, with a few changes:
goma_ctl ensure_start
is sufficient.Example build commands that work on linux:
MONOREPO_PATH=$PWD if [[ ! $PATH =~ (^|:)$MONOREPO_PATH/flutter/bin(:|$) ]]; then PATH=$MONOREPO_PATH/flutter/bin:$PATH fi export GOMA_DIR=$(dirname $(command -v gclient))/.cipd_bin goma_ctl ensure_start pushd engine/src flutter/tools/gn --goma --no-prebuilt-dart-sdk --unoptimized --full-dart-sdk autoninja -C out/host_debug_unopt popd
The Flutter commands used to build and run apps will use the locally built Flutter engine and Dart SDK, instead of the one downloaded by the Flutter tool, if the --local-engine
option is provided.
For example, to build and run the Flutter spinning square sample on the web platform,
MONOREPO_PATH=$PWD cd flutter/examples/layers flutter --local-engine=host_debug_unopt \ -d chrome run widgets/spinning_square.dart cd $MONOREPO_PATH
To build for desktop, specify the desktop platform device in flutter run
as -d macos
or -d linux
or -d windows
. You may also need to run the command
flutter create --platforms=windows,macos,linux
on existing apps, such as sample apps. New apps created with flutter create
already include these support files. Details of desktop support are at Desktop Support for Flutter
Tests in the Flutter source tree can be run with the flutter test
command, run in the directory of a package containing tests. For example:
MONOREPO_PATH=$PWD cd flutter/packages/flutter flutter test --local-engine=host_debug_unopt cd $MONOREPO_PATH
Please file an issue or email the dart-engprod team with any problems with or questions about using monorepo.
We will update this documentation to address them.
flutter
commands may download the engine and Dart SDK files for the configured channel, even though they will be using the local engine and its SDK.gclient sync
needs to be run in an administrator session, because some installed dependencies create symlinks.