cmd/protoc-gen-go: treat extensions fields as proto2 in some places

The v1 generator doesn't include a "proto3" tag on extension fields,
even when the field is defined in a proto3 file. Match that behavior for
consistency. We can probably change this later if we want to; it's
unlikely anyone is depending on this behavior.

The v1 generator uses pointer types for extension fields, even when the
field is defined in a proto3 file. (e.g., *FooEnum instead of FooEnum.)
Match this behavior. We can't change this without breaking compatibility
in the generated code.

Change-Id: I4072f3dd1c915bf9ab89f1d5198e0144cb4de20f
Reviewed-on: https://go-review.googlesource.com/c/144282
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index b5b0f5a..8e57ebd 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -620,7 +620,8 @@
 		goType = "[]" + goType
 		pointer = false
 	}
-	if field.Desc.Syntax() == protoreflect.Proto3 {
+	// Extension fields always have pointer type, even when defined in a proto3 file.
+	if field.Desc.Syntax() == protoreflect.Proto3 && field.Desc.ExtendedType() == nil {
 		pointer = false
 	}
 	return goType, pointer
@@ -659,7 +660,10 @@
 		tag = append(tag, "json="+jsonName)
 	}
 	// proto3
-	if field.Desc.Syntax() == protoreflect.Proto3 {
+	// The previous implementation does not tag extension fields as proto3,
+	// even when the field is defined in a proto3 file. Match that behavior
+	// for consistency.
+	if field.Desc.Syntax() == protoreflect.Proto3 && field.Desc.ExtendedType() == nil {
 		tag = append(tag, "proto3")
 	}
 	// enum
diff --git a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
index 283dba4..d1f1380 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -76,136 +76,136 @@
 
 var E_ExtensionBool = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (bool)(nil),
+	ExtensionType: (*bool)(nil),
 	Field:         1001,
 	Name:          "goproto.protoc.extension.proto3.extension_bool",
-	Tag:           "varint,1001,opt,name=extension_bool,proto3",
+	Tag:           "varint,1001,opt,name=extension_bool",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionEnum = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (Enum)(nil),
+	ExtensionType: (*Enum)(nil),
 	Field:         1002,
 	Name:          "goproto.protoc.extension.proto3.extension_enum",
-	Tag:           "varint,1002,opt,name=extension_enum,proto3,enum=goproto.protoc.extension.proto3.Enum",
+	Tag:           "varint,1002,opt,name=extension_enum,enum=goproto.protoc.extension.proto3.Enum",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionInt32 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (int32)(nil),
+	ExtensionType: (*int32)(nil),
 	Field:         1003,
 	Name:          "goproto.protoc.extension.proto3.extension_int32",
-	Tag:           "varint,1003,opt,name=extension_int32,proto3",
+	Tag:           "varint,1003,opt,name=extension_int32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionSint32 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (int32)(nil),
+	ExtensionType: (*int32)(nil),
 	Field:         1004,
 	Name:          "goproto.protoc.extension.proto3.extension_sint32",
-	Tag:           "zigzag32,1004,opt,name=extension_sint32,proto3",
+	Tag:           "zigzag32,1004,opt,name=extension_sint32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionUint32 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (uint32)(nil),
+	ExtensionType: (*uint32)(nil),
 	Field:         1005,
 	Name:          "goproto.protoc.extension.proto3.extension_uint32",
-	Tag:           "varint,1005,opt,name=extension_uint32,proto3",
+	Tag:           "varint,1005,opt,name=extension_uint32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionInt64 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (int64)(nil),
+	ExtensionType: (*int64)(nil),
 	Field:         1006,
 	Name:          "goproto.protoc.extension.proto3.extension_int64",
-	Tag:           "varint,1006,opt,name=extension_int64,proto3",
+	Tag:           "varint,1006,opt,name=extension_int64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionSint64 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (int64)(nil),
+	ExtensionType: (*int64)(nil),
 	Field:         1007,
 	Name:          "goproto.protoc.extension.proto3.extension_sint64",
-	Tag:           "zigzag64,1007,opt,name=extension_sint64,proto3",
+	Tag:           "zigzag64,1007,opt,name=extension_sint64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionUint64 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (uint64)(nil),
+	ExtensionType: (*uint64)(nil),
 	Field:         1008,
 	Name:          "goproto.protoc.extension.proto3.extension_uint64",
-	Tag:           "varint,1008,opt,name=extension_uint64,proto3",
+	Tag:           "varint,1008,opt,name=extension_uint64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionSfixed32 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (int32)(nil),
+	ExtensionType: (*int32)(nil),
 	Field:         1009,
 	Name:          "goproto.protoc.extension.proto3.extension_sfixed32",
-	Tag:           "fixed32,1009,opt,name=extension_sfixed32,proto3",
+	Tag:           "fixed32,1009,opt,name=extension_sfixed32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionFixed32 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (uint32)(nil),
+	ExtensionType: (*uint32)(nil),
 	Field:         1010,
 	Name:          "goproto.protoc.extension.proto3.extension_fixed32",
-	Tag:           "fixed32,1010,opt,name=extension_fixed32,proto3",
+	Tag:           "fixed32,1010,opt,name=extension_fixed32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionFloat = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (float32)(nil),
+	ExtensionType: (*float32)(nil),
 	Field:         1011,
 	Name:          "goproto.protoc.extension.proto3.extension_float",
-	Tag:           "fixed32,1011,opt,name=extension_float,proto3",
+	Tag:           "fixed32,1011,opt,name=extension_float",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionSfixed64 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (int64)(nil),
+	ExtensionType: (*int64)(nil),
 	Field:         1012,
 	Name:          "goproto.protoc.extension.proto3.extension_sfixed64",
-	Tag:           "fixed64,1012,opt,name=extension_sfixed64,proto3",
+	Tag:           "fixed64,1012,opt,name=extension_sfixed64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionFixed64 = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (uint64)(nil),
+	ExtensionType: (*uint64)(nil),
 	Field:         1013,
 	Name:          "goproto.protoc.extension.proto3.extension_fixed64",
-	Tag:           "fixed64,1013,opt,name=extension_fixed64,proto3",
+	Tag:           "fixed64,1013,opt,name=extension_fixed64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionDouble = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (float64)(nil),
+	ExtensionType: (*float64)(nil),
 	Field:         1014,
 	Name:          "goproto.protoc.extension.proto3.extension_double",
-	Tag:           "fixed64,1014,opt,name=extension_double,proto3",
+	Tag:           "fixed64,1014,opt,name=extension_double",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
 var E_ExtensionString = &proto.ExtensionDesc{
 	ExtendedType:  (*descriptor.MessageOptions)(nil),
-	ExtensionType: (string)(nil),
+	ExtensionType: (*string)(nil),
 	Field:         1015,
 	Name:          "goproto.protoc.extension.proto3.extension_string",
-	Tag:           "bytes,1015,opt,name=extension_string,proto3",
+	Tag:           "bytes,1015,opt,name=extension_string",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -214,7 +214,7 @@
 	ExtensionType: ([]byte)(nil),
 	Field:         1016,
 	Name:          "goproto.protoc.extension.proto3.extension_bytes",
-	Tag:           "bytes,1016,opt,name=extension_bytes,proto3",
+	Tag:           "bytes,1016,opt,name=extension_bytes",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -223,7 +223,7 @@
 	ExtensionType: (*Message)(nil),
 	Field:         1017,
 	Name:          "goproto.protoc.extension.proto3.extension_Message",
-	Tag:           "bytes,1017,opt,name=extension_Message,proto3",
+	Tag:           "bytes,1017,opt,name=extension_Message",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -232,7 +232,7 @@
 	ExtensionType: ([]bool)(nil),
 	Field:         2001,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_bool",
-	Tag:           "varint,2001,rep,name=repeated_extension_bool,proto3",
+	Tag:           "varint,2001,rep,name=repeated_extension_bool",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -241,7 +241,7 @@
 	ExtensionType: ([]Enum)(nil),
 	Field:         2002,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_enum",
-	Tag:           "varint,2002,rep,name=repeated_extension_enum,proto3,enum=goproto.protoc.extension.proto3.Enum",
+	Tag:           "varint,2002,rep,name=repeated_extension_enum,enum=goproto.protoc.extension.proto3.Enum",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -250,7 +250,7 @@
 	ExtensionType: ([]int32)(nil),
 	Field:         2003,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_int32",
-	Tag:           "varint,2003,rep,name=repeated_extension_int32,proto3",
+	Tag:           "varint,2003,rep,name=repeated_extension_int32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -259,7 +259,7 @@
 	ExtensionType: ([]int32)(nil),
 	Field:         2004,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_sint32",
-	Tag:           "zigzag32,2004,rep,name=repeated_extension_sint32,proto3",
+	Tag:           "zigzag32,2004,rep,name=repeated_extension_sint32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -268,7 +268,7 @@
 	ExtensionType: ([]uint32)(nil),
 	Field:         2005,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_uint32",
-	Tag:           "varint,2005,rep,name=repeated_extension_uint32,proto3",
+	Tag:           "varint,2005,rep,name=repeated_extension_uint32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -277,7 +277,7 @@
 	ExtensionType: ([]int64)(nil),
 	Field:         2006,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_int64",
-	Tag:           "varint,2006,rep,name=repeated_extension_int64,proto3",
+	Tag:           "varint,2006,rep,name=repeated_extension_int64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -286,7 +286,7 @@
 	ExtensionType: ([]int64)(nil),
 	Field:         2007,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_sint64",
-	Tag:           "zigzag64,2007,rep,name=repeated_extension_sint64,proto3",
+	Tag:           "zigzag64,2007,rep,name=repeated_extension_sint64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -295,7 +295,7 @@
 	ExtensionType: ([]uint64)(nil),
 	Field:         2008,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_uint64",
-	Tag:           "varint,2008,rep,name=repeated_extension_uint64,proto3",
+	Tag:           "varint,2008,rep,name=repeated_extension_uint64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -304,7 +304,7 @@
 	ExtensionType: ([]int32)(nil),
 	Field:         2009,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_sfixed32",
-	Tag:           "fixed32,2009,rep,name=repeated_extension_sfixed32,proto3",
+	Tag:           "fixed32,2009,rep,name=repeated_extension_sfixed32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -313,7 +313,7 @@
 	ExtensionType: ([]uint32)(nil),
 	Field:         2010,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_fixed32",
-	Tag:           "fixed32,2010,rep,name=repeated_extension_fixed32,proto3",
+	Tag:           "fixed32,2010,rep,name=repeated_extension_fixed32",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -322,7 +322,7 @@
 	ExtensionType: ([]float32)(nil),
 	Field:         2011,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_float",
-	Tag:           "fixed32,2011,rep,name=repeated_extension_float,proto3",
+	Tag:           "fixed32,2011,rep,name=repeated_extension_float",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -331,7 +331,7 @@
 	ExtensionType: ([]int64)(nil),
 	Field:         2012,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_sfixed64",
-	Tag:           "fixed64,2012,rep,name=repeated_extension_sfixed64,proto3",
+	Tag:           "fixed64,2012,rep,name=repeated_extension_sfixed64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -340,7 +340,7 @@
 	ExtensionType: ([]uint64)(nil),
 	Field:         2013,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_fixed64",
-	Tag:           "fixed64,2013,rep,name=repeated_extension_fixed64,proto3",
+	Tag:           "fixed64,2013,rep,name=repeated_extension_fixed64",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -349,7 +349,7 @@
 	ExtensionType: ([]float64)(nil),
 	Field:         2014,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_double",
-	Tag:           "fixed64,2014,rep,name=repeated_extension_double,proto3",
+	Tag:           "fixed64,2014,rep,name=repeated_extension_double",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -358,7 +358,7 @@
 	ExtensionType: ([]string)(nil),
 	Field:         2015,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_string",
-	Tag:           "bytes,2015,rep,name=repeated_extension_string,proto3",
+	Tag:           "bytes,2015,rep,name=repeated_extension_string",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -367,7 +367,7 @@
 	ExtensionType: ([][]byte)(nil),
 	Field:         2016,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_bytes",
-	Tag:           "bytes,2016,rep,name=repeated_extension_bytes,proto3",
+	Tag:           "bytes,2016,rep,name=repeated_extension_bytes",
 	Filename:      "extensions/proto3/ext3.proto",
 }
 
@@ -376,7 +376,7 @@
 	ExtensionType: ([]*Message)(nil),
 	Field:         2017,
 	Name:          "goproto.protoc.extension.proto3.repeated_extension_Message",
-	Tag:           "bytes,2017,rep,name=repeated_extension_Message,proto3",
+	Tag:           "bytes,2017,rep,name=repeated_extension_Message",
 	Filename:      "extensions/proto3/ext3.proto",
 }