cmd/protoc-gen-go: add more flags to control generation of deprecated features

Change-Id: I57f5927c1d3a834de067a5e0a96d957a7af9aafe
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/172657
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 47c47aa..219d79a 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -30,6 +30,10 @@
 	// which provide a bi-directional mapping between enum numbers and names.
 	generateEnumMapVars = true
 
+	// generateEnumJSONMethods specifies whether to generate the UnmarshalJSON
+	// method for proto2 enums.
+	generateEnumJSONMethods = true
+
 	// generateRawDescMethods specifies whether to generate EnumDescriptor and
 	// Descriptor methods for enums and messages. These methods return the
 	// GZIP'd contents of the raw file descriptor and the path from the root
@@ -40,6 +44,10 @@
 	// XXX_OneofWrappers methods on messages with oneofs.
 	generateOneofWrapperMethods = false
 
+	// generateExtensionRangeMethods specifies whether to generate the
+	// ExtensionRangeArray method for messages that support extensions.
+	generateExtensionRangeMethods = true
+
 	// generateWKTMarkerMethods specifes whether to generate
 	// XXX_WellKnownType methods on well-known types.
 	generateWKTMarkerMethods = false
@@ -329,7 +337,7 @@
 	genReflectEnum(gen, g, f, enum)
 
 	// UnmarshalJSON method.
-	if enum.Desc.Syntax() == protoreflect.Proto2 {
+	if generateEnumJSONMethods && enum.Desc.Syntax() == protoreflect.Proto2 {
 		g.P("// Deprecated: Do not use.")
 		g.P("func (x *", enum.GoIdent, ") UnmarshalJSON(b []byte) error {")
 		g.P("num, err := ", protoimplPackage.Ident("X"), ".UnmarshalJSONEnum(x.Descriptor(), b)")
@@ -493,21 +501,23 @@
 	}
 
 	// ExtensionRangeArray method.
-	if extranges := message.Desc.ExtensionRanges(); extranges.Len() > 0 {
-		protoExtRange := protoifacePackage.Ident("ExtensionRangeV1")
-		extRangeVar := "extRange_" + message.GoIdent.GoName
-		g.P("var ", extRangeVar, " = []", protoExtRange, " {")
-		for i := 0; i < extranges.Len(); i++ {
-			r := extranges.Get(i)
-			g.P("{Start:", r[0], ", End:", r[1]-1 /* inclusive */, "},")
+	if generateExtensionRangeMethods {
+		if extranges := message.Desc.ExtensionRanges(); extranges.Len() > 0 {
+			protoExtRange := protoifacePackage.Ident("ExtensionRangeV1")
+			extRangeVar := "extRange_" + message.GoIdent.GoName
+			g.P("var ", extRangeVar, " = []", protoExtRange, " {")
+			for i := 0; i < extranges.Len(); i++ {
+				r := extranges.Get(i)
+				g.P("{Start:", r[0], ", End:", r[1]-1 /* inclusive */, "},")
+			}
+			g.P("}")
+			g.P()
+			g.P("// Deprecated: Use ", message.GoIdent, ".ProtoReflect.Type.ExtensionRanges instead.")
+			g.P("func (*", message.GoIdent, ") ExtensionRangeArray() []", protoExtRange, " {")
+			g.P("return ", extRangeVar)
+			g.P("}")
+			g.P()
 		}
-		g.P("}")
-		g.P()
-		g.P("// Deprecated: Use ", message.GoIdent, ".ProtoReflect.Type.ExtensionRanges instead.")
-		g.P("func (*", message.GoIdent, ") ExtensionRangeArray() []", protoExtRange, " {")
-		g.P("return ", extRangeVar)
-		g.P("}")
-		g.P()
 	}
 
 	genWellKnownType(g, "*", message.GoIdent, message.Desc)