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/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
 }