goprotobuf: export from internal version.
- String() method on enum types for easy printing
- GetExtensions function for getting extensions in bulk

R=r
CC=golang-dev
http://codereview.appspot.com/4300057
diff --git a/compiler/generator/generator.go b/compiler/generator/generator.go
index 9878ef1..7c2a39e 100644
--- a/compiler/generator/generator.go
+++ b/compiler/generator/generator.go
@@ -779,7 +779,7 @@
 	}
 	g.Out()
 	g.P(")")
-	g.P("var ", ccTypeName, "_name = map[int32] string {")
+	g.P("var ", ccTypeName, "_name = map[int32]string{")
 	g.In()
 	generated := make(map[int32]bool) // avoid duplicate values
 	for _, e := range enum.Value {
@@ -792,19 +792,27 @@
 	}
 	g.Out()
 	g.P("}")
-	g.P("var ", ccTypeName, "_value = map[string] int32 {")
+	g.P("var ", ccTypeName, "_value = map[string]int32{")
 	g.In()
 	for _, e := range enum.Value {
 		g.P(Quote(*e.Name), ": ", e.Number, ",")
 	}
 	g.Out()
 	g.P("}")
+
 	g.P("func New", ccTypeName, "(x int32) *", ccTypeName, " {")
 	g.In()
 	g.P("e := ", ccTypeName, "(x)")
 	g.P("return &e")
 	g.Out()
 	g.P("}")
+
+	g.P("func (x ", ccTypeName, ") String() string {")
+	g.In()
+	g.P("return ", g.ProtoPkg, ".EnumName(", ccTypeName, "_name, int32(x))")
+	g.Out()
+	g.P("}")
+
 	g.P()
 }
 
diff --git a/compiler/testdata/test.pb.go.golden b/compiler/testdata/test.pb.go.golden
index 4d364e7..bc2c469 100644
--- a/compiler/testdata/test.pb.go.golden
+++ b/compiler/testdata/test.pb.go.golden
@@ -19,11 +19,11 @@
 	HatType_FEDORA = 1
 	HatType_FEZ = 2
 )
-var HatType_name = map[int32] string {
+var HatType_name = map[int32]string{
 	1: "FEDORA",
 	2: "FEZ",
 }
-var HatType_value = map[string] int32 {
+var HatType_value = map[string]int32{
 	"FEDORA": 1,
 	"FEZ": 2,
 }
@@ -31,6 +31,9 @@
 	e := HatType(x)
 	return &e
 }
+func (x HatType) String() string {
+	return proto.EnumName(HatType_name, int32(x))
+}
 
 type Days int32
 const (
@@ -38,12 +41,12 @@
 	Days_TUESDAY = 2
 	Days_LUNDI = 1
 )
-var Days_name = map[int32] string {
+var Days_name = map[int32]string{
 	1: "MONDAY",
 	2: "TUESDAY",
 	// Duplicate value: 1: "LUNDI",
 }
-var Days_value = map[string] int32 {
+var Days_value = map[string]int32{
 	"MONDAY": 1,
 	"TUESDAY": 2,
 	"LUNDI": 1,
@@ -52,6 +55,9 @@
 	e := Days(x)
 	return &e
 }
+func (x Days) String() string {
+	return proto.EnumName(Days_name, int32(x))
+}
 
 type Request_Color int32
 const (
@@ -59,12 +65,12 @@
 	Request_GREEN = 1
 	Request_BLUE = 2
 )
-var Request_Color_name = map[int32] string {
+var Request_Color_name = map[int32]string{
 	0: "RED",
 	1: "GREEN",
 	2: "BLUE",
 }
-var Request_Color_value = map[string] int32 {
+var Request_Color_value = map[string]int32{
 	"RED": 0,
 	"GREEN": 1,
 	"BLUE": 2,
@@ -73,17 +79,20 @@
 	e := Request_Color(x)
 	return &e
 }
+func (x Request_Color) String() string {
+	return proto.EnumName(Request_Color_name, int32(x))
+}
 
 type Reply_Entry_Game int32
 const (
 	Reply_Entry_FOOTBALL = 1
 	Reply_Entry_TENNIS = 2
 )
-var Reply_Entry_Game_name = map[int32] string {
+var Reply_Entry_Game_name = map[int32]string{
 	1: "FOOTBALL",
 	2: "TENNIS",
 }
-var Reply_Entry_Game_value = map[string] int32 {
+var Reply_Entry_Game_value = map[string]int32{
 	"FOOTBALL": 1,
 	"TENNIS": 2,
 }
@@ -91,6 +100,9 @@
 	e := Reply_Entry_Game(x)
 	return &e
 }
+func (x Reply_Entry_Game) String() string {
+	return proto.EnumName(Reply_Entry_Game_name, int32(x))
+}
 
 type Request struct {
 	Key	[]int64	"PB(varint,1,rep,name=key)"