goprotobuf: Changes for new struct tag format.

Protocol messages have changed their struct tags from
  "PB(...)"
to
  `protobuf:"..."`
The format represented by "..." is unchanged.

Regenerate {descriptor,plugin}.pb.go files at the same time.

R=r, rsc
CC=golang-dev
http://codereview.appspot.com/4654077
diff --git a/proto/extensions.go b/proto/extensions.go
index 4594c8b..f44d741 100644
--- a/proto/extensions.go
+++ b/proto/extensions.go
@@ -62,7 +62,7 @@
 	ExtensionType interface{} // nil pointer to the extension type
 	Field         int32       // field number
 	Name          string      // fully-qualified name of extension
-	Tag           string      // PB(...) tag style
+	Tag           string      // protobuf tag style
 }
 
 // isExtensionField returns true iff the given field number is in an extension range.
diff --git a/proto/lib.go b/proto/lib.go
index 1d7ed89..6afad34 100644
--- a/proto/lib.go
+++ b/proto/lib.go
@@ -101,10 +101,10 @@
 		}
 
 		type Test struct {
-			Label	*string	"PB(bytes,1,req,name=label)"
-			Type	*int32	"PB(varint,2,opt,name=type,def=77)"
-			Reps	[]int64	"PB(varint,3,rep,name=reps)"
-			Optionalgroup	*Test_OptionalGroup	"PB(group,4,opt,name=optionalgroup)"
+			Label	*string	`protobuf:"bytes,1,req,name=label"`
+			Type	*int32	`protobuf:"varint,2,opt,name=type,def=77"`
+			Reps	[]int64	`protobuf:"varint,3,rep,name=reps"`
+			Optionalgroup	*Test_OptionalGroup	`protobuf:"group,4,opt,name=optionalgroup"`
 			XXX_unrecognized []byte
 		}
 		func (this *Test) Reset() {
@@ -113,7 +113,7 @@
 		const Default_Test_Type int32 = 77
 
 		type Test_OptionalGroup struct {
-			RequiredField	*string	"PB(bytes,5,req)"
+			RequiredField	*string	`protobuf:"bytes,5,req"`
 			XXX_unrecognized []byte
 		}
 		func (this *Test_OptionalGroup) Reset() {
diff --git a/proto/message_set.go b/proto/message_set.go
index 482e26b..036a8aa 100644
--- a/proto/message_set.go
+++ b/proto/message_set.go
@@ -58,17 +58,17 @@
 // When a proto1 proto has a field that looks like:
 //   optional message<MessageSet> info = 3;
 // the protocol compiler produces a field in the generated struct that looks like:
-//   Info *_proto_.MessageSet  "PB(bytes,3,opt,name=info)"
+//   Info *_proto_.MessageSet  `protobuf:"bytes,3,opt,name=info"`
 // The package is automatically inserted so there is no need for that proto file to
 // import this package.
 
 type _MessageSet_Item struct {
-	TypeId  *int32 "PB(varint,2,req,name=type_id)"
-	Message []byte "PB(bytes,3,req,name=message)"
+	TypeId  *int32 `protobuf:"varint,2,req,name=type_id"`
+	Message []byte `protobuf:"bytes,3,req,name=message"`
 }
 
 type MessageSet struct {
-	Item             []*_MessageSet_Item "PB(group,1,rep)"
+	Item             []*_MessageSet_Item `protobuf:"group,1,rep"`
 	XXX_unrecognized *bytes.Buffer
 	// TODO: caching?
 }
diff --git a/proto/properties.go b/proto/properties.go
index 161fdc9..61d691e 100644
--- a/proto/properties.go
+++ b/proto/properties.go
@@ -116,7 +116,7 @@
 	packedDec decoder
 }
 
-// String formats the properties in the "PB(...)" struct tag style.
+// String formats the properties in the protobuf struct field tag style.
 func (p *Properties) String() string {
 	s := p.Wire
 	s = ","
@@ -145,10 +145,10 @@
 	return s
 }
 
-// Parse populates p by parsing a string in the "PB(...)" struct tag style.
+// Parse populates p by parsing a string in the protobuf struct field tag style.
 func (p *Properties) Parse(s string) {
 	// "bytes,49,opt,def=hello!,name=foo"
-	fields := strings.Split(s, ",", -1) // breaks def=, but handled below.
+	fields := strings.Split(s, ",") // breaks def=, but handled below.
 	if len(fields) < 2 {
 		fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s)
 		return
@@ -411,18 +411,17 @@
 	p.tagcode = p.tagbuf[0 : i+1]
 }
 
-// Init populates the properties from a protocol buffer struct field.
+// Init populates the properties from a protocol buffer struct tag.
 func (p *Properties) Init(typ reflect.Type, name, tag string, offset uintptr) {
-	// "PB(bytes,49,opt,def=hello!)"
-	// TODO: should not assume the only thing is PB(...)
+	// "bytes,49,opt,def=hello!"
 	p.Name = name
 	p.OrigName = name
 	p.offset = offset
 
-	if len(tag) < 4 || tag[0:3] != "PB(" || tag[len(tag)-1] != ')' {
+	if tag == "" {
 		return
 	}
-	p.Parse(tag[3 : len(tag)-1])
+	p.Parse(tag)
 	p.setEncAndDec(typ)
 }
 
@@ -449,7 +448,7 @@
 	for i := 0; i < t.NumField(); i++ {
 		f := t.Field(i)
 		p := new(Properties)
-		p.Init(f.Type, f.Name, f.Tag, f.Offset)
+		p.Init(f.Type, f.Name, f.Tag.Get("protobuf"), f.Offset)
 		if f.Name == "XXX_extensions" { // special case
 			var vmap map[int32][]byte
 			p.enc = (*Buffer).enc_map
diff --git a/proto/testdata/test.pb.go b/proto/testdata/test.pb.go
index eea8b69..9eb7027 100644
--- a/proto/testdata/test.pb.go
+++ b/proto/testdata/test.pb.go
@@ -119,7 +119,7 @@
 }
 
 type GoEnum struct {
-	Foo			*FOO	"PB(varint,1,req,name=foo,enum=test_proto.FOO)"
+	Foo			*FOO	`protobuf:"varint,1,req,name=foo,enum=test_proto.FOO"`
 	XXX_unrecognized	[]byte
 }
 
@@ -127,8 +127,8 @@
 func (this *GoEnum) String() string	{ return proto.CompactTextString(this) }
 
 type GoTestField struct {
-	Label			*string	"PB(bytes,1,req)"
-	Type			*string	"PB(bytes,2,req)"
+	Label			*string	`protobuf:"bytes,1,req"`
+	Type			*string	`protobuf:"bytes,2,req"`
 	XXX_unrecognized	[]byte
 }
 
@@ -136,78 +136,78 @@
 func (this *GoTestField) String() string	{ return proto.CompactTextString(this) }
 
 type GoTest struct {
-	Kind			*int32			"PB(varint,1,req)"
-	Table			*string			"PB(bytes,2,opt)"
-	Param			*int32			"PB(varint,3,opt)"
-	RequiredField		*GoTestField		"PB(bytes,4,req)"
-	RepeatedField		[]*GoTestField		"PB(bytes,5,rep)"
-	OptionalField		*GoTestField		"PB(bytes,6,opt)"
-	F_BoolRequired		*bool			"PB(varint,10,req,name=F_Bool_required)"
-	F_Int32Required		*int32			"PB(varint,11,req,name=F_Int32_required)"
-	F_Int64Required		*int64			"PB(varint,12,req,name=F_Int64_required)"
-	F_Fixed32Required	*uint32			"PB(fixed32,13,req,name=F_Fixed32_required)"
-	F_Fixed64Required	*uint64			"PB(fixed64,14,req,name=F_Fixed64_required)"
-	F_Uint32Required	*uint32			"PB(varint,15,req,name=F_Uint32_required)"
-	F_Uint64Required	*uint64			"PB(varint,16,req,name=F_Uint64_required)"
-	F_FloatRequired		*float32		"PB(fixed32,17,req,name=F_Float_required)"
-	F_DoubleRequired	*float64		"PB(fixed64,18,req,name=F_Double_required)"
-	F_StringRequired	*string			"PB(bytes,19,req,name=F_String_required)"
-	F_BytesRequired		[]byte			"PB(bytes,101,req,name=F_Bytes_required)"
-	F_Sint32Required	*int32			"PB(zigzag32,102,req,name=F_Sint32_required)"
-	F_Sint64Required	*int64			"PB(zigzag64,103,req,name=F_Sint64_required)"
-	F_BoolRepeated		[]bool			"PB(varint,20,rep,name=F_Bool_repeated)"
-	F_Int32Repeated		[]int32			"PB(varint,21,rep,name=F_Int32_repeated)"
-	F_Int64Repeated		[]int64			"PB(varint,22,rep,name=F_Int64_repeated)"
-	F_Fixed32Repeated	[]uint32		"PB(fixed32,23,rep,name=F_Fixed32_repeated)"
-	F_Fixed64Repeated	[]uint64		"PB(fixed64,24,rep,name=F_Fixed64_repeated)"
-	F_Uint32Repeated	[]uint32		"PB(varint,25,rep,name=F_Uint32_repeated)"
-	F_Uint64Repeated	[]uint64		"PB(varint,26,rep,name=F_Uint64_repeated)"
-	F_FloatRepeated		[]float32		"PB(fixed32,27,rep,name=F_Float_repeated)"
-	F_DoubleRepeated	[]float64		"PB(fixed64,28,rep,name=F_Double_repeated)"
-	F_StringRepeated	[]string		"PB(bytes,29,rep,name=F_String_repeated)"
-	F_BytesRepeated		[][]byte		"PB(bytes,201,rep,name=F_Bytes_repeated)"
-	F_Sint32Repeated	[]int32			"PB(zigzag32,202,rep,name=F_Sint32_repeated)"
-	F_Sint64Repeated	[]int64			"PB(zigzag64,203,rep,name=F_Sint64_repeated)"
-	F_BoolOptional		*bool			"PB(varint,30,opt,name=F_Bool_optional)"
-	F_Int32Optional		*int32			"PB(varint,31,opt,name=F_Int32_optional)"
-	F_Int64Optional		*int64			"PB(varint,32,opt,name=F_Int64_optional)"
-	F_Fixed32Optional	*uint32			"PB(fixed32,33,opt,name=F_Fixed32_optional)"
-	F_Fixed64Optional	*uint64			"PB(fixed64,34,opt,name=F_Fixed64_optional)"
-	F_Uint32Optional	*uint32			"PB(varint,35,opt,name=F_Uint32_optional)"
-	F_Uint64Optional	*uint64			"PB(varint,36,opt,name=F_Uint64_optional)"
-	F_FloatOptional		*float32		"PB(fixed32,37,opt,name=F_Float_optional)"
-	F_DoubleOptional	*float64		"PB(fixed64,38,opt,name=F_Double_optional)"
-	F_StringOptional	*string			"PB(bytes,39,opt,name=F_String_optional)"
-	F_BytesOptional		[]byte			"PB(bytes,301,opt,name=F_Bytes_optional)"
-	F_Sint32Optional	*int32			"PB(zigzag32,302,opt,name=F_Sint32_optional)"
-	F_Sint64Optional	*int64			"PB(zigzag64,303,opt,name=F_Sint64_optional)"
-	F_BoolDefaulted		*bool			"PB(varint,40,opt,name=F_Bool_defaulted,def=1)"
-	F_Int32Defaulted	*int32			"PB(varint,41,opt,name=F_Int32_defaulted,def=32)"
-	F_Int64Defaulted	*int64			"PB(varint,42,opt,name=F_Int64_defaulted,def=64)"
-	F_Fixed32Defaulted	*uint32			"PB(fixed32,43,opt,name=F_Fixed32_defaulted,def=320)"
-	F_Fixed64Defaulted	*uint64			"PB(fixed64,44,opt,name=F_Fixed64_defaulted,def=640)"
-	F_Uint32Defaulted	*uint32			"PB(varint,45,opt,name=F_Uint32_defaulted,def=3200)"
-	F_Uint64Defaulted	*uint64			"PB(varint,46,opt,name=F_Uint64_defaulted,def=6400)"
-	F_FloatDefaulted	*float32		"PB(fixed32,47,opt,name=F_Float_defaulted,def=314159)"
-	F_DoubleDefaulted	*float64		"PB(fixed64,48,opt,name=F_Double_defaulted,def=271828)"
-	F_StringDefaulted	*string			"PB(bytes,49,opt,name=F_String_defaulted,def=hello, \\\"world!\\\"\\n)"
-	F_BytesDefaulted	[]byte			"PB(bytes,401,opt,name=F_Bytes_defaulted,def=Bignose)"
-	F_Sint32Defaulted	*int32			"PB(zigzag32,402,opt,name=F_Sint32_defaulted,def=-32)"
-	F_Sint64Defaulted	*int64			"PB(zigzag64,403,opt,name=F_Sint64_defaulted,def=-64)"
-	F_BoolRepeatedPacked	[]bool			"PB(varint,50,rep,packed,name=F_Bool_repeated_packed)"
-	F_Int32RepeatedPacked	[]int32			"PB(varint,51,rep,packed,name=F_Int32_repeated_packed)"
-	F_Int64RepeatedPacked	[]int64			"PB(varint,52,rep,packed,name=F_Int64_repeated_packed)"
-	F_Fixed32RepeatedPacked	[]uint32		"PB(fixed32,53,rep,packed,name=F_Fixed32_repeated_packed)"
-	F_Fixed64RepeatedPacked	[]uint64		"PB(fixed64,54,rep,packed,name=F_Fixed64_repeated_packed)"
-	F_Uint32RepeatedPacked	[]uint32		"PB(varint,55,rep,packed,name=F_Uint32_repeated_packed)"
-	F_Uint64RepeatedPacked	[]uint64		"PB(varint,56,rep,packed,name=F_Uint64_repeated_packed)"
-	F_FloatRepeatedPacked	[]float32		"PB(fixed32,57,rep,packed,name=F_Float_repeated_packed)"
-	F_DoubleRepeatedPacked	[]float64		"PB(fixed64,58,rep,packed,name=F_Double_repeated_packed)"
-	F_Sint32RepeatedPacked	[]int32			"PB(zigzag32,502,rep,packed,name=F_Sint32_repeated_packed)"
-	F_Sint64RepeatedPacked	[]int64			"PB(zigzag64,503,rep,packed,name=F_Sint64_repeated_packed)"
-	Requiredgroup		*GoTest_RequiredGroup	"PB(group,70,req,name=RequiredGroup)"
-	Repeatedgroup		[]*GoTest_RepeatedGroup	"PB(group,80,rep,name=RepeatedGroup)"
-	Optionalgroup		*GoTest_OptionalGroup	"PB(group,90,opt,name=OptionalGroup)"
+	Kind			*int32			`protobuf:"varint,1,req"`
+	Table			*string			`protobuf:"bytes,2,opt"`
+	Param			*int32			`protobuf:"varint,3,opt"`
+	RequiredField		*GoTestField		`protobuf:"bytes,4,req"`
+	RepeatedField		[]*GoTestField		`protobuf:"bytes,5,rep"`
+	OptionalField		*GoTestField		`protobuf:"bytes,6,opt"`
+	F_BoolRequired		*bool			`protobuf:"varint,10,req,name=F_Bool_required"`
+	F_Int32Required		*int32			`protobuf:"varint,11,req,name=F_Int32_required"`
+	F_Int64Required		*int64			`protobuf:"varint,12,req,name=F_Int64_required"`
+	F_Fixed32Required	*uint32			`protobuf:"fixed32,13,req,name=F_Fixed32_required"`
+	F_Fixed64Required	*uint64			`protobuf:"fixed64,14,req,name=F_Fixed64_required"`
+	F_Uint32Required	*uint32			`protobuf:"varint,15,req,name=F_Uint32_required"`
+	F_Uint64Required	*uint64			`protobuf:"varint,16,req,name=F_Uint64_required"`
+	F_FloatRequired		*float32		`protobuf:"fixed32,17,req,name=F_Float_required"`
+	F_DoubleRequired	*float64		`protobuf:"fixed64,18,req,name=F_Double_required"`
+	F_StringRequired	*string			`protobuf:"bytes,19,req,name=F_String_required"`
+	F_BytesRequired		[]byte			`protobuf:"bytes,101,req,name=F_Bytes_required"`
+	F_Sint32Required	*int32			`protobuf:"zigzag32,102,req,name=F_Sint32_required"`
+	F_Sint64Required	*int64			`protobuf:"zigzag64,103,req,name=F_Sint64_required"`
+	F_BoolRepeated		[]bool			`protobuf:"varint,20,rep,name=F_Bool_repeated"`
+	F_Int32Repeated		[]int32			`protobuf:"varint,21,rep,name=F_Int32_repeated"`
+	F_Int64Repeated		[]int64			`protobuf:"varint,22,rep,name=F_Int64_repeated"`
+	F_Fixed32Repeated	[]uint32		`protobuf:"fixed32,23,rep,name=F_Fixed32_repeated"`
+	F_Fixed64Repeated	[]uint64		`protobuf:"fixed64,24,rep,name=F_Fixed64_repeated"`
+	F_Uint32Repeated	[]uint32		`protobuf:"varint,25,rep,name=F_Uint32_repeated"`
+	F_Uint64Repeated	[]uint64		`protobuf:"varint,26,rep,name=F_Uint64_repeated"`
+	F_FloatRepeated		[]float32		`protobuf:"fixed32,27,rep,name=F_Float_repeated"`
+	F_DoubleRepeated	[]float64		`protobuf:"fixed64,28,rep,name=F_Double_repeated"`
+	F_StringRepeated	[]string		`protobuf:"bytes,29,rep,name=F_String_repeated"`
+	F_BytesRepeated		[][]byte		`protobuf:"bytes,201,rep,name=F_Bytes_repeated"`
+	F_Sint32Repeated	[]int32			`protobuf:"zigzag32,202,rep,name=F_Sint32_repeated"`
+	F_Sint64Repeated	[]int64			`protobuf:"zigzag64,203,rep,name=F_Sint64_repeated"`
+	F_BoolOptional		*bool			`protobuf:"varint,30,opt,name=F_Bool_optional"`
+	F_Int32Optional		*int32			`protobuf:"varint,31,opt,name=F_Int32_optional"`
+	F_Int64Optional		*int64			`protobuf:"varint,32,opt,name=F_Int64_optional"`
+	F_Fixed32Optional	*uint32			`protobuf:"fixed32,33,opt,name=F_Fixed32_optional"`
+	F_Fixed64Optional	*uint64			`protobuf:"fixed64,34,opt,name=F_Fixed64_optional"`
+	F_Uint32Optional	*uint32			`protobuf:"varint,35,opt,name=F_Uint32_optional"`
+	F_Uint64Optional	*uint64			`protobuf:"varint,36,opt,name=F_Uint64_optional"`
+	F_FloatOptional		*float32		`protobuf:"fixed32,37,opt,name=F_Float_optional"`
+	F_DoubleOptional	*float64		`protobuf:"fixed64,38,opt,name=F_Double_optional"`
+	F_StringOptional	*string			`protobuf:"bytes,39,opt,name=F_String_optional"`
+	F_BytesOptional		[]byte			`protobuf:"bytes,301,opt,name=F_Bytes_optional"`
+	F_Sint32Optional	*int32			`protobuf:"zigzag32,302,opt,name=F_Sint32_optional"`
+	F_Sint64Optional	*int64			`protobuf:"zigzag64,303,opt,name=F_Sint64_optional"`
+	F_BoolDefaulted		*bool			`protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1"`
+	F_Int32Defaulted	*int32			`protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32"`
+	F_Int64Defaulted	*int64			`protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64"`
+	F_Fixed32Defaulted	*uint32			`protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320"`
+	F_Fixed64Defaulted	*uint64			`protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640"`
+	F_Uint32Defaulted	*uint32			`protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200"`
+	F_Uint64Defaulted	*uint64			`protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400"`
+	F_FloatDefaulted	*float32		`protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159"`
+	F_DoubleDefaulted	*float64		`protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828"`
+	F_StringDefaulted	*string			`protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \\\"world!\\\"\\n"`
+	F_BytesDefaulted	[]byte			`protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose"`
+	F_Sint32Defaulted	*int32			`protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32"`
+	F_Sint64Defaulted	*int64			`protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64"`
+	F_BoolRepeatedPacked	[]bool			`protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed"`
+	F_Int32RepeatedPacked	[]int32			`protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed"`
+	F_Int64RepeatedPacked	[]int64			`protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed"`
+	F_Fixed32RepeatedPacked	[]uint32		`protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed"`
+	F_Fixed64RepeatedPacked	[]uint64		`protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed"`
+	F_Uint32RepeatedPacked	[]uint32		`protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed"`
+	F_Uint64RepeatedPacked	[]uint64		`protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed"`
+	F_FloatRepeatedPacked	[]float32		`protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed"`
+	F_DoubleRepeatedPacked	[]float64		`protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed"`
+	F_Sint32RepeatedPacked	[]int32			`protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed"`
+	F_Sint64RepeatedPacked	[]int64			`protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed"`
+	Requiredgroup		*GoTest_RequiredGroup	`protobuf:"group,70,req,name=RequiredGroup"`
+	Repeatedgroup		[]*GoTest_RepeatedGroup	`protobuf:"group,80,rep,name=RepeatedGroup"`
+	Optionalgroup		*GoTest_OptionalGroup	`protobuf:"group,90,opt,name=OptionalGroup"`
 	XXX_unrecognized	[]byte
 }
 
@@ -231,7 +231,7 @@
 const Default_GoTest_F_Sint64Defaulted int64 = -64
 
 type GoTest_RequiredGroup struct {
-	RequiredField		*string	"PB(bytes,71,req)"
+	RequiredField		*string	`protobuf:"bytes,71,req"`
 	XXX_unrecognized	[]byte
 }
 
@@ -239,7 +239,7 @@
 func (this *GoTest_RequiredGroup) String() string	{ return proto.CompactTextString(this) }
 
 type GoTest_RepeatedGroup struct {
-	RequiredField		*string	"PB(bytes,81,req)"
+	RequiredField		*string	`protobuf:"bytes,81,req"`
 	XXX_unrecognized	[]byte
 }
 
@@ -247,7 +247,7 @@
 func (this *GoTest_RepeatedGroup) String() string	{ return proto.CompactTextString(this) }
 
 type GoTest_OptionalGroup struct {
-	RequiredField		*string	"PB(bytes,91,req)"
+	RequiredField		*string	`protobuf:"bytes,91,req"`
 	XXX_unrecognized	[]byte
 }
 
@@ -255,11 +255,11 @@
 func (this *GoTest_OptionalGroup) String() string	{ return proto.CompactTextString(this) }
 
 type GoSkipTest struct {
-	SkipInt32		*int32			"PB(varint,11,req,name=skip_int32)"
-	SkipFixed32		*uint32			"PB(fixed32,12,req,name=skip_fixed32)"
-	SkipFixed64		*uint64			"PB(fixed64,13,req,name=skip_fixed64)"
-	SkipString		*string			"PB(bytes,14,req,name=skip_string)"
-	Skipgroup		*GoSkipTest_SkipGroup	"PB(group,15,req,name=SkipGroup)"
+	SkipInt32		*int32			`protobuf:"varint,11,req,name=skip_int32"`
+	SkipFixed32		*uint32			`protobuf:"fixed32,12,req,name=skip_fixed32"`
+	SkipFixed64		*uint64			`protobuf:"fixed64,13,req,name=skip_fixed64"`
+	SkipString		*string			`protobuf:"bytes,14,req,name=skip_string"`
+	Skipgroup		*GoSkipTest_SkipGroup	`protobuf:"group,15,req,name=SkipGroup"`
 	XXX_unrecognized	[]byte
 }
 
@@ -267,8 +267,8 @@
 func (this *GoSkipTest) String() string	{ return proto.CompactTextString(this) }
 
 type GoSkipTest_SkipGroup struct {
-	GroupInt32		*int32	"PB(varint,16,req,name=group_int32)"
-	GroupString		*string	"PB(bytes,17,req,name=group_string)"
+	GroupInt32		*int32	`protobuf:"varint,16,req,name=group_int32"`
+	GroupString		*string	`protobuf:"bytes,17,req,name=group_string"`
 	XXX_unrecognized	[]byte
 }
 
@@ -276,7 +276,7 @@
 func (this *GoSkipTest_SkipGroup) String() string	{ return proto.CompactTextString(this) }
 
 type NonPackedTest struct {
-	A			[]int32	"PB(varint,1,rep,name=a)"
+	A			[]int32	`protobuf:"varint,1,rep,name=a"`
 	XXX_unrecognized	[]byte
 }
 
@@ -284,7 +284,7 @@
 func (this *NonPackedTest) String() string	{ return proto.CompactTextString(this) }
 
 type PackedTest struct {
-	B			[]int32	"PB(varint,1,rep,packed,name=b)"
+	B			[]int32	`protobuf:"varint,1,rep,packed,name=b"`
 	XXX_unrecognized	[]byte
 }
 
@@ -292,9 +292,9 @@
 func (this *PackedTest) String() string	{ return proto.CompactTextString(this) }
 
 type InnerMessage struct {
-	Host			*string	"PB(bytes,1,req,name=host)"
-	Port			*int32	"PB(varint,2,opt,name=port,def=4000)"
-	Connected		*bool	"PB(varint,3,opt,name=connected)"
+	Host			*string	`protobuf:"bytes,1,req,name=host"`
+	Port			*int32	`protobuf:"varint,2,opt,name=port,def=4000"`
+	Connected		*bool	`protobuf:"varint,3,opt,name=connected"`
 	XXX_unrecognized	[]byte
 }
 
@@ -304,10 +304,10 @@
 const Default_InnerMessage_Port int32 = 4000
 
 type OtherMessage struct {
-	Key			*int64		"PB(varint,1,opt,name=key)"
-	Value			[]byte		"PB(bytes,2,opt,name=value)"
-	Weight			*float32	"PB(fixed32,3,opt,name=weight)"
-	Inner			*InnerMessage	"PB(bytes,4,opt,name=inner)"
+	Key			*int64		`protobuf:"varint,1,opt,name=key"`
+	Value			[]byte		`protobuf:"bytes,2,opt,name=value"`
+	Weight			*float32	`protobuf:"fixed32,3,opt,name=weight"`
+	Inner			*InnerMessage	`protobuf:"bytes,4,opt,name=inner"`
 	XXX_unrecognized	[]byte
 }
 
@@ -315,14 +315,14 @@
 func (this *OtherMessage) String() string	{ return proto.CompactTextString(this) }
 
 type MyMessage struct {
-	Count			*int32			"PB(varint,1,req,name=count)"
-	Name			*string			"PB(bytes,2,opt,name=name)"
-	Quote			*string			"PB(bytes,3,opt,name=quote)"
-	Pet			[]string		"PB(bytes,4,rep,name=pet)"
-	Inner			*InnerMessage		"PB(bytes,5,opt,name=inner)"
-	Others			[]*OtherMessage		"PB(bytes,6,rep,name=others)"
-	Bikeshed		*MyMessage_Color	"PB(varint,7,opt,name=bikeshed,enum=test_proto.MyMessage_Color)"
-	Somegroup		*MyMessage_SomeGroup	"PB(group,8,opt,name=SomeGroup)"
+	Count			*int32			`protobuf:"varint,1,req,name=count"`
+	Name			*string			`protobuf:"bytes,2,opt,name=name"`
+	Quote			*string			`protobuf:"bytes,3,opt,name=quote"`
+	Pet			[]string		`protobuf:"bytes,4,rep,name=pet"`
+	Inner			*InnerMessage		`protobuf:"bytes,5,opt,name=inner"`
+	Others			[]*OtherMessage		`protobuf:"bytes,6,rep,name=others"`
+	Bikeshed		*MyMessage_Color	`protobuf:"varint,7,opt,name=bikeshed,enum=test_proto.MyMessage_Color"`
+	Somegroup		*MyMessage_SomeGroup	`protobuf:"group,8,opt,name=SomeGroup"`
 	XXX_extensions		map[int32][]byte
 	XXX_unrecognized	[]byte
 }
@@ -345,7 +345,7 @@
 }
 
 type MyMessage_SomeGroup struct {
-	GroupField		*int32	"PB(varint,9,opt,name=group_field)"
+	GroupField		*int32	`protobuf:"varint,9,opt,name=group_field"`
 	XXX_unrecognized	[]byte
 }
 
@@ -353,7 +353,7 @@
 func (this *MyMessage_SomeGroup) String() string	{ return proto.CompactTextString(this) }
 
 type Ext struct {
-	Data			*string	"PB(bytes,1,opt,name=data)"
+	Data			*string	`protobuf:"bytes,1,opt,name=data"`
 	XXX_unrecognized	[]byte
 }
 
@@ -365,11 +365,11 @@
 	ExtensionType:	(*Ext)(nil),
 	Field:		103,
 	Name:		"test_proto.more",
-	Tag:		"PB(bytes,103,opt,name=more)",
+	Tag:		"bytes,103,opt,name=more",
 }
 
 type MessageList struct {
-	Message			[]*MessageList_Message	"PB(group,1,rep)"
+	Message			[]*MessageList_Message	`protobuf:"group,1,rep"`
 	XXX_unrecognized	[]byte
 }
 
@@ -377,8 +377,8 @@
 func (this *MessageList) String() string	{ return proto.CompactTextString(this) }
 
 type MessageList_Message struct {
-	Name			*string	"PB(bytes,2,req,name=name)"
-	Count			*int32	"PB(varint,3,req,name=count)"
+	Name			*string	`protobuf:"bytes,2,req,name=name"`
+	Count			*int32	`protobuf:"varint,3,req,name=count"`
 	XXX_unrecognized	[]byte
 }
 
diff --git a/proto/testdata/test.pb.go.golden b/proto/testdata/test.pb.go.golden
index 23c1f0e..9eb7027 100644
--- a/proto/testdata/test.pb.go.golden
+++ b/proto/testdata/test.pb.go.golden
@@ -4,190 +4,216 @@
 package test_proto
 
 import proto "goprotobuf.googlecode.com/hg/proto"
+import "math"
+import "os"
 
-// Reference proto import to suppress error if it's not otherwise used.
+// Reference proto, math & os imports to suppress error if they are not otherwise used.
 var _ = proto.GetString
+var _ = math.Inf
+var _ os.Error
+
 
 type FOO int32
+
 const (
 	FOO_FOO1 = 1
 )
-var FOO_name = map[int32] string {
+
+var FOO_name = map[int32]string{
 	1: "FOO1",
 }
-var FOO_value = map[string] int32 {
+var FOO_value = map[string]int32{
 	"FOO1": 1,
 }
+
 func NewFOO(x int32) *FOO {
 	e := FOO(x)
 	return &e
 }
+func (x FOO) String() string {
+	return proto.EnumName(FOO_name, int32(x))
+}
 
 type GoTest_KIND int32
+
 const (
-	GoTest_VOID = 0
-	GoTest_BOOL = 1
-	GoTest_BYTES = 2
-	GoTest_FINGERPRINT = 3
-	GoTest_FLOAT = 4
-	GoTest_INT = 5
-	GoTest_STRING = 6
-	GoTest_TIME = 7
-	GoTest_TUPLE = 8
-	GoTest_ARRAY = 9
-	GoTest_MAP = 10
-	GoTest_TABLE = 11
-	GoTest_FUNCTION = 12
+	GoTest_VOID		= 0
+	GoTest_BOOL		= 1
+	GoTest_BYTES		= 2
+	GoTest_FINGERPRINT	= 3
+	GoTest_FLOAT		= 4
+	GoTest_INT		= 5
+	GoTest_STRING		= 6
+	GoTest_TIME		= 7
+	GoTest_TUPLE		= 8
+	GoTest_ARRAY		= 9
+	GoTest_MAP		= 10
+	GoTest_TABLE		= 11
+	GoTest_FUNCTION		= 12
 )
-var GoTest_KIND_name = map[int32] string {
-	0: "VOID",
-	1: "BOOL",
-	2: "BYTES",
-	3: "FINGERPRINT",
-	4: "FLOAT",
-	5: "INT",
-	6: "STRING",
-	7: "TIME",
-	8: "TUPLE",
-	9: "ARRAY",
-	10: "MAP",
-	11: "TABLE",
-	12: "FUNCTION",
+
+var GoTest_KIND_name = map[int32]string{
+	0:	"VOID",
+	1:	"BOOL",
+	2:	"BYTES",
+	3:	"FINGERPRINT",
+	4:	"FLOAT",
+	5:	"INT",
+	6:	"STRING",
+	7:	"TIME",
+	8:	"TUPLE",
+	9:	"ARRAY",
+	10:	"MAP",
+	11:	"TABLE",
+	12:	"FUNCTION",
 }
-var GoTest_KIND_value = map[string] int32 {
-	"VOID": 0,
-	"BOOL": 1,
-	"BYTES": 2,
-	"FINGERPRINT": 3,
-	"FLOAT": 4,
-	"INT": 5,
-	"STRING": 6,
-	"TIME": 7,
-	"TUPLE": 8,
-	"ARRAY": 9,
-	"MAP": 10,
-	"TABLE": 11,
-	"FUNCTION": 12,
+var GoTest_KIND_value = map[string]int32{
+	"VOID":		0,
+	"BOOL":		1,
+	"BYTES":	2,
+	"FINGERPRINT":	3,
+	"FLOAT":	4,
+	"INT":		5,
+	"STRING":	6,
+	"TIME":		7,
+	"TUPLE":	8,
+	"ARRAY":	9,
+	"MAP":		10,
+	"TABLE":	11,
+	"FUNCTION":	12,
 }
+
 func NewGoTest_KIND(x int32) *GoTest_KIND {
 	e := GoTest_KIND(x)
 	return &e
 }
+func (x GoTest_KIND) String() string {
+	return proto.EnumName(GoTest_KIND_name, int32(x))
+}
 
 type MyMessage_Color int32
+
 const (
-	MyMessage_RED = 0
-	MyMessage_GREEN = 1
-	MyMessage_BLUE = 2
+	MyMessage_RED	= 0
+	MyMessage_GREEN	= 1
+	MyMessage_BLUE	= 2
 )
-var MyMessage_Color_name = map[int32] string {
-	0: "RED",
-	1: "GREEN",
-	2: "BLUE",
+
+var MyMessage_Color_name = map[int32]string{
+	0:	"RED",
+	1:	"GREEN",
+	2:	"BLUE",
 }
-var MyMessage_Color_value = map[string] int32 {
-	"RED": 0,
-	"GREEN": 1,
-	"BLUE": 2,
+var MyMessage_Color_value = map[string]int32{
+	"RED":		0,
+	"GREEN":	1,
+	"BLUE":		2,
 }
+
 func NewMyMessage_Color(x int32) *MyMessage_Color {
 	e := MyMessage_Color(x)
 	return &e
 }
+func (x MyMessage_Color) String() string {
+	return proto.EnumName(MyMessage_Color_name, int32(x))
+}
 
 type GoEnum struct {
-	Foo	*FOO	"PB(varint,1,req,name=foo,enum=test_proto.FOO)"
+	Foo			*FOO	`protobuf:"varint,1,req,name=foo,enum=test_proto.FOO"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoEnum) Reset() {
-	*this = GoEnum{}
-}
-func NewGoEnum() *GoEnum {
-	return new(GoEnum)
-}
+
+func (this *GoEnum) Reset()		{ *this = GoEnum{} }
+func (this *GoEnum) String() string	{ return proto.CompactTextString(this) }
 
 type GoTestField struct {
-	Label	*string	"PB(bytes,1,req)"
-	Type	*string	"PB(bytes,2,req)"
+	Label			*string	`protobuf:"bytes,1,req"`
+	Type			*string	`protobuf:"bytes,2,req"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoTestField) Reset() {
-	*this = GoTestField{}
-}
-func NewGoTestField() *GoTestField {
-	return new(GoTestField)
-}
 
+func (this *GoTestField) Reset()		{ *this = GoTestField{} }
+func (this *GoTestField) String() string	{ return proto.CompactTextString(this) }
+
 type GoTest struct {
-	Kind	*int32	"PB(varint,1,req)"
-	Table	*string	"PB(bytes,2,opt)"
-	Param	*int32	"PB(varint,3,opt)"
-	RequiredField	*GoTestField	"PB(bytes,4,req)"
-	RepeatedField	[]*GoTestField	"PB(bytes,5,rep)"
-	OptionalField	*GoTestField	"PB(bytes,6,opt)"
-	F_BoolRequired	*bool	"PB(varint,10,req,name=F_Bool_required)"
-	F_Int32Required	*int32	"PB(varint,11,req,name=F_Int32_required)"
-	F_Int64Required	*int64	"PB(varint,12,req,name=F_Int64_required)"
-	F_Fixed32Required	*uint32	"PB(fixed32,13,req,name=F_Fixed32_required)"
-	F_Fixed64Required	*uint64	"PB(fixed64,14,req,name=F_Fixed64_required)"
-	F_Uint32Required	*uint32	"PB(varint,15,req,name=F_Uint32_required)"
-	F_Uint64Required	*uint64	"PB(varint,16,req,name=F_Uint64_required)"
-	F_FloatRequired	*float32	"PB(fixed32,17,req,name=F_Float_required)"
-	F_DoubleRequired	*float64	"PB(fixed64,18,req,name=F_Double_required)"
-	F_StringRequired	*string	"PB(bytes,19,req,name=F_String_required)"
-	F_BytesRequired	[]byte	"PB(bytes,101,req,name=F_Bytes_required)"
-	F_Sint32Required	*int32	"PB(zigzag32,102,req,name=F_Sint32_required)"
-	F_Sint64Required	*int64	"PB(zigzag64,103,req,name=F_Sint64_required)"
-	F_BoolRepeated	[]bool	"PB(varint,20,rep,name=F_Bool_repeated)"
-	F_Int32Repeated	[]int32	"PB(varint,21,rep,name=F_Int32_repeated)"
-	F_Int64Repeated	[]int64	"PB(varint,22,rep,name=F_Int64_repeated)"
-	F_Fixed32Repeated	[]uint32	"PB(fixed32,23,rep,name=F_Fixed32_repeated)"
-	F_Fixed64Repeated	[]uint64	"PB(fixed64,24,rep,name=F_Fixed64_repeated)"
-	F_Uint32Repeated	[]uint32	"PB(varint,25,rep,name=F_Uint32_repeated)"
-	F_Uint64Repeated	[]uint64	"PB(varint,26,rep,name=F_Uint64_repeated)"
-	F_FloatRepeated	[]float32	"PB(fixed32,27,rep,name=F_Float_repeated)"
-	F_DoubleRepeated	[]float64	"PB(fixed64,28,rep,name=F_Double_repeated)"
-	F_StringRepeated	[]string	"PB(bytes,29,rep,name=F_String_repeated)"
-	F_BytesRepeated	[][]byte	"PB(bytes,201,rep,name=F_Bytes_repeated)"
-	F_Sint32Repeated	[]int32	"PB(zigzag32,202,rep,name=F_Sint32_repeated)"
-	F_Sint64Repeated	[]int64	"PB(zigzag64,203,rep,name=F_Sint64_repeated)"
-	F_BoolOptional	*bool	"PB(varint,30,opt,name=F_Bool_optional)"
-	F_Int32Optional	*int32	"PB(varint,31,opt,name=F_Int32_optional)"
-	F_Int64Optional	*int64	"PB(varint,32,opt,name=F_Int64_optional)"
-	F_Fixed32Optional	*uint32	"PB(fixed32,33,opt,name=F_Fixed32_optional)"
-	F_Fixed64Optional	*uint64	"PB(fixed64,34,opt,name=F_Fixed64_optional)"
-	F_Uint32Optional	*uint32	"PB(varint,35,opt,name=F_Uint32_optional)"
-	F_Uint64Optional	*uint64	"PB(varint,36,opt,name=F_Uint64_optional)"
-	F_FloatOptional	*float32	"PB(fixed32,37,opt,name=F_Float_optional)"
-	F_DoubleOptional	*float64	"PB(fixed64,38,opt,name=F_Double_optional)"
-	F_StringOptional	*string	"PB(bytes,39,opt,name=F_String_optional)"
-	F_BytesOptional	[]byte	"PB(bytes,301,opt,name=F_Bytes_optional)"
-	F_Sint32Optional	*int32	"PB(zigzag32,302,opt,name=F_Sint32_optional)"
-	F_Sint64Optional	*int64	"PB(zigzag64,303,opt,name=F_Sint64_optional)"
-	F_BoolDefaulted	*bool	"PB(varint,40,opt,name=F_Bool_defaulted,def=1)"
-	F_Int32Defaulted	*int32	"PB(varint,41,opt,name=F_Int32_defaulted,def=32)"
-	F_Int64Defaulted	*int64	"PB(varint,42,opt,name=F_Int64_defaulted,def=64)"
-	F_Fixed32Defaulted	*uint32	"PB(fixed32,43,opt,name=F_Fixed32_defaulted,def=320)"
-	F_Fixed64Defaulted	*uint64	"PB(fixed64,44,opt,name=F_Fixed64_defaulted,def=640)"
-	F_Uint32Defaulted	*uint32	"PB(varint,45,opt,name=F_Uint32_defaulted,def=3200)"
-	F_Uint64Defaulted	*uint64	"PB(varint,46,opt,name=F_Uint64_defaulted,def=6400)"
-	F_FloatDefaulted	*float32	"PB(fixed32,47,opt,name=F_Float_defaulted,def=314159)"
-	F_DoubleDefaulted	*float64	"PB(fixed64,48,opt,name=F_Double_defaulted,def=271828)"
-	F_StringDefaulted	*string	"PB(bytes,49,opt,name=F_String_defaulted,def=hello, \\\"world!\\\"\\n)"
-	F_BytesDefaulted	[]byte	"PB(bytes,401,opt,name=F_Bytes_defaulted,def=Bignose)"
-	F_Sint32Defaulted	*int32	"PB(zigzag32,402,opt,name=F_Sint32_defaulted,def=-32)"
-	F_Sint64Defaulted	*int64	"PB(zigzag64,403,opt,name=F_Sint64_defaulted,def=-64)"
-	Requiredgroup	*GoTest_RequiredGroup	"PB(group,70,req,name=requiredgroup)"
-	Repeatedgroup	[]*GoTest_RepeatedGroup	"PB(group,80,rep,name=repeatedgroup)"
-	Optionalgroup	*GoTest_OptionalGroup	"PB(group,90,opt,name=optionalgroup)"
+	Kind			*int32			`protobuf:"varint,1,req"`
+	Table			*string			`protobuf:"bytes,2,opt"`
+	Param			*int32			`protobuf:"varint,3,opt"`
+	RequiredField		*GoTestField		`protobuf:"bytes,4,req"`
+	RepeatedField		[]*GoTestField		`protobuf:"bytes,5,rep"`
+	OptionalField		*GoTestField		`protobuf:"bytes,6,opt"`
+	F_BoolRequired		*bool			`protobuf:"varint,10,req,name=F_Bool_required"`
+	F_Int32Required		*int32			`protobuf:"varint,11,req,name=F_Int32_required"`
+	F_Int64Required		*int64			`protobuf:"varint,12,req,name=F_Int64_required"`
+	F_Fixed32Required	*uint32			`protobuf:"fixed32,13,req,name=F_Fixed32_required"`
+	F_Fixed64Required	*uint64			`protobuf:"fixed64,14,req,name=F_Fixed64_required"`
+	F_Uint32Required	*uint32			`protobuf:"varint,15,req,name=F_Uint32_required"`
+	F_Uint64Required	*uint64			`protobuf:"varint,16,req,name=F_Uint64_required"`
+	F_FloatRequired		*float32		`protobuf:"fixed32,17,req,name=F_Float_required"`
+	F_DoubleRequired	*float64		`protobuf:"fixed64,18,req,name=F_Double_required"`
+	F_StringRequired	*string			`protobuf:"bytes,19,req,name=F_String_required"`
+	F_BytesRequired		[]byte			`protobuf:"bytes,101,req,name=F_Bytes_required"`
+	F_Sint32Required	*int32			`protobuf:"zigzag32,102,req,name=F_Sint32_required"`
+	F_Sint64Required	*int64			`protobuf:"zigzag64,103,req,name=F_Sint64_required"`
+	F_BoolRepeated		[]bool			`protobuf:"varint,20,rep,name=F_Bool_repeated"`
+	F_Int32Repeated		[]int32			`protobuf:"varint,21,rep,name=F_Int32_repeated"`
+	F_Int64Repeated		[]int64			`protobuf:"varint,22,rep,name=F_Int64_repeated"`
+	F_Fixed32Repeated	[]uint32		`protobuf:"fixed32,23,rep,name=F_Fixed32_repeated"`
+	F_Fixed64Repeated	[]uint64		`protobuf:"fixed64,24,rep,name=F_Fixed64_repeated"`
+	F_Uint32Repeated	[]uint32		`protobuf:"varint,25,rep,name=F_Uint32_repeated"`
+	F_Uint64Repeated	[]uint64		`protobuf:"varint,26,rep,name=F_Uint64_repeated"`
+	F_FloatRepeated		[]float32		`protobuf:"fixed32,27,rep,name=F_Float_repeated"`
+	F_DoubleRepeated	[]float64		`protobuf:"fixed64,28,rep,name=F_Double_repeated"`
+	F_StringRepeated	[]string		`protobuf:"bytes,29,rep,name=F_String_repeated"`
+	F_BytesRepeated		[][]byte		`protobuf:"bytes,201,rep,name=F_Bytes_repeated"`
+	F_Sint32Repeated	[]int32			`protobuf:"zigzag32,202,rep,name=F_Sint32_repeated"`
+	F_Sint64Repeated	[]int64			`protobuf:"zigzag64,203,rep,name=F_Sint64_repeated"`
+	F_BoolOptional		*bool			`protobuf:"varint,30,opt,name=F_Bool_optional"`
+	F_Int32Optional		*int32			`protobuf:"varint,31,opt,name=F_Int32_optional"`
+	F_Int64Optional		*int64			`protobuf:"varint,32,opt,name=F_Int64_optional"`
+	F_Fixed32Optional	*uint32			`protobuf:"fixed32,33,opt,name=F_Fixed32_optional"`
+	F_Fixed64Optional	*uint64			`protobuf:"fixed64,34,opt,name=F_Fixed64_optional"`
+	F_Uint32Optional	*uint32			`protobuf:"varint,35,opt,name=F_Uint32_optional"`
+	F_Uint64Optional	*uint64			`protobuf:"varint,36,opt,name=F_Uint64_optional"`
+	F_FloatOptional		*float32		`protobuf:"fixed32,37,opt,name=F_Float_optional"`
+	F_DoubleOptional	*float64		`protobuf:"fixed64,38,opt,name=F_Double_optional"`
+	F_StringOptional	*string			`protobuf:"bytes,39,opt,name=F_String_optional"`
+	F_BytesOptional		[]byte			`protobuf:"bytes,301,opt,name=F_Bytes_optional"`
+	F_Sint32Optional	*int32			`protobuf:"zigzag32,302,opt,name=F_Sint32_optional"`
+	F_Sint64Optional	*int64			`protobuf:"zigzag64,303,opt,name=F_Sint64_optional"`
+	F_BoolDefaulted		*bool			`protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1"`
+	F_Int32Defaulted	*int32			`protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32"`
+	F_Int64Defaulted	*int64			`protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64"`
+	F_Fixed32Defaulted	*uint32			`protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320"`
+	F_Fixed64Defaulted	*uint64			`protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640"`
+	F_Uint32Defaulted	*uint32			`protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200"`
+	F_Uint64Defaulted	*uint64			`protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400"`
+	F_FloatDefaulted	*float32		`protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159"`
+	F_DoubleDefaulted	*float64		`protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828"`
+	F_StringDefaulted	*string			`protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \\\"world!\\\"\\n"`
+	F_BytesDefaulted	[]byte			`protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose"`
+	F_Sint32Defaulted	*int32			`protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32"`
+	F_Sint64Defaulted	*int64			`protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64"`
+	F_BoolRepeatedPacked	[]bool			`protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed"`
+	F_Int32RepeatedPacked	[]int32			`protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed"`
+	F_Int64RepeatedPacked	[]int64			`protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed"`
+	F_Fixed32RepeatedPacked	[]uint32		`protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed"`
+	F_Fixed64RepeatedPacked	[]uint64		`protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed"`
+	F_Uint32RepeatedPacked	[]uint32		`protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed"`
+	F_Uint64RepeatedPacked	[]uint64		`protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed"`
+	F_FloatRepeatedPacked	[]float32		`protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed"`
+	F_DoubleRepeatedPacked	[]float64		`protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed"`
+	F_Sint32RepeatedPacked	[]int32			`protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed"`
+	F_Sint64RepeatedPacked	[]int64			`protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed"`
+	Requiredgroup		*GoTest_RequiredGroup	`protobuf:"group,70,req,name=RequiredGroup"`
+	Repeatedgroup		[]*GoTest_RepeatedGroup	`protobuf:"group,80,rep,name=RepeatedGroup"`
+	Optionalgroup		*GoTest_OptionalGroup	`protobuf:"group,90,opt,name=OptionalGroup"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoTest) Reset() {
-	*this = GoTest{}
-}
-func NewGoTest() *GoTest {
-	return new(GoTest)
-}
+
+func (this *GoTest) Reset()		{ *this = GoTest{} }
+func (this *GoTest) String() string	{ return proto.CompactTextString(this) }
+
 const Default_GoTest_F_BoolDefaulted bool = true
 const Default_GoTest_F_Int32Defaulted int32 = 32
 const Default_GoTest_F_Int64Defaulted int64 = 64
@@ -198,140 +224,170 @@
 const Default_GoTest_F_FloatDefaulted float32 = 314159
 const Default_GoTest_F_DoubleDefaulted float64 = 271828
 const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n"
+
 var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose")
+
 const Default_GoTest_F_Sint32Defaulted int32 = -32
 const Default_GoTest_F_Sint64Defaulted int64 = -64
 
 type GoTest_RequiredGroup struct {
-	RequiredField	*string	"PB(bytes,71,req)"
+	RequiredField		*string	`protobuf:"bytes,71,req"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoTest_RequiredGroup) Reset() {
-	*this = GoTest_RequiredGroup{}
-}
-func NewGoTest_RequiredGroup() *GoTest_RequiredGroup {
-	return new(GoTest_RequiredGroup)
-}
+
+func (this *GoTest_RequiredGroup) Reset()		{ *this = GoTest_RequiredGroup{} }
+func (this *GoTest_RequiredGroup) String() string	{ return proto.CompactTextString(this) }
 
 type GoTest_RepeatedGroup struct {
-	RequiredField	*string	"PB(bytes,81,req)"
+	RequiredField		*string	`protobuf:"bytes,81,req"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoTest_RepeatedGroup) Reset() {
-	*this = GoTest_RepeatedGroup{}
-}
-func NewGoTest_RepeatedGroup() *GoTest_RepeatedGroup {
-	return new(GoTest_RepeatedGroup)
-}
+
+func (this *GoTest_RepeatedGroup) Reset()		{ *this = GoTest_RepeatedGroup{} }
+func (this *GoTest_RepeatedGroup) String() string	{ return proto.CompactTextString(this) }
 
 type GoTest_OptionalGroup struct {
-	RequiredField	*string	"PB(bytes,91,req)"
+	RequiredField		*string	`protobuf:"bytes,91,req"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoTest_OptionalGroup) Reset() {
-	*this = GoTest_OptionalGroup{}
-}
-func NewGoTest_OptionalGroup() *GoTest_OptionalGroup {
-	return new(GoTest_OptionalGroup)
-}
+
+func (this *GoTest_OptionalGroup) Reset()		{ *this = GoTest_OptionalGroup{} }
+func (this *GoTest_OptionalGroup) String() string	{ return proto.CompactTextString(this) }
 
 type GoSkipTest struct {
-	SkipInt32	*int32	"PB(varint,11,req,name=skip_int32)"
-	SkipFixed32	*uint32	"PB(fixed32,12,req,name=skip_fixed32)"
-	SkipFixed64	*uint64	"PB(fixed64,13,req,name=skip_fixed64)"
-	SkipString	*string	"PB(bytes,14,req,name=skip_string)"
-	Skipgroup	*GoSkipTest_SkipGroup	"PB(group,15,req,name=skipgroup)"
+	SkipInt32		*int32			`protobuf:"varint,11,req,name=skip_int32"`
+	SkipFixed32		*uint32			`protobuf:"fixed32,12,req,name=skip_fixed32"`
+	SkipFixed64		*uint64			`protobuf:"fixed64,13,req,name=skip_fixed64"`
+	SkipString		*string			`protobuf:"bytes,14,req,name=skip_string"`
+	Skipgroup		*GoSkipTest_SkipGroup	`protobuf:"group,15,req,name=SkipGroup"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoSkipTest) Reset() {
-	*this = GoSkipTest{}
-}
-func NewGoSkipTest() *GoSkipTest {
-	return new(GoSkipTest)
-}
+
+func (this *GoSkipTest) Reset()		{ *this = GoSkipTest{} }
+func (this *GoSkipTest) String() string	{ return proto.CompactTextString(this) }
 
 type GoSkipTest_SkipGroup struct {
-	GroupInt32	*int32	"PB(varint,16,req,name=group_int32)"
-	GroupString	*string	"PB(bytes,17,req,name=group_string)"
+	GroupInt32		*int32	`protobuf:"varint,16,req,name=group_int32"`
+	GroupString		*string	`protobuf:"bytes,17,req,name=group_string"`
 	XXX_unrecognized	[]byte
 }
-func (this *GoSkipTest_SkipGroup) Reset() {
-	*this = GoSkipTest_SkipGroup{}
-}
-func NewGoSkipTest_SkipGroup() *GoSkipTest_SkipGroup {
-	return new(GoSkipTest_SkipGroup)
-}
 
-type InnerMessage struct {
-	Host	*string	"PB(bytes,1,req,name=host)"
-	Port	*int32	"PB(varint,2,opt,name=port,def=4000)"
-	Connected	*bool	"PB(varint,3,opt,name=connected)"
+func (this *GoSkipTest_SkipGroup) Reset()		{ *this = GoSkipTest_SkipGroup{} }
+func (this *GoSkipTest_SkipGroup) String() string	{ return proto.CompactTextString(this) }
+
+type NonPackedTest struct {
+	A			[]int32	`protobuf:"varint,1,rep,name=a"`
 	XXX_unrecognized	[]byte
 }
-func (this *InnerMessage) Reset() {
-	*this = InnerMessage{}
+
+func (this *NonPackedTest) Reset()		{ *this = NonPackedTest{} }
+func (this *NonPackedTest) String() string	{ return proto.CompactTextString(this) }
+
+type PackedTest struct {
+	B			[]int32	`protobuf:"varint,1,rep,packed,name=b"`
+	XXX_unrecognized	[]byte
 }
-func NewInnerMessage() *InnerMessage {
-	return new(InnerMessage)
+
+func (this *PackedTest) Reset()		{ *this = PackedTest{} }
+func (this *PackedTest) String() string	{ return proto.CompactTextString(this) }
+
+type InnerMessage struct {
+	Host			*string	`protobuf:"bytes,1,req,name=host"`
+	Port			*int32	`protobuf:"varint,2,opt,name=port,def=4000"`
+	Connected		*bool	`protobuf:"varint,3,opt,name=connected"`
+	XXX_unrecognized	[]byte
 }
+
+func (this *InnerMessage) Reset()		{ *this = InnerMessage{} }
+func (this *InnerMessage) String() string	{ return proto.CompactTextString(this) }
+
 const Default_InnerMessage_Port int32 = 4000
 
 type OtherMessage struct {
-	Key	*int64	"PB(varint,1,opt,name=key)"
-	Value	[]byte	"PB(bytes,2,opt,name=value)"
-	Weight	*float32	"PB(fixed32,3,opt,name=weight)"
-	Inner	*InnerMessage	"PB(bytes,4,opt,name=inner)"
+	Key			*int64		`protobuf:"varint,1,opt,name=key"`
+	Value			[]byte		`protobuf:"bytes,2,opt,name=value"`
+	Weight			*float32	`protobuf:"fixed32,3,opt,name=weight"`
+	Inner			*InnerMessage	`protobuf:"bytes,4,opt,name=inner"`
 	XXX_unrecognized	[]byte
 }
-func (this *OtherMessage) Reset() {
-	*this = OtherMessage{}
-}
-func NewOtherMessage() *OtherMessage {
-	return new(OtherMessage)
-}
 
+func (this *OtherMessage) Reset()		{ *this = OtherMessage{} }
+func (this *OtherMessage) String() string	{ return proto.CompactTextString(this) }
+
 type MyMessage struct {
-	Count	*int32	"PB(varint,1,req,name=count)"
-	Name	*string	"PB(bytes,2,opt,name=name)"
-	Quote	*string	"PB(bytes,3,opt,name=quote)"
-	Pet	[]string	"PB(bytes,4,rep,name=pet)"
-	Inner	*InnerMessage	"PB(bytes,5,opt,name=inner)"
-	Others	[]*OtherMessage	"PB(bytes,6,rep,name=others)"
-	Bikeshed	*MyMessage_Color	"PB(varint,7,opt,name=bikeshed,enum=test_proto.MyMessage_Color)"
+	Count			*int32			`protobuf:"varint,1,req,name=count"`
+	Name			*string			`protobuf:"bytes,2,opt,name=name"`
+	Quote			*string			`protobuf:"bytes,3,opt,name=quote"`
+	Pet			[]string		`protobuf:"bytes,4,rep,name=pet"`
+	Inner			*InnerMessage		`protobuf:"bytes,5,opt,name=inner"`
+	Others			[]*OtherMessage		`protobuf:"bytes,6,rep,name=others"`
+	Bikeshed		*MyMessage_Color	`protobuf:"varint,7,opt,name=bikeshed,enum=test_proto.MyMessage_Color"`
+	Somegroup		*MyMessage_SomeGroup	`protobuf:"group,8,opt,name=SomeGroup"`
+	XXX_extensions		map[int32][]byte
 	XXX_unrecognized	[]byte
 }
-func (this *MyMessage) Reset() {
-	*this = MyMessage{}
+
+func (this *MyMessage) Reset()		{ *this = MyMessage{} }
+func (this *MyMessage) String() string	{ return proto.CompactTextString(this) }
+
+var extRange_MyMessage = []proto.ExtensionRange{
+	proto.ExtensionRange{100, 536870911},
 }
-func NewMyMessage() *MyMessage {
-	return new(MyMessage)
+
+func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange {
+	return extRange_MyMessage
+}
+func (this *MyMessage) ExtensionMap() map[int32][]byte {
+	if this.XXX_extensions == nil {
+		this.XXX_extensions = make(map[int32][]byte)
+	}
+	return this.XXX_extensions
+}
+
+type MyMessage_SomeGroup struct {
+	GroupField		*int32	`protobuf:"varint,9,opt,name=group_field"`
+	XXX_unrecognized	[]byte
+}
+
+func (this *MyMessage_SomeGroup) Reset()		{ *this = MyMessage_SomeGroup{} }
+func (this *MyMessage_SomeGroup) String() string	{ return proto.CompactTextString(this) }
+
+type Ext struct {
+	Data			*string	`protobuf:"bytes,1,opt,name=data"`
+	XXX_unrecognized	[]byte
+}
+
+func (this *Ext) Reset()		{ *this = Ext{} }
+func (this *Ext) String() string	{ return proto.CompactTextString(this) }
+
+var E_Ext_More = &proto.ExtensionDesc{
+	ExtendedType:	(*MyMessage)(nil),
+	ExtensionType:	(*Ext)(nil),
+	Field:		103,
+	Name:		"test_proto.more",
+	Tag:		"bytes,103,opt,name=more",
 }
 
 type MessageList struct {
-	Message	[]*MessageList_Message	"PB(group,1,rep,name=message)"
+	Message			[]*MessageList_Message	`protobuf:"group,1,rep"`
 	XXX_unrecognized	[]byte
 }
-func (this *MessageList) Reset() {
-	*this = MessageList{}
-}
-func NewMessageList() *MessageList {
-	return new(MessageList)
-}
 
+func (this *MessageList) Reset()		{ *this = MessageList{} }
+func (this *MessageList) String() string	{ return proto.CompactTextString(this) }
+
 type MessageList_Message struct {
-	Name	*string	"PB(bytes,2,req,name=name)"
-	Count	*int32	"PB(varint,3,req,name=count)"
+	Name			*string	`protobuf:"bytes,2,req,name=name"`
+	Count			*int32	`protobuf:"varint,3,req,name=count"`
 	XXX_unrecognized	[]byte
 }
-func (this *MessageList_Message) Reset() {
-	*this = MessageList_Message{}
-}
-func NewMessageList_Message() *MessageList_Message {
-	return new(MessageList_Message)
-}
+
+func (this *MessageList_Message) Reset()		{ *this = MessageList_Message{} }
+func (this *MessageList_Message) String() string	{ return proto.CompactTextString(this) }
 
 func init() {
 	proto.RegisterEnum("test_proto.FOO", FOO_name, FOO_value)
 	proto.RegisterEnum("test_proto.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value)
 	proto.RegisterEnum("test_proto.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value)
+	proto.RegisterExtension(E_Ext_More)
 }
diff --git a/proto/text.go b/proto/text.go
index bb32983..f7f8f5f 100644
--- a/proto/text.go
+++ b/proto/text.go
@@ -58,7 +58,7 @@
 func (w *textWriter) Write(p []byte) (n int, err os.Error) {
 	n, err = len(p), nil
 
-	frags := strings.Split(string(p), "\n", -1)
+	frags := strings.Split(string(p), "\n")
 	if w.compact {
 		w.writer.Write([]byte(strings.Join(frags, " ")))
 		return