Ver Fonte

Add E_ prefixes to *all* extension descriptors to avoid namespace collisions.

R=r
http://codereview.appspot.com/879046
David Symonds há 16 anos atrás
pai
commit
9bd0a830b4

+ 4 - 4
compiler/main.go

@@ -200,8 +200,8 @@ type ExtensionDescriptor struct {
 func (e *ExtensionDescriptor) typeName() (s []string) {
 func (e *ExtensionDescriptor) typeName() (s []string) {
 	name := proto.GetString(e.Name)
 	name := proto.GetString(e.Name)
 	if e.parent == nil {
 	if e.parent == nil {
-		s = make([]string, 2)
-		s[0] = "E"  // top-level extension namespace
+		// top-level extension
+		s = make([]string, 1)
 	} else {
 	} else {
 		pname := e.parent.typeName()
 		pname := e.parent.typeName()
 		s = make([]string, len(pname)+1)
 		s = make([]string, len(pname)+1)
@@ -908,11 +908,11 @@ func (g *Generator) GenerateMessage(message *Descriptor) {
 func (g *Generator) GenerateExtension(ext *ExtensionDescriptor) {
 func (g *Generator) GenerateExtension(ext *ExtensionDescriptor) {
 	// The full type name
 	// The full type name
 	typeName := ext.typeName()
 	typeName := ext.typeName()
-	// Each scope of the extension is individually CamelCased, and all are joined with "_".
+	// Each scope of the extension is individually CamelCased, and all are joined with "_" with a "E_" prefix.
 	for i, s := range typeName {
 	for i, s := range typeName {
 		typeName[i] = CamelCase(s)
 		typeName[i] = CamelCase(s)
 	}
 	}
-	ccTypeName := strings.Join(typeName, "_")
+	ccTypeName := "E_" + strings.Join(typeName, "_")
 
 
 	extendedType := "*" + g.TypeName(g.objectNamed(*ext.Extendee))
 	extendedType := "*" + g.TypeName(g.objectNamed(*ext.Extendee))
 	field := ext.FieldDescriptorProto
 	field := ext.FieldDescriptorProto

+ 10 - 11
compiler/testdata/extension_test.go

@@ -47,8 +47,7 @@ func TestSingleFieldExtension(t *testing.T) {
 
 
 	// Use extension within scope of another type.
 	// Use extension within scope of another type.
 	vol := proto.Uint32(11)
 	vol := proto.Uint32(11)
-	t.Logf("bm: %T, user.LoudMessage_Volume: %T", bm, user.LoudMessage_Volume)
-	err := proto.SetExtension(bm, user.LoudMessage_Volume, vol)
+	err := proto.SetExtension(bm, user.E_LoudMessage_Volume, vol)
 	if err != nil {
 	if err != nil {
 		t.Fatal("Failed setting extension:", err)
 		t.Fatal("Failed setting extension:", err)
 	}
 	}
@@ -60,18 +59,18 @@ func TestSingleFieldExtension(t *testing.T) {
 	if err := proto.Unmarshal(buf, bm_new); err != nil {
 	if err := proto.Unmarshal(buf, bm_new); err != nil {
 		t.Fatal("Failed decoding message with extension:", err)
 		t.Fatal("Failed decoding message with extension:", err)
 	}
 	}
-	if !proto.HasExtension(bm_new, user.LoudMessage_Volume) {
+	if !proto.HasExtension(bm_new, user.E_LoudMessage_Volume) {
 		t.Fatal("Decoded message didn't contain extension.")
 		t.Fatal("Decoded message didn't contain extension.")
 	}
 	}
-	vol_out, err := proto.GetExtension(bm_new, user.LoudMessage_Volume)
+	vol_out, err := proto.GetExtension(bm_new, user.E_LoudMessage_Volume)
 	if err != nil {
 	if err != nil {
 		t.Fatal("Failed getting extension:", err)
 		t.Fatal("Failed getting extension:", err)
 	}
 	}
 	if v := vol_out.(*uint32); *v != *vol {
 	if v := vol_out.(*uint32); *v != *vol {
 		t.Errorf("vol_out = %v, expected %v", *v, *vol)
 		t.Errorf("vol_out = %v, expected %v", *v, *vol)
 	}
 	}
-	proto.ClearExtension(bm_new, user.LoudMessage_Volume)
-	if proto.HasExtension(bm_new, user.LoudMessage_Volume) {
+	proto.ClearExtension(bm_new, user.E_LoudMessage_Volume)
+	if proto.HasExtension(bm_new, user.E_LoudMessage_Volume) {
 		t.Fatal("Failed clearing extension.")
 		t.Fatal("Failed clearing extension.")
 	}
 	}
 }
 }
@@ -85,7 +84,7 @@ func TestMessageExtension(t *testing.T) {
 		Name: proto.String("Dave"),
 		Name: proto.String("Dave"),
 		Rank: proto.String("Major"),
 		Rank: proto.String("Major"),
 	}
 	}
-	err := proto.SetExtension(bm, user.LoginMessage_UserMessage, um)
+	err := proto.SetExtension(bm, user.E_LoginMessage_UserMessage, um)
 	if err != nil {
 	if err != nil {
 		t.Fatal("Failed setting extension:", err)
 		t.Fatal("Failed setting extension:", err)
 	}
 	}
@@ -97,10 +96,10 @@ func TestMessageExtension(t *testing.T) {
 	if err := proto.Unmarshal(buf, bm_new); err != nil {
 	if err := proto.Unmarshal(buf, bm_new); err != nil {
 		t.Fatal("Failed decoding message with extension:", err)
 		t.Fatal("Failed decoding message with extension:", err)
 	}
 	}
-	if !proto.HasExtension(bm_new, user.LoginMessage_UserMessage) {
+	if !proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) {
 		t.Fatal("Decoded message didn't contain extension.")
 		t.Fatal("Decoded message didn't contain extension.")
 	}
 	}
-	um_out, err := proto.GetExtension(bm_new, user.LoginMessage_UserMessage)
+	um_out, err := proto.GetExtension(bm_new, user.E_LoginMessage_UserMessage)
 	if err != nil {
 	if err != nil {
 		t.Fatal("Failed getting extension:", err)
 		t.Fatal("Failed getting extension:", err)
 	}
 	}
@@ -110,8 +109,8 @@ func TestMessageExtension(t *testing.T) {
 	if r := um_out.(*user.UserMessage).Rank; *r != *um.Rank {
 	if r := um_out.(*user.UserMessage).Rank; *r != *um.Rank {
 		t.Errorf("um_out.Rank = %q, expected %q", *r, *um.Rank)
 		t.Errorf("um_out.Rank = %q, expected %q", *r, *um.Rank)
 	}
 	}
-	proto.ClearExtension(bm_new, user.LoginMessage_UserMessage)
-	if proto.HasExtension(bm_new, user.LoginMessage_UserMessage) {
+	proto.ClearExtension(bm_new, user.E_LoginMessage_UserMessage)
+	if proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) {
 		t.Fatal("Failed clearing extension.")
 		t.Fatal("Failed clearing extension.")
 	}
 	}
 }
 }

+ 1 - 1
compiler/testdata/test.pb.go.golden

@@ -131,7 +131,7 @@ func NewReplyExtensions() *ReplyExtensions {
 	return new(ReplyExtensions)
 	return new(ReplyExtensions)
 }
 }
 
 
-var ReplyExtensions_Time = &proto.ExtensionDesc{
+var E_ReplyExtensions_Time = &proto.ExtensionDesc{
 	ExtendedType: (*Reply)(nil),
 	ExtendedType: (*Reply)(nil),
 	ExtensionType: (*float64)(nil),
 	ExtensionType: (*float64)(nil),
 	Field: 101,
 	Field: 101,

+ 5 - 0
proto/lib.go

@@ -58,6 +58,11 @@
 	  	with the enum's type name.
 	  	with the enum's type name.
 	  - Nested groups and enums have type names prefixed with the name of
 	  - Nested groups and enums have type names prefixed with the name of
 	  	the surrounding message type.
 	  	the surrounding message type.
+	  - Extensions are given descriptor names that start with E_,
+		followed by an underscore-delimited list of the nested messages
+		that contain it (if any) followed by the CamelCased name of the
+		extension field itself.  HasExtension, ClearExtension, GetExtension
+		and SetExtension are functions for manipulating extensions.
 	  - Marshal and Unmarshal are functions to encode and decode the wire format.
 	  - Marshal and Unmarshal are functions to encode and decode the wire format.
 
 
 	The simplest way to describe this is to see an example.
 	The simplest way to describe this is to see an example.