goprotobuf: push out internal changes.
  - group text parsing and formatting
  - foreign extension types

R=adg
CC=golang-dev
http://codereview.appspot.com/4437079
diff --git a/compiler/generator/generator.go b/compiler/generator/generator.go
index 4d0063d..2d93658 100644
--- a/compiler/generator/generator.go
+++ b/compiler/generator/generator.go
@@ -49,7 +49,7 @@
 	"strings"
 
 	"goprotobuf.googlecode.com/hg/proto"
-	plugin     "goprotobuf.googlecode.com/hg/compiler/plugin"
+	plugin "goprotobuf.googlecode.com/hg/compiler/plugin"
 	descriptor "goprotobuf.googlecode.com/hg/compiler/descriptor"
 )
 
@@ -890,7 +890,17 @@
 		packed = ",packed"
 	}
 	name := proto.GetString(field.Name)
-	if name == CamelCase(name) {
+	if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP {
+		// We must use the type name for groups instead of
+		// the field name to preserve capitalization.
+		// type_name in FieldDescriptorProto is fully-qualified,
+		// but we only want the local part.
+		name = *field.TypeName
+		if i := strings.LastIndex(name, "."); i >= 0 {
+			name = name[i+1:]
+		}
+		name = ",name=" + name
+	} else if name == CamelCase(name) {
 		name = ""
 	} else {
 		name = ",name=" + name
@@ -1140,6 +1150,10 @@
 	fieldType, wireType := g.GoType(ext.parent, field)
 	tag := g.goTag(field, wireType)
 	g.RecordTypeUse(*ext.Extendee)
+	if n := ext.FieldDescriptorProto.TypeName; n != nil {
+		// foreign extension type
+		g.RecordTypeUse(*n)
+	}
 
 	g.P("var ", ccTypeName, " = &", g.ProtoPkg, ".ExtensionDesc{")
 	g.In()