reflect/protoreflect: replace Mutable with NewMessage

Remove the Mutable methods from KnownFields, List, and Map, replacing
them with methods which return a new, empty message value without adding
that value to the collection.

The new API is simpler, since it clearly applies only to message values,
and more orthogonal, since it provides a way to create a value without
mutating the collection. This latter point is particularly useful in
map deserialization, where the key may be unknown at the time the value
is deserialized.

Drop the Mutable interface, since it is no longer necessary.

Change-Id: Ic5f3d06a2aa331a5d5cd2b4e670a3dba4a74f77c
Reviewed-on: https://go-review.googlesource.com/c/153278
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
index 5511e59..7edc978 100644
--- a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
+++ b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_Request) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Request) ProtoMutable() {}
 
 func (m *Request) Reset()         { *m = Request{} }
 func (m *Request) String() string { return proto.CompactTextString(m) }
@@ -89,7 +88,6 @@
 func (m xxx_Response) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Response) ProtoMutable() {}
 
 func (m *Response) Reset()         { *m = Response{} }
 func (m *Response) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/internal_gengo/reflect.go b/cmd/protoc-gen-go/internal_gengo/reflect.go
index 9f06602..2126ee9 100644
--- a/cmd/protoc-gen-go/internal_gengo/reflect.go
+++ b/cmd/protoc-gen-go/internal_gengo/reflect.go
@@ -384,7 +384,6 @@
 	g.P("func (m ", shadowType, ") Interface() ", protoreflectPackage.Ident("ProtoMessage"), " {")
 	g.P("return m.m")
 	g.P("}")
-	g.P("func (m ", shadowType, ") ProtoMutable() {}")
 	g.P()
 }
 
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
index 6fa2387..71b33e9 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
@@ -89,7 +89,6 @@
 func (m xxx_AnnotationsTestMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_AnnotationsTestMessage) ProtoMutable() {}
 
 func (m *AnnotationsTestMessage) Reset()         { *m = AnnotationsTestMessage{} }
 func (m *AnnotationsTestMessage) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/comments/comments.pb.go b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
index 7a3af63..17d1200 100644
--- a/cmd/protoc-gen-go/testdata/comments/comments.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
@@ -50,7 +50,6 @@
 func (m xxx_Message1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message1) ProtoMutable() {}
 
 func (m *Message1) Reset()         { *m = Message1{} }
 func (m *Message1) String() string { return proto.CompactTextString(m) }
@@ -139,7 +138,6 @@
 func (m xxx_Message2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message2) ProtoMutable() {}
 
 func (m *Message2) Reset()         { *m = Message2{} }
 func (m *Message2) String() string { return proto.CompactTextString(m) }
@@ -190,7 +188,6 @@
 func (m xxx_Message1_Message1A) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message1_Message1A) ProtoMutable() {}
 
 func (m *Message1_Message1A) Reset()         { *m = Message1_Message1A{} }
 func (m *Message1_Message1A) String() string { return proto.CompactTextString(m) }
@@ -241,7 +238,6 @@
 func (m xxx_Message1_Message1B) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message1_Message1B) ProtoMutable() {}
 
 func (m *Message1_Message1B) Reset()         { *m = Message1_Message1B{} }
 func (m *Message1_Message1B) String() string { return proto.CompactTextString(m) }
@@ -292,7 +288,6 @@
 func (m xxx_Message2_Message2A) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message2_Message2A) ProtoMutable() {}
 
 func (m *Message2_Message2A) Reset()         { *m = Message2_Message2A{} }
 func (m *Message2_Message2A) String() string { return proto.CompactTextString(m) }
@@ -343,7 +338,6 @@
 func (m xxx_Message2_Message2B) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message2_Message2B) ProtoMutable() {}
 
 func (m *Message2_Message2B) Reset()         { *m = Message2_Message2B{} }
 func (m *Message2_Message2B) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
index 721f586..86e7968 100644
--- a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
@@ -74,7 +74,6 @@
 func (m xxx_DeprecatedMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_DeprecatedMessage) ProtoMutable() {}
 
 func (m *DeprecatedMessage) Reset()         { *m = DeprecatedMessage{} }
 func (m *DeprecatedMessage) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
index 57db78b..602d373 100644
--- a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
@@ -41,7 +41,6 @@
 func (m xxx_BaseMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_BaseMessage) ProtoMutable() {}
 
 func (m *BaseMessage) Reset()         { *m = BaseMessage{} }
 func (m *BaseMessage) String() string { return proto.CompactTextString(m) }
@@ -108,7 +107,6 @@
 func (m xxx_MessageSetWireFormatMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_MessageSetWireFormatMessage) ProtoMutable() {}
 
 func (m *MessageSetWireFormatMessage) Reset()         { *m = MessageSetWireFormatMessage{} }
 func (m *MessageSetWireFormatMessage) String() string { return proto.CompactTextString(m) }
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 26b96d9..e0b3b5b 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -91,7 +91,6 @@
 func (m xxx_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message) ProtoMutable() {}
 
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
@@ -149,7 +148,6 @@
 func (m xxx_ExtensionGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ExtensionGroup) ProtoMutable() {}
 
 func (m *ExtensionGroup) Reset()         { *m = ExtensionGroup{} }
 func (m *ExtensionGroup) String() string { return proto.CompactTextString(m) }
@@ -207,7 +205,6 @@
 func (m xxx_ExtendingMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ExtendingMessage) ProtoMutable() {}
 
 func (m *ExtendingMessage) Reset()         { *m = ExtendingMessage{} }
 func (m *ExtendingMessage) String() string { return proto.CompactTextString(m) }
@@ -258,7 +255,6 @@
 func (m xxx_RepeatedGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_RepeatedGroup) ProtoMutable() {}
 
 func (m *RepeatedGroup) Reset()         { *m = RepeatedGroup{} }
 func (m *RepeatedGroup) String() string { return proto.CompactTextString(m) }
@@ -317,7 +313,6 @@
 func (m xxx_Extendable) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Extendable) ProtoMutable() {}
 
 func (m *Extendable) Reset()         { *m = Extendable{} }
 func (m *Extendable) String() string { return proto.CompactTextString(m) }
@@ -378,7 +373,6 @@
 func (m xxx_MessageSetWireFormatExtension) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_MessageSetWireFormatExtension) ProtoMutable() {}
 
 func (m *MessageSetWireFormatExtension) Reset()         { *m = MessageSetWireFormatExtension{} }
 func (m *MessageSetWireFormatExtension) String() string { return proto.CompactTextString(m) }
@@ -428,7 +422,6 @@
 func (m xxx_Message_M) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message_M) ProtoMutable() {}
 
 func (m *Message_M) Reset()         { *m = Message_M{} }
 func (m *Message_M) String() string { return proto.CompactTextString(m) }
@@ -480,7 +473,6 @@
 func (m xxx_ExtendingMessage_ExtendingMessageSubmessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ExtendingMessage_ExtendingMessageSubmessage) ProtoMutable() {}
 
 func (m *ExtendingMessage_ExtendingMessageSubmessage) Reset() {
 	*m = ExtendingMessage_ExtendingMessageSubmessage{}
diff --git a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
index 30e699c..9bcf01a 100644
--- a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
@@ -40,7 +40,6 @@
 func (m xxx_ExtraMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ExtraMessage) ProtoMutable() {}
 
 func (m *ExtraMessage) Reset()         { *m = ExtraMessage{} }
 func (m *ExtraMessage) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
index 9055dae..aa8b177 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -74,7 +74,6 @@
 func (m xxx_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message) ProtoMutable() {}
 
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
index 241a8f4..32866bb 100644
--- a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
+++ b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
@@ -78,7 +78,6 @@
 func (m xxx_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message) ProtoMutable() {}
 
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
@@ -321,7 +320,6 @@
 func (m xxx_Message_OneofMessageConflict) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message_OneofMessageConflict) ProtoMutable() {}
 
 func (m *Message_OneofMessageConflict) Reset()         { *m = Message_OneofMessageConflict{} }
 func (m *Message_OneofMessageConflict) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/import_public/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
index 5a8d306..e324cc2 100644
--- a/cmd/protoc-gen-go/testdata/import_public/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
@@ -84,7 +84,6 @@
 func (m xxx_Public) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Public) ProtoMutable() {}
 
 func (m *Public) Reset()         { *m = Public{} }
 func (m *Public) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/import_public/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
index 1efbbbd..9b6589e 100644
--- a/cmd/protoc-gen-go/testdata/import_public/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
@@ -42,7 +42,6 @@
 func (m xxx_Local) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Local) ProtoMutable() {}
 
 func (m *Local) Reset()         { *m = Local{} }
 func (m *Local) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
index 105c7d4..ec8b341 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
@@ -197,7 +197,6 @@
 func (m xxx_M) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M) ProtoMutable() {}
 
 func (m *M) Reset()         { *m = M{} }
 func (m *M) String() string { return proto.CompactTextString(m) }
@@ -337,7 +336,6 @@
 func (m xxx_M_Submessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M_Submessage) ProtoMutable() {}
 
 func (m *M_Submessage) Reset()         { *m = M_Submessage{} }
 func (m *M_Submessage) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
index 6d1d369..67ab55f 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M2) ProtoMutable() {}
 
 func (m *M2) Reset()         { *m = M2{} }
 func (m *M2) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
index 5d5b49f..f07c985 100644
--- a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M) ProtoMutable() {}
 
 func (m *M) Reset()         { *m = M{} }
 func (m *M) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
index fe1b45e..50006a4 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
@@ -73,7 +73,6 @@
 func (m xxx_M1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M1) ProtoMutable() {}
 
 func (m *M1) Reset()         { *m = M1{} }
 func (m *M1) String() string { return proto.CompactTextString(m) }
@@ -124,7 +123,6 @@
 func (m xxx_M1_1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M1_1) ProtoMutable() {}
 
 func (m *M1_1) Reset()         { *m = M1_1{} }
 func (m *M1_1) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
index 3ad0232..f9b2bd5 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M2) ProtoMutable() {}
 
 func (m *M2) Reset()         { *m = M2{} }
 func (m *M2) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
index 856147d..2a5e65f 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M3) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M3) ProtoMutable() {}
 
 func (m *M3) Reset()         { *m = M3{} }
 func (m *M3) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
index 8aa2304..c8f0ca0 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M4) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M4) ProtoMutable() {}
 
 func (m *M4) Reset()         { *m = M4{} }
 func (m *M4) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
index 99d09a0..2ff3744 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M1) ProtoMutable() {}
 
 func (m *M1) Reset()         { *m = M1{} }
 func (m *M1) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
index 70cf5cf..5cbcf4a 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
@@ -39,7 +39,6 @@
 func (m xxx_M2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_M2) ProtoMutable() {}
 
 func (m *M2) Reset()         { *m = M2{} }
 func (m *M2) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
index 5e1f17c..67f5a50 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
@@ -41,7 +41,6 @@
 func (m xxx_A1M1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_A1M1) ProtoMutable() {}
 
 func (m *A1M1) Reset()         { *m = A1M1{} }
 func (m *A1M1) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
index 3afbc97..070d020 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
@@ -41,7 +41,6 @@
 func (m xxx_A1M2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_A1M2) ProtoMutable() {}
 
 func (m *A1M2) Reset()         { *m = A1M2{} }
 func (m *A1M2) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
index b661d55..f4265e2 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
@@ -48,7 +48,6 @@
 func (m xxx_All) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_All) ProtoMutable() {}
 
 func (m *All) Reset()         { *m = All{} }
 func (m *All) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
index 597b860..4174d6d 100644
--- a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
+++ b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
@@ -90,7 +90,6 @@
 func (m xxx_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message) ProtoMutable() {}
 
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
index c1447ec..3ff891b 100644
--- a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
@@ -348,7 +348,6 @@
 func (m xxx_EnumContainerMessage1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumContainerMessage1) ProtoMutable() {}
 
 func (m *EnumContainerMessage1) Reset()         { *m = EnumContainerMessage1{} }
 func (m *EnumContainerMessage1) String() string { return proto.CompactTextString(m) }
@@ -417,7 +416,6 @@
 func (m xxx_EnumContainerMessage1_EnumContainerMessage2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumContainerMessage1_EnumContainerMessage2) ProtoMutable() {}
 
 func (m *EnumContainerMessage1_EnumContainerMessage2) Reset() {
 	*m = EnumContainerMessage1_EnumContainerMessage2{}
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
index f5eba16..e296e51 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -198,7 +198,6 @@
 func (m xxx_FieldTestMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage) ProtoMutable() {}
 
 func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
 func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
@@ -1168,7 +1167,6 @@
 func (m xxx_FieldTestMessage_OptionalGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage_OptionalGroup) ProtoMutable() {}
 
 func (m *FieldTestMessage_OptionalGroup) Reset()         { *m = FieldTestMessage_OptionalGroup{} }
 func (m *FieldTestMessage_OptionalGroup) String() string { return proto.CompactTextString(m) }
@@ -1228,7 +1226,6 @@
 func (m xxx_FieldTestMessage_RequiredGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage_RequiredGroup) ProtoMutable() {}
 
 func (m *FieldTestMessage_RequiredGroup) Reset()         { *m = FieldTestMessage_RequiredGroup{} }
 func (m *FieldTestMessage_RequiredGroup) String() string { return proto.CompactTextString(m) }
@@ -1288,7 +1285,6 @@
 func (m xxx_FieldTestMessage_RepeatedGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage_RepeatedGroup) ProtoMutable() {}
 
 func (m *FieldTestMessage_RepeatedGroup) Reset()         { *m = FieldTestMessage_RepeatedGroup{} }
 func (m *FieldTestMessage_RepeatedGroup) String() string { return proto.CompactTextString(m) }
@@ -1346,7 +1342,6 @@
 func (m xxx_FieldTestMessage_OneofGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage_OneofGroup) ProtoMutable() {}
 
 func (m *FieldTestMessage_OneofGroup) Reset()         { *m = FieldTestMessage_OneofGroup{} }
 func (m *FieldTestMessage_OneofGroup) String() string { return proto.CompactTextString(m) }
@@ -1403,7 +1398,6 @@
 func (m xxx_FieldTestMessage_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage_Message) ProtoMutable() {}
 
 func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
 func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
index 4b6594f..19061d3 100644
--- a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
@@ -41,7 +41,6 @@
 func (m xxx_Layer1) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Layer1) ProtoMutable() {}
 
 func (m *Layer1) Reset()         { *m = Layer1{} }
 func (m *Layer1) String() string { return proto.CompactTextString(m) }
@@ -106,7 +105,6 @@
 func (m xxx_Layer1_Layer2) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Layer1_Layer2) ProtoMutable() {}
 
 func (m *Layer1_Layer2) Reset()         { *m = Layer1_Layer2{} }
 func (m *Layer1_Layer2) String() string { return proto.CompactTextString(m) }
@@ -163,7 +161,6 @@
 func (m xxx_Layer1_Layer2_Layer3) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Layer1_Layer2_Layer3) ProtoMutable() {}
 
 func (m *Layer1_Layer2_Layer3) Reset()         { *m = Layer1_Layer2_Layer3{} }
 func (m *Layer1_Layer2_Layer3) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
index eb5618d..db64579 100644
--- a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
@@ -41,7 +41,6 @@
 func (m xxx_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Message) ProtoMutable() {}
 
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
index 2a72ccd..293a5b3 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -110,7 +110,6 @@
 func (m xxx_FieldTestMessage) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage) ProtoMutable() {}
 
 func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
 func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
@@ -419,7 +418,6 @@
 func (m xxx_FieldTestMessage_Message) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldTestMessage_Message) ProtoMutable() {}
 
 func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
 func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index baa13fd..f2a5fbd 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -118,20 +118,6 @@
 	p.x.Set(n, x)
 }
 
-func (p legacyExtensionFields) Mutable(n pref.FieldNumber) pref.Mutable {
-	x := p.x.Get(n)
-	if x.Desc == nil {
-		panic("no extension descriptor registered")
-	}
-	t := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
-	if x.Value == nil {
-		v := t.ValueOf(t.New())
-		x.Value = t.InterfaceOf(v)
-		p.x.Set(n, x)
-	}
-	return t.ValueOf(x.Value).Interface().(pref.Mutable)
-}
-
 func (p legacyExtensionFields) Range(f func(pref.FieldNumber, pref.Value) bool) {
 	p.x.Range(func(n pref.FieldNumber, x papi.ExtensionField) bool {
 		if p.Has(n) {
@@ -141,6 +127,15 @@
 	})
 }
 
+func (p legacyExtensionFields) NewMessage(n pref.FieldNumber) pref.ProtoMessage {
+	x := p.x.Get(n)
+	if x.Desc == nil {
+		panic("no extension descriptor registered")
+	}
+	xt := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+	return xt.ValueOf(xt.New()).Message().Interface()
+}
+
 func (p legacyExtensionFields) ExtensionTypes() pref.ExtensionFieldTypes {
 	return legacyExtensionTypes(p)
 }
diff --git a/internal/impl/message.go b/internal/impl/message.go
index 328103c..3d94a94 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -265,15 +265,6 @@
 		return
 	}
 }
-func (fs *knownFields) Mutable(n pref.FieldNumber) pref.Mutable {
-	if fi := fs.mi.fields[n]; fi != nil {
-		return fi.mutable(fs.p)
-	}
-	if fs.mi.Type.ExtensionRanges().Has(n) {
-		return fs.extensionFields().Mutable(n)
-	}
-	panic(fmt.Sprintf("invalid field: %d", n))
-}
 func (fs *knownFields) Range(f func(pref.FieldNumber, pref.Value) bool) {
 	for n, fi := range fs.mi.fields {
 		if fi.has(fs.p) {
@@ -284,6 +275,15 @@
 	}
 	fs.extensionFields().Range(f)
 }
+func (fs *knownFields) NewMessage(n pref.FieldNumber) pref.ProtoMessage {
+	if fi := fs.mi.fields[n]; fi != nil {
+		return fi.newMessage().Interface()
+	}
+	if fs.mi.Type.ExtensionRanges().Has(n) {
+		return fs.extensionFields().NewMessage(n)
+	}
+	panic(fmt.Sprintf("invalid field: %d", n))
+}
 func (fs *knownFields) ExtensionTypes() pref.ExtensionFieldTypes {
 	return fs.extensionFields().ExtensionTypes()
 }
@@ -306,9 +306,11 @@
 func (emptyExtensionFields) Get(pref.FieldNumber) pref.Value               { return pref.Value{} }
 func (emptyExtensionFields) Set(pref.FieldNumber, pref.Value)              { panic("extensions not supported") }
 func (emptyExtensionFields) Clear(pref.FieldNumber)                        { return } // noop
-func (emptyExtensionFields) Mutable(pref.FieldNumber) pref.Mutable         { panic("extensions not supported") }
 func (emptyExtensionFields) Range(func(pref.FieldNumber, pref.Value) bool) { return }
-func (emptyExtensionFields) ExtensionTypes() pref.ExtensionFieldTypes      { return emptyExtensionTypes{} }
+func (emptyExtensionFields) NewMessage(pref.FieldNumber) pref.ProtoMessage {
+	panic("extensions not supported")
+}
+func (emptyExtensionFields) ExtensionTypes() pref.ExtensionFieldTypes { return emptyExtensionTypes{} }
 
 type emptyExtensionTypes struct{}
 
diff --git a/internal/impl/message_field.go b/internal/impl/message_field.go
index c55cbc8..06e571e 100644
--- a/internal/impl/message_field.go
+++ b/internal/impl/message_field.go
@@ -16,11 +16,11 @@
 type fieldInfo struct {
 	// TODO: specialize marshal and unmarshal functions?
 
-	has     func(pointer) bool
-	get     func(pointer) pref.Value
-	set     func(pointer, pref.Value)
-	clear   func(pointer)
-	mutable func(pointer) pref.Mutable
+	has        func(pointer) bool
+	get        func(pointer) pref.Value
+	set        func(pointer, pref.Value)
+	clear      func(pointer)
+	newMessage func() pref.Message
 }
 
 func fieldInfoForWeak(fd pref.FieldDescriptor, fs reflect.StructField) fieldInfo {
@@ -86,18 +86,9 @@
 			}
 			rv.Set(reflect.Zero(rv.Type()))
 		},
-		mutable: func(p pointer) pref.Mutable {
-			// Mutable is only valid for messages and panics for other kinds.
-			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
-			if rv.IsNil() || rv.Elem().Type().Elem() != ot {
-				rv.Set(reflect.New(ot))
-			}
-			rv = rv.Elem().Elem().Field(0)
-			if rv.IsNil() {
-				pv := pref.ValueOf(conv.MessageType.New().ProtoReflect())
-				rv.Set(conv.GoValueOf(pv))
-			}
-			return conv.PBValueOf(rv).Message()
+		newMessage: func() pref.Message {
+			// This is only valid for messages and panics for other kinds.
+			return conv.MessageType.New().ProtoReflect()
 		},
 	}
 }
@@ -135,10 +126,6 @@
 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
 			rv.Set(reflect.Zero(rv.Type()))
 		},
-		mutable: func(p pointer) pref.Mutable {
-			v := p.Apply(fieldOffset).AsIfaceOf(fs.Type)
-			return pvalue.MapOf(v, keyConv, valConv)
-		},
 	}
 }
 
@@ -174,10 +161,6 @@
 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
 			rv.Set(reflect.Zero(rv.Type()))
 		},
-		mutable: func(p pointer) pref.Mutable {
-			v := p.Apply(fieldOffset).AsIfaceOf(fs.Type)
-			return pvalue.ListOf(v, conv)
-		},
 	}
 }
 
@@ -253,9 +236,6 @@
 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
 			rv.Set(reflect.Zero(rv.Type()))
 		},
-		mutable: func(p pointer) pref.Mutable {
-			panic("invalid mutable call")
-		},
 	}
 }
 
@@ -293,14 +273,8 @@
 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
 			rv.Set(reflect.Zero(rv.Type()))
 		},
-		mutable: func(p pointer) pref.Mutable {
-			// Mutable is only valid for messages and panics for other kinds.
-			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
-			if rv.IsNil() {
-				pv := pref.ValueOf(conv.MessageType.New().ProtoReflect())
-				rv.Set(conv.GoValueOf(pv))
-			}
-			return conv.PBValueOf(rv).Message()
+		newMessage: func() pref.Message {
+			return conv.MessageType.New().ProtoReflect()
 		},
 	}
 }
diff --git a/internal/impl/message_test.go b/internal/impl/message_test.go
index 935b9f8..f49e5c1 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -229,7 +229,6 @@
 func (m *ScalarProto2) UnknownFields() pref.UnknownFields { return scalarProto2Type.UnknownFieldsOf(m) }
 func (m *ScalarProto2) Interface() pref.ProtoMessage      { return m }
 func (m *ScalarProto2) ProtoReflect() pref.Message        { return m }
-func (m *ScalarProto2) ProtoMutable()                     {}
 
 func TestScalarProto2(t *testing.T) {
 	testMessage(t, nil, &ScalarProto2{}, messageOps{
@@ -336,7 +335,6 @@
 func (m *ScalarProto3) UnknownFields() pref.UnknownFields { return scalarProto3Type.UnknownFieldsOf(m) }
 func (m *ScalarProto3) Interface() pref.ProtoMessage      { return m }
 func (m *ScalarProto3) ProtoReflect() pref.Message        { return m }
-func (m *ScalarProto3) ProtoMutable()                     {}
 
 func TestScalarProto3(t *testing.T) {
 	testMessage(t, nil, &ScalarProto3{}, messageOps{
@@ -454,7 +452,6 @@
 func (m *ListScalars) UnknownFields() pref.UnknownFields { return listScalarsType.UnknownFieldsOf(m) }
 func (m *ListScalars) Interface() pref.ProtoMessage      { return m }
 func (m *ListScalars) ProtoReflect() pref.Message        { return m }
-func (m *ListScalars) ProtoMutable()                     {}
 
 func TestListScalars(t *testing.T) {
 	empty := &ListScalars{}
@@ -645,7 +642,6 @@
 func (m *MapScalars) UnknownFields() pref.UnknownFields { return mapScalarsType.UnknownFieldsOf(m) }
 func (m *MapScalars) Interface() pref.ProtoMessage      { return m }
 func (m *MapScalars) ProtoReflect() pref.Message        { return m }
-func (m *MapScalars) ProtoMutable()                     {}
 
 func TestMapScalars(t *testing.T) {
 	empty := &MapScalars{}
@@ -804,7 +800,6 @@
 func (m *OneofScalars) UnknownFields() pref.UnknownFields { return oneofScalarsType.UnknownFieldsOf(m) }
 func (m *OneofScalars) Interface() pref.ProtoMessage      { return m }
 func (m *OneofScalars) ProtoReflect() pref.Message        { return m }
-func (m *OneofScalars) ProtoMutable()                     {}
 
 func (*OneofScalars) XXX_OneofWrappers() []interface{} {
 	return []interface{}{
@@ -1030,7 +1025,6 @@
 func (m *EnumMessages) UnknownFields() pref.UnknownFields { return enumMessagesType.UnknownFieldsOf(m) }
 func (m *EnumMessages) Interface() pref.ProtoMessage      { return m }
 func (m *EnumMessages) ProtoReflect() pref.Message        { return m }
-func (m *EnumMessages) ProtoMutable()                     {}
 
 func (*EnumMessages) XXX_OneofWrappers() []interface{} {
 	return []interface{}{
@@ -1223,7 +1217,10 @@
 		case messageFields:
 			for n, tt := range op {
 				p.Push(int(n))
-				testMessage(t, p, fs.Mutable(n).(pref.Message), tt)
+				if !fs.Has(n) {
+					fs.Set(n, V(fs.NewMessage(n)))
+				}
+				testMessage(t, p, fs.Get(n).Message(), tt)
 				p.Pop()
 			}
 		case listFields:
@@ -1285,7 +1282,9 @@
 				v.Append(e)
 			}
 		case appendMessageList:
-			testMessage(t, p, v.MutableAppend().(pref.Message), messageOps(op))
+			m := v.NewMessage().ProtoReflect()
+			v.Append(V(m))
+			testMessage(t, p, m, messageOps(op))
 		case truncList:
 			v.Truncate(int(op))
 		default:
@@ -1335,7 +1334,11 @@
 			}
 		case messageMap:
 			for k, tt := range op {
-				testMessage(t, p, m.Mutable(V(k).MapKey()).(pref.Message), tt)
+				mk := V(k).MapKey()
+				if !m.Has(mk) {
+					m.Set(mk, V(m.NewMessage()))
+				}
+				testMessage(t, p, m.Get(mk).Message(), tt)
 			}
 		case rangeMap:
 			got := map[interface{}]pref.Value{}
diff --git a/internal/value/list.go b/internal/value/list.go
index bcac98b..cf06b9c 100644
--- a/internal/value/list.go
+++ b/internal/value/list.go
@@ -39,20 +39,12 @@
 func (ls listReflect) Append(v pref.Value) {
 	ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(v)))
 }
-func (ls listReflect) Mutable(i int) pref.Mutable {
-	// Mutable is only valid for messages and panics for other kinds.
-	return ls.conv.PBValueOf(ls.v.Elem().Index(i)).Message()
-}
-func (ls listReflect) MutableAppend() pref.Mutable {
-	// MutableAppend is only valid for messages and panics for other kinds.
-	pv := pref.ValueOf(ls.conv.MessageType.New().ProtoReflect())
-	ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(pv)))
-	return pv.Message()
-}
 func (ls listReflect) Truncate(i int) {
 	ls.v.Elem().Set(ls.v.Elem().Slice(0, i))
 }
+func (ls listReflect) NewMessage() pref.ProtoMessage {
+	return ls.conv.MessageType.New()
+}
 func (ls listReflect) ProtoUnwrap() interface{} {
 	return ls.v.Interface()
 }
-func (ls listReflect) ProtoMutable() {}
diff --git a/internal/value/map.go b/internal/value/map.go
index 28b901b..cc84f66 100644
--- a/internal/value/map.go
+++ b/internal/value/map.go
@@ -62,20 +62,6 @@
 	rk := ms.keyConv.GoValueOf(k.Value())
 	ms.v.Elem().SetMapIndex(rk, reflect.Value{})
 }
-func (ms mapReflect) Mutable(k pref.MapKey) pref.Mutable {
-	// Mutable is only valid for messages and panics for other kinds.
-	if ms.v.Elem().IsNil() {
-		ms.v.Elem().Set(reflect.MakeMap(ms.v.Elem().Type()))
-	}
-	rk := ms.keyConv.GoValueOf(k.Value())
-	rv := ms.v.Elem().MapIndex(rk)
-	if !rv.IsValid() {
-		pv := pref.ValueOf(ms.valConv.MessageType.New().ProtoReflect())
-		rv = ms.valConv.GoValueOf(pv)
-		ms.v.Elem().SetMapIndex(rk, rv)
-	}
-	return ms.valConv.PBValueOf(rv).Message()
-}
 func (ms mapReflect) Range(f func(pref.MapKey, pref.Value) bool) {
 	if ms.v.IsNil() {
 		return
@@ -90,7 +76,9 @@
 		}
 	}
 }
+func (ms mapReflect) NewMessage() pref.ProtoMessage {
+	return ms.valConv.MessageType.New()
+}
 func (ms mapReflect) ProtoUnwrap() interface{} {
 	return ms.v.Interface()
 }
-func (ms mapReflect) ProtoMutable() {}
diff --git a/reflect/protoreflect/value.go b/reflect/protoreflect/value.go
index 66cb5da..8afd5c1 100644
--- a/reflect/protoreflect/value.go
+++ b/reflect/protoreflect/value.go
@@ -35,9 +35,6 @@
 	// Interface unwraps the message reflection interface and
 	// returns the underlying proto.Message interface.
 	Interface() ProtoMessage
-
-	// ProtoMutable is a marker method to implement the Mutable interface.
-	ProtoMutable()
 }
 
 // KnownFields provides accessor and mutator methods for known fields.
@@ -95,11 +92,6 @@
 	// a known field or extension field.
 	Clear(FieldNumber)
 
-	// Mutable returns a reference value for a field with a given field number,
-	// allocating a new instance if necessary.
-	// It panics if the field is not a message, list, or map.
-	Mutable(FieldNumber) Mutable
-
 	// Range iterates over every populated field in an undefined order,
 	// calling f for each field number and value encountered.
 	// Range calls f Len times unless f returns false, which stops iteration.
@@ -107,6 +99,11 @@
 	// may only be performed on the current field number.
 	Range(f func(FieldNumber, Value) bool)
 
+	// NewMessage returns a newly allocated empty message assignable to
+	// the field of the given number.
+	// It panics if the field is not a singular message.
+	NewMessage(FieldNumber) ProtoMessage
+
 	// ExtensionTypes are extension field types that are known by this
 	// specific message instance.
 	ExtensionTypes() ExtensionFieldTypes
@@ -243,22 +240,14 @@
 	// value aliases the source's memory in any way.
 	Append(Value)
 
-	// Mutable returns a Mutable reference for the element with a given index,
-	// allocating a new entry if necessary.
-	// It panics if the element kind is not a message.
-	Mutable(int) Mutable
-
-	// MutableAppend appends a new element and returns a mutable reference.
-	// It panics if the element kind is not a message.
-	MutableAppend() Mutable
-
-	// TODO: Should truncate accept two indexes similar to slicing?M
+	// TODO: Should truncate accept two indexes similar to slicing?
 
 	// Truncate truncates the list to a smaller length.
 	Truncate(int)
 
-	// ProtoMutable is a marker method to implement the Mutable interface.
-	ProtoMutable()
+	// NewMessage returns a newly allocated empty message assignable to a list entry.
+	// It panics if the list entry type is not a message.
+	NewMessage() ProtoMessage
 }
 
 // Map is an unordered, associative map. Only elements within the map
@@ -289,11 +278,6 @@
 	// The operation does nothing if there is no entry associated with the key.
 	Clear(MapKey)
 
-	// Mutable returns a Mutable reference for the element with a given key,
-	// allocating a new entry if necessary.
-	// It panics if the element kind is not a message.
-	Mutable(MapKey) Mutable
-
 	// Range iterates over every map entry in an undefined order,
 	// calling f for each key and value encountered.
 	// Range calls f Len times unless f returns false, which stops iteration.
@@ -301,12 +285,7 @@
 	// may only be performed on the current map key.
 	Range(f func(MapKey, Value) bool)
 
-	// ProtoMutable is a marker method to implement the Mutable interface.
-	ProtoMutable()
-}
-
-// Mutable is a mutable reference, where mutate operations also affect
-// the backing store. Possible Mutable types: Message, List, or Map.
-type Mutable interface {
-	ProtoMutable()
+	// NewMessage returns a newly allocated empty message assignable to a map value.
+	// It panics if the map value type is not a message.
+	NewMessage() ProtoMessage
 }
diff --git a/types/descriptor/descriptor.pb.go b/types/descriptor/descriptor.pb.go
index 08611a4..be51fb2 100644
--- a/types/descriptor/descriptor.pb.go
+++ b/types/descriptor/descriptor.pb.go
@@ -432,7 +432,6 @@
 func (m xxx_FileDescriptorSet) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FileDescriptorSet) ProtoMutable() {}
 
 func (m *FileDescriptorSet) Reset()         { *m = FileDescriptorSet{} }
 func (m *FileDescriptorSet) String() string { return protoapi.CompactTextString(m) }
@@ -495,7 +494,6 @@
 func (m xxx_FileDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FileDescriptorProto) ProtoMutable() {}
 
 func (m *FileDescriptorProto) Reset()         { *m = FileDescriptorProto{} }
 func (m *FileDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -624,7 +622,6 @@
 func (m xxx_DescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_DescriptorProto) ProtoMutable() {}
 
 func (m *DescriptorProto) Reset()         { *m = DescriptorProto{} }
 func (m *DescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -729,7 +726,6 @@
 func (m xxx_ExtensionRangeOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ExtensionRangeOptions) ProtoMutable() {}
 
 func (m *ExtensionRangeOptions) Reset()         { *m = ExtensionRangeOptions{} }
 func (m *ExtensionRangeOptions) String() string { return protoapi.CompactTextString(m) }
@@ -807,7 +803,6 @@
 func (m xxx_FieldDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldDescriptorProto) ProtoMutable() {}
 
 func (m *FieldDescriptorProto) Reset()         { *m = FieldDescriptorProto{} }
 func (m *FieldDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -912,7 +907,6 @@
 func (m xxx_OneofDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_OneofDescriptorProto) ProtoMutable() {}
 
 func (m *OneofDescriptorProto) Reset()         { *m = OneofDescriptorProto{} }
 func (m *OneofDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -969,7 +963,6 @@
 func (m xxx_EnumDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumDescriptorProto) ProtoMutable() {}
 
 func (m *EnumDescriptorProto) Reset()         { *m = EnumDescriptorProto{} }
 func (m *EnumDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -1040,7 +1033,6 @@
 func (m xxx_EnumValueDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumValueDescriptorProto) ProtoMutable() {}
 
 func (m *EnumValueDescriptorProto) Reset()         { *m = EnumValueDescriptorProto{} }
 func (m *EnumValueDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -1097,7 +1089,6 @@
 func (m xxx_ServiceDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ServiceDescriptorProto) ProtoMutable() {}
 
 func (m *ServiceDescriptorProto) Reset()         { *m = ServiceDescriptorProto{} }
 func (m *ServiceDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -1161,7 +1152,6 @@
 func (m xxx_MethodDescriptorProto) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_MethodDescriptorProto) ProtoMutable() {}
 
 func (m *MethodDescriptorProto) Reset()         { *m = MethodDescriptorProto{} }
 func (m *MethodDescriptorProto) String() string { return protoapi.CompactTextString(m) }
@@ -1323,7 +1313,6 @@
 func (m xxx_FileOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FileOptions) ProtoMutable() {}
 
 func (m *FileOptions) Reset()         { *m = FileOptions{} }
 func (m *FileOptions) String() string { return protoapi.CompactTextString(m) }
@@ -1574,7 +1563,6 @@
 func (m xxx_MessageOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_MessageOptions) ProtoMutable() {}
 
 func (m *MessageOptions) Reset()         { *m = MessageOptions{} }
 func (m *MessageOptions) String() string { return protoapi.CompactTextString(m) }
@@ -1715,7 +1703,6 @@
 func (m xxx_FieldOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_FieldOptions) ProtoMutable() {}
 
 func (m *FieldOptions) Reset()         { *m = FieldOptions{} }
 func (m *FieldOptions) String() string { return protoapi.CompactTextString(m) }
@@ -1813,7 +1800,6 @@
 func (m xxx_OneofOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_OneofOptions) ProtoMutable() {}
 
 func (m *OneofOptions) Reset()         { *m = OneofOptions{} }
 func (m *OneofOptions) String() string { return protoapi.CompactTextString(m) }
@@ -1871,7 +1857,6 @@
 func (m xxx_EnumOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumOptions) ProtoMutable() {}
 
 func (m *EnumOptions) Reset()         { *m = EnumOptions{} }
 func (m *EnumOptions) String() string { return protoapi.CompactTextString(m) }
@@ -1942,7 +1927,6 @@
 func (m xxx_EnumValueOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumValueOptions) ProtoMutable() {}
 
 func (m *EnumValueOptions) Reset()         { *m = EnumValueOptions{} }
 func (m *EnumValueOptions) String() string { return protoapi.CompactTextString(m) }
@@ -2006,7 +1990,6 @@
 func (m xxx_ServiceOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_ServiceOptions) ProtoMutable() {}
 
 func (m *ServiceOptions) Reset()         { *m = ServiceOptions{} }
 func (m *ServiceOptions) String() string { return protoapi.CompactTextString(m) }
@@ -2071,7 +2054,6 @@
 func (m xxx_MethodOptions) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_MethodOptions) ProtoMutable() {}
 
 func (m *MethodOptions) Reset()         { *m = MethodOptions{} }
 func (m *MethodOptions) String() string { return protoapi.CompactTextString(m) }
@@ -2150,7 +2132,6 @@
 func (m xxx_UninterpretedOption) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_UninterpretedOption) ProtoMutable() {}
 
 func (m *UninterpretedOption) Reset()         { *m = UninterpretedOption{} }
 func (m *UninterpretedOption) String() string { return protoapi.CompactTextString(m) }
@@ -2277,7 +2258,6 @@
 func (m xxx_SourceCodeInfo) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_SourceCodeInfo) ProtoMutable() {}
 
 func (m *SourceCodeInfo) Reset()         { *m = SourceCodeInfo{} }
 func (m *SourceCodeInfo) String() string { return protoapi.CompactTextString(m) }
@@ -2322,7 +2302,6 @@
 func (m xxx_GeneratedCodeInfo) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_GeneratedCodeInfo) ProtoMutable() {}
 
 func (m *GeneratedCodeInfo) Reset()         { *m = GeneratedCodeInfo{} }
 func (m *GeneratedCodeInfo) String() string { return protoapi.CompactTextString(m) }
@@ -2366,7 +2345,6 @@
 func (m xxx_DescriptorProto_ExtensionRange) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_DescriptorProto_ExtensionRange) ProtoMutable() {}
 
 func (m *DescriptorProto_ExtensionRange) Reset()         { *m = DescriptorProto_ExtensionRange{} }
 func (m *DescriptorProto_ExtensionRange) String() string { return protoapi.CompactTextString(m) }
@@ -2426,7 +2404,6 @@
 func (m xxx_DescriptorProto_ReservedRange) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_DescriptorProto_ReservedRange) ProtoMutable() {}
 
 func (m *DescriptorProto_ReservedRange) Reset()         { *m = DescriptorProto_ReservedRange{} }
 func (m *DescriptorProto_ReservedRange) String() string { return protoapi.CompactTextString(m) }
@@ -2482,7 +2459,6 @@
 func (m xxx_EnumDescriptorProto_EnumReservedRange) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_EnumDescriptorProto_EnumReservedRange) ProtoMutable() {}
 
 func (m *EnumDescriptorProto_EnumReservedRange) Reset()         { *m = EnumDescriptorProto_EnumReservedRange{} }
 func (m *EnumDescriptorProto_EnumReservedRange) String() string { return protoapi.CompactTextString(m) }
@@ -2535,7 +2511,6 @@
 func (m xxx_UninterpretedOption_NamePart) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_UninterpretedOption_NamePart) ProtoMutable() {}
 
 func (m *UninterpretedOption_NamePart) Reset()         { *m = UninterpretedOption_NamePart{} }
 func (m *UninterpretedOption_NamePart) String() string { return protoapi.CompactTextString(m) }
@@ -2661,7 +2636,6 @@
 func (m xxx_SourceCodeInfo_Location) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_SourceCodeInfo_Location) ProtoMutable() {}
 
 func (m *SourceCodeInfo_Location) Reset()         { *m = SourceCodeInfo_Location{} }
 func (m *SourceCodeInfo_Location) String() string { return protoapi.CompactTextString(m) }
@@ -2740,7 +2714,6 @@
 func (m xxx_GeneratedCodeInfo_Annotation) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_GeneratedCodeInfo_Annotation) ProtoMutable() {}
 
 func (m *GeneratedCodeInfo_Annotation) Reset()         { *m = GeneratedCodeInfo_Annotation{} }
 func (m *GeneratedCodeInfo_Annotation) String() string { return protoapi.CompactTextString(m) }
diff --git a/types/plugin/plugin.pb.go b/types/plugin/plugin.pb.go
index 4cffd71..b83d34a 100644
--- a/types/plugin/plugin.pb.go
+++ b/types/plugin/plugin.pb.go
@@ -47,7 +47,6 @@
 func (m xxx_Version) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_Version) ProtoMutable() {}
 
 func (m *Version) Reset()         { *m = Version{} }
 func (m *Version) String() string { return proto.CompactTextString(m) }
@@ -149,7 +148,6 @@
 func (m xxx_CodeGeneratorRequest) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_CodeGeneratorRequest) ProtoMutable() {}
 
 func (m *CodeGeneratorRequest) Reset()         { *m = CodeGeneratorRequest{} }
 func (m *CodeGeneratorRequest) String() string { return proto.CompactTextString(m) }
@@ -238,7 +236,6 @@
 func (m xxx_CodeGeneratorResponse) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_CodeGeneratorResponse) ProtoMutable() {}
 
 func (m *CodeGeneratorResponse) Reset()         { *m = CodeGeneratorResponse{} }
 func (m *CodeGeneratorResponse) String() string { return proto.CompactTextString(m) }
@@ -355,7 +352,6 @@
 func (m xxx_CodeGeneratorResponse_File) Interface() protoreflect.ProtoMessage {
 	return m.m
 }
-func (m xxx_CodeGeneratorResponse_File) ProtoMutable() {}
 
 func (m *CodeGeneratorResponse_File) Reset()         { *m = CodeGeneratorResponse_File{} }
 func (m *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(m) }