9e8e8e5fca
Consider the following situation: member M1 is overridden by another member M2; M2 is overridden in a dynamic module. Members which can be overridden in a dynamic module (such as M2) should be specified as 'can-be-overridden' in the dynamic interface. Members which are overridden implicitly/transitively (such as M1) are not required to be mentioned in the dynamic interface. However, when determining possible targets for a call with interface target M1, compiler should treat it as potentially overridden in a dynamic module. This change adds such handling to the VM/AOT. Dynamic interface annotator now marks members such as M1 with 'dyn-module:can-be-overridden-implicitly' pragma, and VM/AOT takes both can-be-overridden and can-be-overridden-implicitly into account. This change also simplifies handling of implicitly extenable classes in the VM/AOT - now VM handles both extendable and implicitly-extendable pragmas (from dynamic interface annotator) instead of recalculating implicitly extendable classes on its own. TEST=pkg/vm/test/transformations/dynamic_interface_annotator_test.dart TEST=dynamic_modules_suite/implicitly_extendable Fixes https://github.com/dart-lang/sdk/issues/59880 Change-Id: Id4570cc86303f8e45a061d696e9bca0d0b2b4b81 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403951 Reviewed-by: Slava Egorov <vegorov@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Nate Biggs <natebiggs@google.com>