all: rely on message_set_extension name mangling in ExtensionDescV1

Too much code inside Google rely on ExtensionDescV1.Name being the
target message name rather than the real name of the extension.
Double down on this assumption consistently across our codebase.

Change-Id: If0b7cd16dd1f2f7acfb2e562dbf1a2b5487162b5
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/186980
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index c393257..cc1991c 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -18,6 +18,7 @@
 	"unicode/utf8"
 
 	"google.golang.org/protobuf/compiler/protogen"
+	"google.golang.org/protobuf/internal/encoding/messageset"
 	"google.golang.org/protobuf/internal/encoding/tag"
 	"google.golang.org/protobuf/internal/fieldnum"
 	"google.golang.org/protobuf/reflect/protoreflect"
@@ -833,6 +834,12 @@
 
 	g.P("var ", extensionTypesVarName(f), " = []", protoimplPackage.Ident("ExtensionInfo"), "{")
 	for _, extension := range f.allExtensions {
+		// For MessageSet extensions, the name used is the parent message.
+		name := extension.Desc.FullName()
+		if messageset.IsMessageSetExtension(extension.Desc) {
+			name = name.Parent()
+		}
+
 		g.P("{")
 		g.P("ExtendedType: (*", extension.Extendee.GoIdent, ")(nil),")
 		goType, pointer := fieldGoType(g, f, extension)
@@ -841,7 +848,7 @@
 		}
 		g.P("ExtensionType: (", goType, ")(nil),")
 		g.P("Field: ", extension.Desc.Number(), ",")
-		g.P("Name: ", strconv.Quote(string(extension.Desc.FullName())), ",")
+		g.P("Name: ", strconv.Quote(string(name)), ",")
 		g.P("Tag: ", strconv.Quote(fieldProtobufTagValue(extension)), ",")
 		g.P("Filename: ", strconv.Quote(f.Desc.Path()), ",")
 		g.P("},")
diff --git a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
index a357004..0f17349 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -723,7 +723,7 @@
 		ExtendedType:  (*base.MessageSetWireFormatMessage)(nil),
 		ExtensionType: (*MessageSetWireFormatExtension)(nil),
 		Field:         100,
-		Name:          "goproto.protoc.extension.ext.MessageSetWireFormatExtension.message_set_extension",
+		Name:          "goproto.protoc.extension.ext.MessageSetWireFormatExtension",
 		Tag:           "bytes,100,opt,name=message_set_extension",
 		Filename:      "extensions/ext/ext.proto",
 	},
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index 2565c02..280deda 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -1583,7 +1583,7 @@
 		ExtendedType:  (*MessageSet)(nil),
 		ExtensionType: (*MessageSetExtension)(nil),
 		Field:         10,
-		Name:          "pb2.MessageSetExtension.message_set_extension",
+		Name:          "pb2.MessageSetExtension",
 		Tag:           "bytes,10,opt,name=message_set_extension",
 		Filename:      "pb2/test.proto",
 	},
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index 4622484..b484067 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -8,6 +8,7 @@
 	"reflect"
 	"sync"
 
+	"google.golang.org/protobuf/internal/encoding/messageset"
 	ptag "google.golang.org/protobuf/internal/encoding/tag"
 	"google.golang.org/protobuf/internal/filedesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
@@ -109,10 +110,16 @@
 		filename = fd.Path()
 	}
 
+	// For MessageSet extensions, the name used is the parent message.
+	name := xd.FullName()
+	if messageset.IsMessageSetExtension(xd) {
+		name = name.Parent()
+	}
+
 	xi.ExtendedType = parent
 	xi.ExtensionType = reflect.Zero(extType).Interface()
 	xi.Field = int32(xd.Number())
-	xi.Name = string(xd.FullName())
+	xi.Name = string(name)
 	xi.Tag = ptag.Marshal(xd, enumName)
 	xi.Filename = filename
 }
@@ -159,13 +166,18 @@
 	xd.L1.Extendee = Export{}.MessageDescriptorOf(xi.ExtendedType)
 	xd.L2.Enum = ed
 	xd.L2.Message = md
+
+	// Derive real extension field name for MessageSets.
+	if messageset.IsMessageSet(xd.L1.Extendee) && md.FullName() == xd.L0.FullName {
+		xd.L0.FullName = xd.L0.FullName.Append(messageset.ExtensionName)
+	}
+
 	tt := reflect.TypeOf(xi.ExtensionType)
 	if isOptional {
 		tt = tt.Elem()
 	} else if isRepeated {
 		tt = reflect.PtrTo(tt)
 	}
-
 	xi.desc = xd
 	xi.goType = tt
 }
diff --git a/internal/testprotos/conformance/test_messages_proto2.pb.go b/internal/testprotos/conformance/test_messages_proto2.pb.go
index ac17ced..c32c92e 100644
--- a/internal/testprotos/conformance/test_messages_proto2.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto2.pb.go
@@ -1420,7 +1420,7 @@
 		ExtendedType:  (*TestAllTypesProto2_MessageSetCorrect)(nil),
 		ExtensionType: (*TestAllTypesProto2_MessageSetCorrectExtension1)(nil),
 		Field:         1547769,
-		Name:          "protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension1.message_set_extension",
+		Name:          "protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension1",
 		Tag:           "bytes,1547769,opt,name=message_set_extension",
 		Filename:      "google/protobuf/test_messages_proto2.proto",
 	},
@@ -1428,7 +1428,7 @@
 		ExtendedType:  (*TestAllTypesProto2_MessageSetCorrect)(nil),
 		ExtensionType: (*TestAllTypesProto2_MessageSetCorrectExtension2)(nil),
 		Field:         4135312,
-		Name:          "protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2.message_set_extension",
+		Name:          "protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2",
 		Tag:           "bytes,4135312,opt,name=message_set_extension",
 		Filename:      "google/protobuf/test_messages_proto2.proto",
 	},
diff --git a/internal/testprotos/messageset/msetextpb/msetextpb.pb.go b/internal/testprotos/messageset/msetextpb/msetextpb.pb.go
index 1f3e452..07bef95 100644
--- a/internal/testprotos/messageset/msetextpb/msetextpb.pb.go
+++ b/internal/testprotos/messageset/msetextpb/msetextpb.pb.go
@@ -112,7 +112,7 @@
 		ExtendedType:  (*messagesetpb.MessageSet)(nil),
 		ExtensionType: (*Ext1)(nil),
 		Field:         1000,
-		Name:          "goproto.proto.messageset.Ext1.message_set_extension",
+		Name:          "goproto.proto.messageset.Ext1",
 		Tag:           "bytes,1000,opt,name=message_set_extension",
 		Filename:      "messageset/msetextpb/msetextpb.proto",
 	},
@@ -120,7 +120,7 @@
 		ExtendedType:  (*messagesetpb.MessageSet)(nil),
 		ExtensionType: (*Ext2)(nil),
 		Field:         1001,
-		Name:          "goproto.proto.messageset.Ext2.message_set_extension",
+		Name:          "goproto.proto.messageset.Ext2",
 		Tag:           "bytes,1001,opt,name=message_set_extension",
 		Filename:      "messageset/msetextpb/msetextpb.proto",
 	},