[kernel] Introduce 'forwardingStubInterfaceTarget' field for Procedures.

First step in fixing issue #31519.

Change-Id: I8df86954993ae5edd59ad2edc57179725880c1d9
Reviewed-on: https://dart-review.googlesource.com/34143
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index f307f05..519bd6d 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -356,6 +356,7 @@
   List<Expression> annotations;
   // Only present if the 'isForwardingStub' flag is set.
   Option<MemberReference> forwardingStubSuperTarget;
+  Option<MemberReference> forwardingStubInterfaceTarget;
   // Can only be absent if abstract, but tag is there anyway.
   Option<FunctionNode> function;
 }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 89a1643..eb61c33 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1491,6 +1491,7 @@
   Uri fileUri;
 
   Reference forwardingStubSuperTarget;
+  Reference forwardingStubInterfaceTarget;
 
   Procedure(Name name, this.kind, this.function,
       {bool isAbstract: false,
@@ -1502,7 +1503,8 @@
       int transformerFlags: 0,
       this.fileUri,
       Reference reference,
-      this.forwardingStubSuperTarget})
+      this.forwardingStubSuperTarget,
+      this.forwardingStubInterfaceTarget})
       : super(name, reference) {
     function?.parent = this;
     this.isAbstract = isAbstract;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 83c5af1..d43b7ff 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -932,6 +932,8 @@
             _disableLazyReading;
     var forwardingStubSuperTarget =
         readAndCheckOptionTag() ? readMemberReference() : null;
+    var forwardingStubInterfaceTarget =
+        readAndCheckOptionTag() ? readMemberReference() : null;
     var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
     var transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
@@ -947,6 +949,7 @@
       function?.parent = node;
       node.setTransformerFlagsWithoutLazyLoading(transformerFlags);
       node.forwardingStubSuperTarget = forwardingStubSuperTarget;
+      node.forwardingStubInterfaceTarget = forwardingStubInterfaceTarget;
 
       assert((node.forwardingStubSuperTarget != null) ||
           !(node.isForwardingStub && node.function.body != null));
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 3d12707..ef1edea 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -766,6 +766,7 @@
     writeUriReference(node.fileUri);
     writeAnnotationList(node.annotations);
     writeOptionalReference(node.forwardingStubSuperTarget);
+    writeOptionalReference(node.forwardingStubInterfaceTarget);
     writeOptionalNode(node.function);
     _variableIndexer = null;
 
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index e461650..1d0f38f 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -404,7 +404,8 @@
         isForwardingSemiStub: node.isForwardingSemiStub,
         transformerFlags: node.transformerFlags,
         fileUri: node.fileUri,
-        forwardingStubSuperTarget: node.forwardingStubSuperTarget)
+        forwardingStubSuperTarget: node.forwardingStubSuperTarget,
+        forwardingStubInterfaceTarget: node.forwardingStubInterfaceTarget)
       ..fileEndOffset = node.fileEndOffset
       ..isGenericContravariant = node.isGenericContravariant;
   }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index e37bd1c..b16c8f1 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -231,6 +231,11 @@
         forwarding_stub_super_target_ = builder_->ReadCanonicalNameReference();
       }
       if (++next_read_ == field) return;
+    case kForwardingStubInterfaceTarget:
+      if (builder_->ReadTag() == kSomething) {
+        builder_->ReadCanonicalNameReference();
+      }
+      if (++next_read_ == field) return;
     case kFunction:
       if (builder_->ReadTag() == kSomething)
         builder_->SkipFunctionNode();  // read function node.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 89b569f..9971757 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -246,6 +246,7 @@
     kSourceUriIndex,
     kAnnotations,
     kForwardingStubSuperTarget,
+    kForwardingStubInterfaceTarget,
     kFunction,
     kEnd,
   };