[ddc] Don't remove covariance bits on injected members

The covariance optimization assumed that private members only occur
in the library in which they are private. This is not the case. The
CFE injects member signatures, forwarding stubs and noSuchMethod
forwarders for private members into other libraries.

This change takes that into account by only removing covariant bits
on members private to the enclosing library.

This hopefully a fix for https://github.com/flutter/flutter/issues/66122

Change-Id: I5070cee9eea8e785622cef33fdc7138a0a90f53a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/168950
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 3e6eea6..1755ed9 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -367,7 +367,14 @@
 
   @override
   void visitProcedure(Procedure node) {
-    if (node.name.isPrivate && node.isInstanceMember && node.function != null) {
+    if (node.name.isPrivate &&
+        // The member must be private to this library. Member signatures,
+        // forwarding stubs and noSuchMethod forwarders for private members in
+        // other libraries can be injected.
+        node.name.library == _library &&
+        node.isInstanceMember &&
+        // No need to check abstract methods.
+        node.function.body != null) {
       _privateProcedures.add(node);
     }
     super.visitProcedure(node);
@@ -375,7 +382,14 @@
 
   @override
   void visitField(Field node) {
-    if (node.name.isPrivate && isCovariantField(node)) _privateFields.add(node);
+    if (node.name.isPrivate &&
+        // The member must be private to this library. Member signatures,
+        // forwarding stubs and noSuchMethod forwarders for private members in
+        // other libraries can be injected.
+        node.name.library == _library &&
+        isCovariantField(node)) {
+      _privateFields.add(node);
+    }
     super.visitField(node);
   }
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
index 3b69faf..6895d48 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -5,7 +5,7 @@
 
   abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
     abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
-    abstract member-signature set _widget(aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
@@ -65,7 +65,7 @@
       : super fra::State::•()
       ;
     abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
-    abstract member-signature set _widget(main::HotReloadIssue* _) → void; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* _) → void; -> fra::State::_widget
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
index e5c6cda..f4a141b 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -5,7 +5,7 @@
 
   abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
     abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
-    abstract member-signature set _widget(aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
     abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
     abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
@@ -64,8 +64,6 @@
     synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
       : super fra::State::•()
       ;
-    forwarding-stub set _widget(main::HotReloadIssue* value) → void
-      return super.{fra::State::_widget} = value;
   }
   class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
     synthetic constructor •() → main::_HotReloadIssueState*
@@ -73,8 +71,6 @@
       ;
     method build(fra::BuildContext* context) → fra::Widget* {}
     method afterFirstLayout(fra::BuildContext* context) → void {}
-    forwarding-stub set _widget(main::HotReloadIssue* value) → void
-      return super.{fra::State::_widget} = value;
   }
   class HotReloadIssue extends fra::StatefulWidget {
     synthetic constructor •() → main::HotReloadIssue*