goprotobuf: sync from Google internal version.
Interesting changes:
- String method on protocol buffer message types
that renders the message in compact text format.
- Extension text formatting.
R=r
CC=golang-dev
http://codereview.appspot.com/4643050
diff --git a/proto/extensions.go b/proto/extensions.go
index fe71709..4594c8b 100644
--- a/proto/extensions.go
+++ b/proto/extensions.go
@@ -39,6 +39,7 @@
import (
"os"
"reflect"
+ "strconv"
"unsafe"
)
@@ -60,6 +61,7 @@
ExtendedType interface{} // nil pointer to the type that is being extended
ExtensionType interface{} // nil pointer to the extension type
Field int32 // field number
+ Name string // fully-qualified name of extension
Tag string // PB(...) tag style
}
@@ -179,3 +181,22 @@
pb.ExtensionMap()[extension.Field] = p.buf
return nil
}
+
+// A global registry of extensions.
+// The generated code will register the generated descriptors by calling RegisterExtension.
+
+var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc)
+
+// RegisterExtension is called from the generated code.
+func RegisterExtension(desc *ExtensionDesc) {
+ st := reflect.TypeOf(desc.ExtendedType).Elem()
+ m := extensionMaps[st]
+ if m == nil {
+ m = make(map[int32]*ExtensionDesc)
+ extensionMaps[st] = m
+ }
+ if _, ok := m[desc.Field]; ok {
+ panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field)))
+ }
+ m[desc.Field] = desc
+}