encoding/textpb: unmarshal Any

Also fix marshaling Any in expanded form to contain the correct type_url
value.

Change-Id: I4b467e74bb1d73255effd9cc4cfff9cf4558940f
Reviewed-on: https://go-review.googlesource.com/c/156342
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/textpb/encode.go b/encoding/textpb/encode.go
index 57a35c6..77606da 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -375,10 +375,10 @@
 	}
 
 	knownFields := m.KnownFields()
-	typeURL := knownFields.Get(tfd.Number())
+	typeURL := knownFields.Get(tfd.Number()).String()
 	value := knownFields.Get(vfd.Number())
 
-	emt, err := o.Resolver.FindMessageByURL(typeURL.String())
+	emt, err := o.Resolver.FindMessageByURL(typeURL)
 	if !nerr.Merge(err) {
 		return text.Value{}, err
 	}
@@ -393,12 +393,11 @@
 	if !nerr.Merge(err) {
 		return text.Value{}, err
 	}
-	// Expanded Any field value contains only a single field with the embedded
-	// message type as the field name in [] and a text marshaled field value of
-	// the embedded message.
+	// Expanded Any field value contains only a single field with the type_url field value as the
+	// field name in [] and a text marshaled field value of the embedded message.
 	msgFields := [][2]text.Value{
 		{
-			text.ValueOf(string(emt.FullName())),
+			text.ValueOf(typeURL),
 			msg,
 		},
 	}