internal/impl: support legacy message names

This change:
* Adds aberrant support for the undocumented XXX_MessageName method.
* Adds LegacyMessageTypeOf so that v1 registration can suggest a
fullname to use with a legacy message with no Descriptor support.

Change-Id: I0265bd3cf67f4d4815358148f5817695c1122dc8
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/193518
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/legacy_test.go b/internal/impl/legacy_test.go
index a231fec..6a11f40 100644
--- a/internal/impl/legacy_test.go
+++ b/internal/impl/legacy_test.go
@@ -664,3 +664,36 @@
 		}
 	}
 }
+
+type LegacyTestMessageName1 struct{}
+
+func (*LegacyTestMessageName1) Reset()         { panic("not implemented") }
+func (*LegacyTestMessageName1) String() string { panic("not implemented") }
+func (*LegacyTestMessageName1) ProtoMessage()  { panic("not implemented") }
+
+type LegacyTestMessageName2 struct{}
+
+func (*LegacyTestMessageName2) Reset()         { panic("not implemented") }
+func (*LegacyTestMessageName2) String() string { panic("not implemented") }
+func (*LegacyTestMessageName2) ProtoMessage()  { panic("not implemented") }
+func (*LegacyTestMessageName2) XXX_MessageName() string {
+	return "google.golang.org.LegacyTestMessageName2"
+}
+
+func TestLegacyMessageName(t *testing.T) {
+	tests := []struct {
+		in          piface.MessageV1
+		suggestName pref.FullName
+		wantName    pref.FullName
+	}{
+		{new(LegacyTestMessageName1), "google.golang.org.LegacyTestMessageName1", "google.golang.org.LegacyTestMessageName1"},
+		{new(LegacyTestMessageName2), "", "google.golang.org.LegacyTestMessageName2"},
+	}
+
+	for _, tt := range tests {
+		mt := pimpl.Export{}.LegacyMessageTypeOf(tt.in, tt.suggestName)
+		if got := mt.Descriptor().FullName(); got != tt.wantName {
+			t.Errorf("type: %T, name mismatch: got %v, want %v", tt.in, got, tt.wantName)
+		}
+	}
+}