encoding/textpb: clean-up code and fix error handling inside closures

In marshalMap, replace Map.Range and sortMap with
internal/mapsort.Range. Also, make sure to capture fatal error properly
for return.

In appendExtensions, capture fatal error properly for return. Added a
testcase that shows this was a bug.

In unmarshalAny, remove unnecessary checks and use internal/fieldnum for
Any's field numbers.

Change-Id: Id8574d5b4eb820ad961f6ad5e886f8ae2e9b90f0
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170627
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/textpb/encode_test.go b/encoding/textpb/encode_test.go
index d185fa6..c929549 100644
--- a/encoding/textpb/encode_test.go
+++ b/encoding/textpb/encode_test.go
@@ -919,6 +919,40 @@
 [pb2.opt_ext_string]: "extension field"
 `,
 	}, {
+		desc: "extension partial returns error",
+		input: func() proto.Message {
+			m := &pb2.Extensions{}
+			setExtension(m, pb2.E_OptExtPartial, &pb2.PartialRequired{
+				OptString: scalar.String("partial1"),
+			})
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtPartial, &pb2.PartialRequired{
+				OptString: scalar.String("partial2"),
+			})
+			return m
+		}(),
+		want: `[pb2.ExtensionsContainer.opt_ext_partial]: {
+  opt_string: "partial2"
+}
+[pb2.opt_ext_partial]: {
+  opt_string: "partial1"
+}
+`,
+		wantErr: true,
+	}, {
+		desc: "extension partial with AllowPartial",
+		mo:   textpb.MarshalOptions{AllowPartial: true},
+		input: func() proto.Message {
+			m := &pb2.Extensions{}
+			setExtension(m, pb2.E_OptExtPartial, &pb2.PartialRequired{
+				OptString: scalar.String("partial1"),
+			})
+			return m
+		}(),
+		want: `[pb2.opt_ext_partial]: {
+  opt_string: "partial1"
+}
+`,
+	}, {
 		desc: "extension message field set to nil",
 		input: func() proto.Message {
 			m := &pb2.Extensions{}