Add 'redirectedConstructor' to unit API signature.

ConstructorElement.redirectedConstructor exposes this data, so we
should include it into the signature.

Change-Id: I87d339589694b63709f722f6b5242fb95c1085d7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175220
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index f916888..6968796 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -28,15 +28,11 @@
     signature.addInt(node.members.length);
     for (var member in node.members) {
       if (member is ConstructorDeclaration) {
-        var lastInitializer = member.constKeyword != null &&
-                member.initializers != null &&
-                member.initializers.isNotEmpty
-            ? member.initializers.last
-            : null;
-        addTokens(
-          member.beginToken,
-          (lastInitializer ?? member.parameters ?? member.name).endToken,
-        );
+        addTokens(member.beginToken, member.parameters.endToken);
+        if (member.constKeyword != null) {
+          addNodeList(member.initializers);
+        }
+        addNode(member.redirectedConstructor);
       } else if (member is FieldDeclaration) {
         var variableList = member.fields;
         addVariables(
@@ -65,7 +61,15 @@
   }
 
   void addNode(AstNode node) {
-    addTokens(node.beginToken, node.endToken);
+    if (node != null) {
+      addTokens(node.beginToken, node.endToken);
+    }
+  }
+
+  void addNodeList(List<AstNode> nodes) {
+    for (var node in nodes) {
+      addNode(node);
+    }
   }
 
   void addToken(Token token) {
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 612a392..83e8192 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -192,6 +192,46 @@
 ''');
   }
 
+  test_class_constructor_redirectedConstructor_const() {
+    assertNotSameSignature(r'''
+class A {
+  const factory A() = B.foo;
+}
+class B implements A {
+  const B.foo();
+  const B.bar();
+}
+''', r'''
+class A {
+  const factory A() = B.bar;
+}
+class B implements A {
+  const B.foo();
+  const B.bar();
+}
+''');
+  }
+
+  test_class_constructor_redirectedConstructor_notConst() {
+    assertNotSameSignature(r'''
+class A {
+  factory A() = B.foo;
+}
+class B implements A {
+  B.foo();
+  B.bar();
+}
+''', r'''
+class A {
+  factory A() = B.bar;
+}
+class B implements A {
+  B.foo();
+  B.bar();
+}
+''');
+  }
+
   test_class_extends() {
     assertNotSameSignature(r'''
 class A {}