Previously, annotations were not traced by global type flow analysis (in order to avoid retaining classes which are only used in annotations). Annotations were only traced during tree shaking and references from such constants were treated much like references from types. This handling of constants in annotations conflicts with removal of fields, as tree shaker needs to know which fields are retained upfront to be independent of the visiting order. In a certain corner case (field was replaced with a getter but was still used in a constant in annotation) that caused incorrect AST and crash during serialization of AST. In order to fix that, this change adds proper tracing through annotations on members, classes and libraries, as if annotation constants were used in the executable code. That also means that annotation classes will be retained as allocated. In order to compensate for that, a new pass is added before the global analysis to clean all annotations except @ExternalName, @pragma (used by the VM) and @TagNumber (used by protobuf tree shaking). TEST=runtime/tests/vm/dart/regress_45968_test.dart Fixes https://github.com/dart-lang/sdk/issues/45968 Change-Id: I998e4f7ec7da7b74e1738fc21b354a4ec9f0c071 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/199200 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Vyacheslav Egorov <vegorov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
Package validation
The packages in pkg/ are automatically validated on the LUCI CI bots. The
validation is largely done by the tools/package_deps package; it can be tested
locally via:
dart tools/package_deps/bin/package_deps.dart
Packages which are published
There are several packages developed in pkg/ which are published to pub.
Validation of these packages is particularly important because the pub tools are
not used for these packages during development; we get our dependency versions
from the DEPS file. Its very easy for the dependencies specified in a package's
pubspec file to get out of date wrt the packages and versions actually used.
In order to better ensure we're publishing correct packages, we validate some properties of the pubspec files on our CI system. These validations include:
- that the dependencies listed in the pubspec are used in the package
- that all the packages used by the source are listed in the pubspec
- that we don't use relative path deps to pkg/ or third_party/ packages
Packages which are not published
For packages in pkg/ which we do not intend to be published, we put the following comment in the pubspec.yaml file:
# This package is not intended for consumption on pub.dev. DO NOT publish.
publish_to: none
These pubspecs are still validated by the package validation tool. The contents are more informational as the pubspecs for these packages are not consumed by the pub tool or ecosystem.
We validate:
- that the dependencies listed in the pubspec are used in the package
- that all the packages used by the source are listed in the pubspec
- that a reference to a pkg/ package is done via a relative path dependency