dart-sdk/pkg/analyzer/lib/src
Paul Berry 130d6199c3 Field promotion: make the core promotability algorithm sharable; fix bugs
In the following code, it's not safe for the field `C._f` to undergo
type promotion, because a variable with static type `C` might have
type `D` at runtime, in which case `C._f` will get dispatched to
`noSuchMethod`, which is not guaranteed to return a stable result.

    class C {
      final int? _f;
    }
    class D implements C {
      noSuchMethod(_) => ...;
    }
    foo(C c) {
      if (c._f != null) {
        print(c._f + 1); // UNSAFE!
      }
    }

Therefore, in order to determine which fields are promotable, the
implementations need to analyze enough of the class hierarchy to
figure out which field accesses might get dispatched to
`noSuchMethod`.

Currently, the CFE does this by following its usual algorithm for
generating `noSuchMethod` forwarders before trying to determine which
fields are promotable. The analyzer, on the other hand, doesn't have
an algorithm for generating `noSuchMethod` forwarders (since it
doesn't implement execution semantics); so instead it has its own
logic to figure out when a `noSuchMethod` forwarder is needed for a
field, and disable promotion for that field.

But there's a chicken-and-egg problem in the CFE: the CFE needs to
determine which fields are promotable before doing top-level inference
(since the initializers of top-level fields might make use of field
promotion, affecting their inferred types--see #50522). But it doesn't
decide where `noSuchMethod` forwarders are needed until after
top-level inference (because the same phase that generates
`noSuchMethod` forwarders also generates forwarders that do runtime
covariant type-checking, and so it has to run after all top level
types have been inferred).

To fix the chicken-and-egg problem, I plan to rework the CFE so that
it uses the same algorithm as the analyzer to determine which fields
are promotable. This CL makes a first step towards that goal, by
reworking the analyzer's field promotability algorithm into a form
where it can be shared with the CFE, and moving it to
`package:_fe_analyzer_shared`.  Since this required a fairly
substantial rewrite, I went ahead and fixed #52938 in the process.

Fixes #52938.

Change-Id: I9e68f51b3ea9a967f55f15bdc445cc1c0efdabdd
Bug: https://github.com/dart-lang/sdk/issues/52938
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/313293
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2023-07-18 18:54:26 +00:00
..
analysis_options Revert "Update comments and readmes to specify dart run --no-pub when necessary." 2023-05-09 20:38:49 +00:00
clients Merge AST interfaces into implementation library, re-export. 2023-06-10 16:57:59 +00:00
context Use UriCache to ensure there is only one instance of Uri for each string. 2023-01-23 18:05:44 +00:00
dart Inheritance inference for methods in augmentations, and using combined interfaces for classes and mixins. 2023-07-18 18:51:27 +00:00
dartdoc Enforce use_super_parameters in analyzer/. 2022-05-19 19:36:41 +00:00
diagnostic Deprecate Element.enclosingElement, use enclosingElement2 instead. 2023-06-29 19:45:19 +00:00
error [analysis_server]/[analyzer] Change package_path alias -> path 2023-07-17 16:48:36 +00:00
exception Enforce use_super_parameters in analyzer/. 2022-05-19 19:36:41 +00:00
fasta Simplify class and element hierarchy around augmentations. 2023-07-17 16:56:41 +00:00
file_system Breaking changes for analyzer version 4.0.0 2022-04-07 06:52:27 +00:00
generated Issue 52918. Report -TYPE_PARAMETER_REFERENCED_BY_STATIC for extension. 2023-07-13 17:53:38 +00:00
hint Prepare for removing deprecated methods from NamedType. 2023-05-18 01:54:21 +00:00
ignore_comments [analysis_server] Make CompilationUnit.lineInfo non-nullable 2022-03-03 06:59:00 +00:00
lint Simplify class and element hierarchy around augmentations. 2023-07-17 16:56:41 +00:00
manifest Revert "Update comments and readmes to specify dart run --no-pub when necessary." 2023-05-09 20:38:49 +00:00
plugin fixed dangling library doc comments 2023-04-12 00:29:48 +00:00
pubspec Revert "Update comments and readmes to specify dart run --no-pub when necessary." 2023-05-09 20:38:49 +00:00
services Update NamedType to use ImportPrefixReference and name token. 2023-04-28 17:31:46 +00:00
source [analyzer] Don't do string concat in String.startsWith 2023-05-26 06:27:47 +00:00
summary Verify that 'utf8.encode()' is not used in the analyzer. 2023-07-17 17:28:31 +00:00
summary2 Field promotion: make the core promotability algorithm sharable; fix bugs 2023-07-18 18:54:26 +00:00
task Inheritance inference for methods in augmentations, and using combined interfaces for classes and mixins. 2023-07-18 18:51:27 +00:00
test_utilities Simplify class and element hierarchy around augmentations. 2023-07-17 16:56:41 +00:00
util Deprecate Element.enclosingElement, use enclosingElement2 instead. 2023-06-29 19:45:19 +00:00
utilities Adjust the definition of coveringNode to favor identifiers 2023-06-21 17:55:36 +00:00
workspace Add 'provideLanguageVersion' option to BlazeWorkspace. 2023-04-28 19:59:12 +00:00
error.dart Migrate package:analyzer to null safety. 2021-02-01 18:56:04 +00:00
string_source.dart Breaking changes for analyzer version 4.0.0 2022-04-07 06:52:27 +00:00