internal/cmd/generate-protos: generate internal descfield package

Generate a list of descriptor fields from the descriptor.proto itself
as an internal package. Use these fields for the internal implementation.

Change-Id: Ib1ab0c5c6deb332ba6c8018ef55136b7e5974944
Reviewed-on: https://go-review.googlesource.com/c/164864
Reviewed-by: Herbie Ong <herbie@google.com>
This commit is contained in:
Joe Tsai 2019-03-01 16:12:32 -08:00 committed by Joe Tsai
parent 4b465c007f
commit 1af1de0c15
8 changed files with 391 additions and 219 deletions

View File

@ -10,6 +10,7 @@ import (
"testing" "testing"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/v2/internal/descfield"
"github.com/golang/protobuf/v2/internal/scalar" "github.com/golang/protobuf/v2/internal/scalar"
descriptorpb "github.com/golang/protobuf/v2/types/descriptor" descriptorpb "github.com/golang/protobuf/v2/types/descriptor"
@ -35,19 +36,19 @@ func TestAnnotations(t *testing.T) {
path []int32 path []int32
}{{ }{{
"type ", "AnnotationsTestEnum", " int32", "type ", "AnnotationsTestEnum", " int32",
[]int32{5 /* enum_type */, 0}, []int32{descfield.FileDescriptorProto_EnumType, 0},
}, { }, {
"\t", "AnnotationsTestEnum_ANNOTATIONS_TEST_ENUM_VALUE", " AnnotationsTestEnum = 0", "\t", "AnnotationsTestEnum_ANNOTATIONS_TEST_ENUM_VALUE", " AnnotationsTestEnum = 0",
[]int32{5 /* enum_type */, 0, 2 /* value */, 0}, []int32{descfield.FileDescriptorProto_EnumType, 0, descfield.EnumDescriptorProto_Value, 0},
}, { }, {
"type ", "AnnotationsTestMessage", " struct {", "type ", "AnnotationsTestMessage", " struct {",
[]int32{4 /* message_type */, 0}, []int32{descfield.FileDescriptorProto_MessageType, 0},
}, { }, {
"\t", "AnnotationsTestField", " ", "\t", "AnnotationsTestField", " ",
[]int32{4 /* message_type */, 0, 2 /* field */, 0}, []int32{descfield.FileDescriptorProto_MessageType, 0, descfield.DescriptorProto_Field, 0},
}, { }, {
"func (m *AnnotationsTestMessage) ", "GetAnnotationsTestField", "() string {", "func (m *AnnotationsTestMessage) ", "GetAnnotationsTestField", "() string {",
[]int32{4 /* message_type */, 0, 2 /* field */, 0}, []int32{descfield.FileDescriptorProto_MessageType, 0, descfield.DescriptorProto_Field, 0},
}} { }} {
s := want.prefix + want.text + want.suffix s := want.prefix + want.text + want.suffix
pos := bytes.Index(sourceFile, []byte(s)) pos := bytes.Index(sourceFile, []byte(s))

View File

@ -18,6 +18,7 @@ import (
"unicode/utf8" "unicode/utf8"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/v2/internal/descfield"
"github.com/golang/protobuf/v2/internal/encoding/tag" "github.com/golang/protobuf/v2/internal/encoding/tag"
"github.com/golang/protobuf/v2/protogen" "github.com/golang/protobuf/v2/protogen"
"github.com/golang/protobuf/v2/reflect/protoreflect" "github.com/golang/protobuf/v2/reflect/protoreflect"
@ -118,10 +119,9 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
g.P("// source: ", f.Desc.Path()) g.P("// source: ", f.Desc.Path())
} }
g.P() g.P()
const filePackageField = 2 // FileDescriptorProto.package
g.PrintLeadingComments(protogen.Location{ g.PrintLeadingComments(protogen.Location{
SourceFile: f.Proto.GetName(), SourceFile: f.Proto.GetName(),
Path: []int32{filePackageField}, Path: []int32{descfield.FileDescriptorProto_Package},
}) })
g.P() g.P()
g.P("package ", f.GoPackageName) g.P("package ", f.GoPackageName)

View File

@ -12,6 +12,7 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path"
"path/filepath" "path/filepath"
"regexp" "regexp"
"strings" "strings"
@ -19,6 +20,7 @@ import (
gengogrpc "github.com/golang/protobuf/v2/cmd/protoc-gen-go-grpc/internal_gengogrpc" gengogrpc "github.com/golang/protobuf/v2/cmd/protoc-gen-go-grpc/internal_gengogrpc"
gengo "github.com/golang/protobuf/v2/cmd/protoc-gen-go/internal_gengo" gengo "github.com/golang/protobuf/v2/cmd/protoc-gen-go/internal_gengo"
"github.com/golang/protobuf/v2/protogen" "github.com/golang/protobuf/v2/protogen"
"github.com/golang/protobuf/v2/reflect/protoreflect"
) )
func init() { func init() {
@ -31,6 +33,7 @@ func init() {
if file.Generate { if file.Generate {
gengo.GenerateFile(gen, file) gengo.GenerateFile(gen, file)
gengogrpc.GenerateFile(gen, file) gengogrpc.GenerateFile(gen, file)
generateDescriptorFields(gen, file)
} }
} }
return nil return nil
@ -43,6 +46,15 @@ var (
run bool run bool
protoRoot string protoRoot string
repoRoot string repoRoot string
generatedPreamble = []string{
"// Copyright 2019 The Go Authors. All rights reserved.",
"// Use of this source code is governed by a BSD-style.",
"// license that can be found in the LICENSE file.",
"",
"// Code generated by generate-protos. DO NOT EDIT.",
"",
}
) )
func main() { func main() {
@ -152,6 +164,44 @@ func protoc(args ...string) {
check(err) check(err)
} }
// generateDescriptorFields generates an internal package for descriptor.proto.
func generateDescriptorFields(gen *protogen.Plugin, file *protogen.File) {
if file.Desc.Path() != "google/protobuf/descriptor.proto" {
return
}
const importPath = "github.com/golang/protobuf/v2/internal/descfield"
g := gen.NewGeneratedFile(importPath+"/field_gen.go", importPath)
for _, s := range generatedPreamble {
g.P(s)
}
g.P("// Package descfield contains constants for field numbers in descriptor.proto.")
g.P("package ", path.Base(importPath))
g.P("")
var processMessages func([]*protogen.Message)
processMessages = func(messages []*protogen.Message) {
for _, message := range messages {
g.P("// Field numbers for ", message.Desc.FullName(), ".")
g.P("const (")
for _, field := range message.Fields {
fd := field.Desc
typeName := fd.Kind().String()
switch fd.Kind() {
case protoreflect.EnumKind:
typeName = string(fd.EnumType().FullName())
case protoreflect.MessageKind, protoreflect.GroupKind:
typeName = string(fd.MessageType().FullName())
}
g.P(message.GoIdent.GoName, "_", field.GoName, "=", fd.Number(), "// ", fd.Cardinality(), " ", typeName)
}
g.P(")")
processMessages(message.Messages)
}
}
processMessages(file.Messages)
}
func syncOutput(dstDir, srcDir string) { func syncOutput(dstDir, srcDir string) {
filepath.Walk(srcDir, func(srcPath string, _ os.FileInfo, _ error) error { filepath.Walk(srcDir, func(srcPath string, _ os.FileInfo, _ error) error {
if !strings.HasSuffix(srcPath, ".go") && !strings.HasSuffix(srcPath, ".meta") { if !strings.HasSuffix(srcPath, ".go") && !strings.HasSuffix(srcPath, ".meta") {

View File

@ -0,0 +1,240 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style.
// license that can be found in the LICENSE file.
// Code generated by generate-protos. DO NOT EDIT.
// Package descfield contains constants for field numbers in descriptor.proto.
package descfield
// Field numbers for google.protobuf.FileDescriptorSet.
const (
FileDescriptorSet_File = 1 // repeated google.protobuf.FileDescriptorProto
)
// Field numbers for google.protobuf.FileDescriptorProto.
const (
FileDescriptorProto_Name = 1 // optional string
FileDescriptorProto_Package = 2 // optional string
FileDescriptorProto_Dependency = 3 // repeated string
FileDescriptorProto_PublicDependency = 10 // repeated int32
FileDescriptorProto_WeakDependency = 11 // repeated int32
FileDescriptorProto_MessageType = 4 // repeated google.protobuf.DescriptorProto
FileDescriptorProto_EnumType = 5 // repeated google.protobuf.EnumDescriptorProto
FileDescriptorProto_Service = 6 // repeated google.protobuf.ServiceDescriptorProto
FileDescriptorProto_Extension = 7 // repeated google.protobuf.FieldDescriptorProto
FileDescriptorProto_Options = 8 // optional google.protobuf.FileOptions
FileDescriptorProto_SourceCodeInfo = 9 // optional google.protobuf.SourceCodeInfo
FileDescriptorProto_Syntax = 12 // optional string
)
// Field numbers for google.protobuf.DescriptorProto.
const (
DescriptorProto_Name = 1 // optional string
DescriptorProto_Field = 2 // repeated google.protobuf.FieldDescriptorProto
DescriptorProto_Extension = 6 // repeated google.protobuf.FieldDescriptorProto
DescriptorProto_NestedType = 3 // repeated google.protobuf.DescriptorProto
DescriptorProto_EnumType = 4 // repeated google.protobuf.EnumDescriptorProto
DescriptorProto_ExtensionRange = 5 // repeated google.protobuf.DescriptorProto.ExtensionRange
DescriptorProto_OneofDecl = 8 // repeated google.protobuf.OneofDescriptorProto
DescriptorProto_Options = 7 // optional google.protobuf.MessageOptions
DescriptorProto_ReservedRange = 9 // repeated google.protobuf.DescriptorProto.ReservedRange
DescriptorProto_ReservedName = 10 // repeated string
)
// Field numbers for google.protobuf.DescriptorProto.ExtensionRange.
const (
DescriptorProto_ExtensionRange_Start = 1 // optional int32
DescriptorProto_ExtensionRange_End = 2 // optional int32
DescriptorProto_ExtensionRange_Options = 3 // optional google.protobuf.ExtensionRangeOptions
)
// Field numbers for google.protobuf.DescriptorProto.ReservedRange.
const (
DescriptorProto_ReservedRange_Start = 1 // optional int32
DescriptorProto_ReservedRange_End = 2 // optional int32
)
// Field numbers for google.protobuf.ExtensionRangeOptions.
const (
ExtensionRangeOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.FieldDescriptorProto.
const (
FieldDescriptorProto_Name = 1 // optional string
FieldDescriptorProto_Number = 3 // optional int32
FieldDescriptorProto_Label = 4 // optional google.protobuf.FieldDescriptorProto.Label
FieldDescriptorProto_Type = 5 // optional google.protobuf.FieldDescriptorProto.Type
FieldDescriptorProto_TypeName = 6 // optional string
FieldDescriptorProto_Extendee = 2 // optional string
FieldDescriptorProto_DefaultValue = 7 // optional string
FieldDescriptorProto_OneofIndex = 9 // optional int32
FieldDescriptorProto_JsonName = 10 // optional string
FieldDescriptorProto_Options = 8 // optional google.protobuf.FieldOptions
)
// Field numbers for google.protobuf.OneofDescriptorProto.
const (
OneofDescriptorProto_Name = 1 // optional string
OneofDescriptorProto_Options = 2 // optional google.protobuf.OneofOptions
)
// Field numbers for google.protobuf.EnumDescriptorProto.
const (
EnumDescriptorProto_Name = 1 // optional string
EnumDescriptorProto_Value = 2 // repeated google.protobuf.EnumValueDescriptorProto
EnumDescriptorProto_Options = 3 // optional google.protobuf.EnumOptions
EnumDescriptorProto_ReservedRange = 4 // repeated google.protobuf.EnumDescriptorProto.EnumReservedRange
EnumDescriptorProto_ReservedName = 5 // repeated string
)
// Field numbers for google.protobuf.EnumDescriptorProto.EnumReservedRange.
const (
EnumDescriptorProto_EnumReservedRange_Start = 1 // optional int32
EnumDescriptorProto_EnumReservedRange_End = 2 // optional int32
)
// Field numbers for google.protobuf.EnumValueDescriptorProto.
const (
EnumValueDescriptorProto_Name = 1 // optional string
EnumValueDescriptorProto_Number = 2 // optional int32
EnumValueDescriptorProto_Options = 3 // optional google.protobuf.EnumValueOptions
)
// Field numbers for google.protobuf.ServiceDescriptorProto.
const (
ServiceDescriptorProto_Name = 1 // optional string
ServiceDescriptorProto_Method = 2 // repeated google.protobuf.MethodDescriptorProto
ServiceDescriptorProto_Options = 3 // optional google.protobuf.ServiceOptions
)
// Field numbers for google.protobuf.MethodDescriptorProto.
const (
MethodDescriptorProto_Name = 1 // optional string
MethodDescriptorProto_InputType = 2 // optional string
MethodDescriptorProto_OutputType = 3 // optional string
MethodDescriptorProto_Options = 4 // optional google.protobuf.MethodOptions
MethodDescriptorProto_ClientStreaming = 5 // optional bool
MethodDescriptorProto_ServerStreaming = 6 // optional bool
)
// Field numbers for google.protobuf.FileOptions.
const (
FileOptions_JavaPackage = 1 // optional string
FileOptions_JavaOuterClassname = 8 // optional string
FileOptions_JavaMultipleFiles = 10 // optional bool
FileOptions_JavaGenerateEqualsAndHash = 20 // optional bool
FileOptions_JavaStringCheckUtf8 = 27 // optional bool
FileOptions_OptimizeFor = 9 // optional google.protobuf.FileOptions.OptimizeMode
FileOptions_GoPackage = 11 // optional string
FileOptions_CcGenericServices = 16 // optional bool
FileOptions_JavaGenericServices = 17 // optional bool
FileOptions_PyGenericServices = 18 // optional bool
FileOptions_PhpGenericServices = 42 // optional bool
FileOptions_Deprecated = 23 // optional bool
FileOptions_CcEnableArenas = 31 // optional bool
FileOptions_ObjcClassPrefix = 36 // optional string
FileOptions_CsharpNamespace = 37 // optional string
FileOptions_SwiftPrefix = 39 // optional string
FileOptions_PhpClassPrefix = 40 // optional string
FileOptions_PhpNamespace = 41 // optional string
FileOptions_PhpMetadataNamespace = 44 // optional string
FileOptions_RubyPackage = 45 // optional string
FileOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.MessageOptions.
const (
MessageOptions_MessageSetWireFormat = 1 // optional bool
MessageOptions_NoStandardDescriptorAccessor = 2 // optional bool
MessageOptions_Deprecated = 3 // optional bool
MessageOptions_MapEntry = 7 // optional bool
MessageOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.FieldOptions.
const (
FieldOptions_Ctype = 1 // optional google.protobuf.FieldOptions.CType
FieldOptions_Packed = 2 // optional bool
FieldOptions_Jstype = 6 // optional google.protobuf.FieldOptions.JSType
FieldOptions_Lazy = 5 // optional bool
FieldOptions_Deprecated = 3 // optional bool
FieldOptions_Weak = 10 // optional bool
FieldOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.OneofOptions.
const (
OneofOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.EnumOptions.
const (
EnumOptions_AllowAlias = 2 // optional bool
EnumOptions_Deprecated = 3 // optional bool
EnumOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.EnumValueOptions.
const (
EnumValueOptions_Deprecated = 1 // optional bool
EnumValueOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.ServiceOptions.
const (
ServiceOptions_Deprecated = 33 // optional bool
ServiceOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.MethodOptions.
const (
MethodOptions_Deprecated = 33 // optional bool
MethodOptions_IdempotencyLevel = 34 // optional google.protobuf.MethodOptions.IdempotencyLevel
MethodOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption
)
// Field numbers for google.protobuf.UninterpretedOption.
const (
UninterpretedOption_Name = 2 // repeated google.protobuf.UninterpretedOption.NamePart
UninterpretedOption_IdentifierValue = 3 // optional string
UninterpretedOption_PositiveIntValue = 4 // optional uint64
UninterpretedOption_NegativeIntValue = 5 // optional int64
UninterpretedOption_DoubleValue = 6 // optional double
UninterpretedOption_StringValue = 7 // optional bytes
UninterpretedOption_AggregateValue = 8 // optional string
)
// Field numbers for google.protobuf.UninterpretedOption.NamePart.
const (
UninterpretedOption_NamePart_NamePart = 1 // required string
UninterpretedOption_NamePart_IsExtension = 2 // required bool
)
// Field numbers for google.protobuf.SourceCodeInfo.
const (
SourceCodeInfo_Location = 1 // repeated google.protobuf.SourceCodeInfo.Location
)
// Field numbers for google.protobuf.SourceCodeInfo.Location.
const (
SourceCodeInfo_Location_Path = 1 // repeated int32
SourceCodeInfo_Location_Span = 2 // repeated int32
SourceCodeInfo_Location_LeadingComments = 3 // optional string
SourceCodeInfo_Location_TrailingComments = 4 // optional string
SourceCodeInfo_Location_LeadingDetachedComments = 6 // repeated string
)
// Field numbers for google.protobuf.GeneratedCodeInfo.
const (
GeneratedCodeInfo_Annotation = 1 // repeated google.protobuf.GeneratedCodeInfo.Annotation
)
// Field numbers for google.protobuf.GeneratedCodeInfo.Annotation.
const (
GeneratedCodeInfo_Annotation_Path = 1 // repeated int32
GeneratedCodeInfo_Annotation_SourceFile = 2 // optional string
GeneratedCodeInfo_Annotation_Begin = 3 // optional int32
GeneratedCodeInfo_Annotation_End = 4 // optional int32
)

View File

@ -5,6 +5,7 @@
package fileinit package fileinit
import ( import (
descfield "github.com/golang/protobuf/v2/internal/descfield"
wire "github.com/golang/protobuf/v2/internal/encoding/wire" wire "github.com/golang/protobuf/v2/internal/encoding/wire"
pref "github.com/golang/protobuf/v2/reflect/protoreflect" pref "github.com/golang/protobuf/v2/reflect/protoreflect"
) )
@ -88,36 +89,36 @@ func (fd *fileDesc) unmarshalSeed(b []byte) {
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fileDesc_Name: case descfield.FileDescriptorProto_Name:
fd.path = nb.MakeString(v) fd.path = nb.MakeString(v)
case fileDesc_Package: case descfield.FileDescriptorProto_Package:
fd.protoPackage = pref.FullName(nb.MakeString(v)) fd.protoPackage = pref.FullName(nb.MakeString(v))
case fileDesc_Enums: case descfield.FileDescriptorProto_EnumType:
if prevField != fileDesc_Enums { if prevField != descfield.FileDescriptorProto_EnumType {
if numEnums > 0 { if numEnums > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
posEnums = len(b0) - len(b) - n - m posEnums = len(b0) - len(b) - n - m
} }
numEnums++ numEnums++
case fileDesc_Messages: case descfield.FileDescriptorProto_MessageType:
if prevField != fileDesc_Messages { if prevField != descfield.FileDescriptorProto_MessageType {
if numMessages > 0 { if numMessages > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
posMessages = len(b0) - len(b) - n - m posMessages = len(b0) - len(b) - n - m
} }
numMessages++ numMessages++
case fileDesc_Extensions: case descfield.FileDescriptorProto_Extension:
if prevField != fileDesc_Extensions { if prevField != descfield.FileDescriptorProto_Extension {
if numExtensions > 0 { if numExtensions > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
posExtensions = len(b0) - len(b) - n - m posExtensions = len(b0) - len(b) - n - m
} }
numExtensions++ numExtensions++
case fileDesc_Services: case descfield.FileDescriptorProto_Service:
if prevField != fileDesc_Services { if prevField != descfield.FileDescriptorProto_Service {
if numServices > 0 { if numServices > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
@ -199,7 +200,7 @@ func (ed *enumDesc) unmarshalSeed(b []byte, nb *nameBuilder, pf *fileDesc, pd pr
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case enumDesc_Name: case descfield.EnumDescriptorProto_Name:
ed.fullName = nb.AppendFullName(pd.FullName(), v) ed.fullName = nb.AppendFullName(pd.FullName(), v)
} }
default: default:
@ -226,26 +227,26 @@ func (md *messageDesc) unmarshalSeed(b []byte, nb *nameBuilder, pf *fileDesc, pd
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case messageDesc_Name: case descfield.DescriptorProto_Name:
md.fullName = nb.AppendFullName(pd.FullName(), v) md.fullName = nb.AppendFullName(pd.FullName(), v)
case messageDesc_Enums: case descfield.DescriptorProto_EnumType:
if prevField != messageDesc_Enums { if prevField != descfield.DescriptorProto_EnumType {
if numEnums > 0 { if numEnums > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
posEnums = len(b0) - len(b) - n - m posEnums = len(b0) - len(b) - n - m
} }
numEnums++ numEnums++
case messageDesc_Messages: case descfield.DescriptorProto_NestedType:
if prevField != messageDesc_Messages { if prevField != descfield.DescriptorProto_NestedType {
if numMessages > 0 { if numMessages > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
posMessages = len(b0) - len(b) - n - m posMessages = len(b0) - len(b) - n - m
} }
numMessages++ numMessages++
case messageDesc_Extensions: case descfield.DescriptorProto_Extension:
if prevField != messageDesc_Extensions { if prevField != descfield.DescriptorProto_Extension {
if numExtensions > 0 { if numExtensions > 0 {
panic("non-contiguous repeated field") panic("non-contiguous repeated field")
} }
@ -315,14 +316,14 @@ func (xd *extensionDesc) unmarshalSeed(b []byte, nb *nameBuilder, pf *fileDesc,
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldDesc_Number: case descfield.FieldDescriptorProto_Number:
xd.number = pref.FieldNumber(v) xd.number = pref.FieldNumber(v)
} }
case wire.BytesType: case wire.BytesType:
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldDesc_Name: case descfield.FieldDescriptorProto_Name:
xd.fullName = nb.AppendFullName(pd.FullName(), v) xd.fullName = nb.AppendFullName(pd.FullName(), v)
} }
default: default:
@ -345,7 +346,7 @@ func (sd *serviceDesc) unmarshalSeed(b []byte, nb *nameBuilder, pf *fileDesc, pd
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case serviceDesc_Name: case descfield.ServiceDescriptorProto_Name:
sd.fullName = nb.AppendFullName(pd.FullName(), v) sd.fullName = nb.AppendFullName(pd.FullName(), v)
} }
default: default:

View File

@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"reflect" "reflect"
descfield "github.com/golang/protobuf/v2/internal/descfield"
defval "github.com/golang/protobuf/v2/internal/encoding/defval" defval "github.com/golang/protobuf/v2/internal/encoding/defval"
wire "github.com/golang/protobuf/v2/internal/encoding/wire" wire "github.com/golang/protobuf/v2/internal/encoding/wire"
pimpl "github.com/golang/protobuf/v2/internal/impl" pimpl "github.com/golang/protobuf/v2/internal/impl"
@ -344,16 +345,16 @@ func (fd *fileDesc) unmarshalFull(b []byte) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fileDesc_PublicImports: case descfield.FileDescriptorProto_PublicDependency:
fd.lazy.imports[v].IsPublic = true fd.lazy.imports[v].IsPublic = true
case fileDesc_WeakImports: case descfield.FileDescriptorProto_WeakDependency:
fd.lazy.imports[v].IsWeak = true fd.lazy.imports[v].IsWeak = true
} }
case wire.BytesType: case wire.BytesType:
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fileDesc_Syntax: case descfield.FileDescriptorProto_Syntax:
hasSyntax = true hasSyntax = true
switch string(v) { switch string(v) {
case "proto2": case "proto2":
@ -363,23 +364,23 @@ func (fd *fileDesc) unmarshalFull(b []byte) {
default: default:
panic("invalid syntax") panic("invalid syntax")
} }
case fileDesc_Imports: case descfield.FileDescriptorProto_Dependency:
fd.lazy.imports = append(fd.lazy.imports, pref.FileImport{ fd.lazy.imports = append(fd.lazy.imports, pref.FileImport{
FileDescriptor: ptype.PlaceholderFile(nb.MakeString(v), ""), FileDescriptor: ptype.PlaceholderFile(nb.MakeString(v), ""),
}) })
case fileDesc_Enums: case descfield.FileDescriptorProto_EnumType:
fd.enums.list[enumIdx].unmarshalFull(v, nb) fd.enums.list[enumIdx].unmarshalFull(v, nb)
enumIdx++ enumIdx++
case fileDesc_Messages: case descfield.FileDescriptorProto_MessageType:
fd.messages.list[messageIdx].unmarshalFull(v, nb) fd.messages.list[messageIdx].unmarshalFull(v, nb)
messageIdx++ messageIdx++
case fileDesc_Extensions: case descfield.FileDescriptorProto_Extension:
fd.extensions.list[extensionIdx].unmarshalFull(v, nb) fd.extensions.list[extensionIdx].unmarshalFull(v, nb)
extensionIdx++ extensionIdx++
case fileDesc_Services: case descfield.FileDescriptorProto_Service:
fd.services.list[serviceIdx].unmarshalFull(v, nb) fd.services.list[serviceIdx].unmarshalFull(v, nb)
serviceIdx++ serviceIdx++
case fileDesc_Options: case descfield.FileDescriptorProto_Options:
fd.lazy.options = append(fd.lazy.options, v...) fd.lazy.options = append(fd.lazy.options, v...)
} }
default: default:
@ -405,13 +406,13 @@ func (ed *enumDesc) unmarshalFull(b []byte, nb *nameBuilder) {
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case enumDesc_Values: case descfield.EnumDescriptorProto_Value:
rawValues = append(rawValues, v) rawValues = append(rawValues, v)
case enumDesc_ReservedNames: case descfield.EnumDescriptorProto_ReservedName:
ed.lazy.resvNames.list = append(ed.lazy.resvNames.list, pref.Name(nb.MakeString(v))) ed.lazy.resvNames.list = append(ed.lazy.resvNames.list, pref.Name(nb.MakeString(v)))
case enumDesc_ReservedRanges: case descfield.EnumDescriptorProto_ReservedRange:
ed.lazy.resvRanges.list = append(ed.lazy.resvRanges.list, unmarshalEnumReservedRange(v)) ed.lazy.resvRanges.list = append(ed.lazy.resvRanges.list, unmarshalEnumReservedRange(v))
case enumDesc_Options: case descfield.EnumDescriptorProto_Options:
ed.lazy.options = append(ed.lazy.options, v...) ed.lazy.options = append(ed.lazy.options, v...)
} }
default: default:
@ -439,9 +440,9 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case enumReservedRange_Start: case descfield.EnumDescriptorProto_EnumReservedRange_Start:
r[0] = pref.EnumNumber(v) r[0] = pref.EnumNumber(v)
case enumReservedRange_End: case descfield.EnumDescriptorProto_EnumReservedRange_End:
r[1] = pref.EnumNumber(v) r[1] = pref.EnumNumber(v)
} }
default: default:
@ -465,16 +466,16 @@ func (vd *enumValueDesc) unmarshalFull(b []byte, nb *nameBuilder, pf *fileDesc,
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case enumValueDesc_Number: case descfield.EnumValueDescriptorProto_Number:
vd.number = pref.EnumNumber(v) vd.number = pref.EnumNumber(v)
} }
case wire.BytesType: case wire.BytesType:
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case enumValueDesc_Name: case descfield.EnumValueDescriptorProto_Name:
vd.fullName = nb.AppendFullName(pd.FullName(), v) vd.fullName = nb.AppendFullName(pd.FullName(), v)
case enumValueDesc_Options: case descfield.EnumValueDescriptorProto_Options:
vd.options = append(vd.options, v...) vd.options = append(vd.options, v...)
} }
default: default:
@ -498,28 +499,28 @@ func (md *messageDesc) unmarshalFull(b []byte, nb *nameBuilder) {
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case messageDesc_Fields: case descfield.DescriptorProto_Field:
rawFields = append(rawFields, v) rawFields = append(rawFields, v)
case messageDesc_Oneofs: case descfield.DescriptorProto_OneofDecl:
rawOneofs = append(rawOneofs, v) rawOneofs = append(rawOneofs, v)
case messageDesc_ReservedNames: case descfield.DescriptorProto_ReservedName:
md.lazy.resvNames.list = append(md.lazy.resvNames.list, pref.Name(nb.MakeString(v))) md.lazy.resvNames.list = append(md.lazy.resvNames.list, pref.Name(nb.MakeString(v)))
case messageDesc_ReservedRanges: case descfield.DescriptorProto_ReservedRange:
md.lazy.resvRanges.list = append(md.lazy.resvRanges.list, unmarshalMessageReservedRange(v)) md.lazy.resvRanges.list = append(md.lazy.resvRanges.list, unmarshalMessageReservedRange(v))
case messageDesc_ExtensionRanges: case descfield.DescriptorProto_ExtensionRange:
r, opts := unmarshalMessageExtensionRange(v) r, opts := unmarshalMessageExtensionRange(v)
md.lazy.extRanges.list = append(md.lazy.extRanges.list, r) md.lazy.extRanges.list = append(md.lazy.extRanges.list, r)
md.lazy.extRangeOptions = append(md.lazy.extRangeOptions, opts) md.lazy.extRangeOptions = append(md.lazy.extRangeOptions, opts)
case messageDesc_Enums: case descfield.DescriptorProto_EnumType:
md.enums.list[enumIdx].unmarshalFull(v, nb) md.enums.list[enumIdx].unmarshalFull(v, nb)
enumIdx++ enumIdx++
case messageDesc_Messages: case descfield.DescriptorProto_NestedType:
md.messages.list[messageIdx].unmarshalFull(v, nb) md.messages.list[messageIdx].unmarshalFull(v, nb)
messageIdx++ messageIdx++
case messageDesc_Extensions: case descfield.DescriptorProto_Extension:
md.extensions.list[extensionIdx].unmarshalFull(v, nb) md.extensions.list[extensionIdx].unmarshalFull(v, nb)
extensionIdx++ extensionIdx++
case messageDesc_Options: case descfield.DescriptorProto_Options:
md.unmarshalOptions(v) md.unmarshalOptions(v)
} }
default: default:
@ -557,7 +558,7 @@ func (md *messageDesc) unmarshalOptions(b []byte) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case messageOptions_IsMapEntry: case descfield.MessageOptions_MapEntry:
md.lazy.isMapEntry = wire.DecodeBool(v) md.lazy.isMapEntry = wire.DecodeBool(v)
} }
default: default:
@ -576,9 +577,9 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case messageReservedRange_Start: case descfield.DescriptorProto_ReservedRange_Start:
r[0] = pref.FieldNumber(v) r[0] = pref.FieldNumber(v)
case messageReservedRange_End: case descfield.DescriptorProto_ReservedRange_End:
r[1] = pref.FieldNumber(v) r[1] = pref.FieldNumber(v)
} }
default: default:
@ -598,16 +599,16 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, opts []byt
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case messageExtensionRange_Start: case descfield.DescriptorProto_ExtensionRange_Start:
r[0] = pref.FieldNumber(v) r[0] = pref.FieldNumber(v)
case messageExtensionRange_End: case descfield.DescriptorProto_ExtensionRange_End:
r[1] = pref.FieldNumber(v) r[1] = pref.FieldNumber(v)
} }
case wire.BytesType: case wire.BytesType:
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case messageExtensionRange_Options: case descfield.DescriptorProto_ExtensionRange_Options:
opts = append(opts, v...) opts = append(opts, v...)
} }
default: default:
@ -633,13 +634,13 @@ func (fd *fieldDesc) unmarshalFull(b []byte, nb *nameBuilder, pf *fileDesc, pd p
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldDesc_Number: case descfield.FieldDescriptorProto_Number:
fd.number = pref.FieldNumber(v) fd.number = pref.FieldNumber(v)
case fieldDesc_Cardinality: case descfield.FieldDescriptorProto_Label:
fd.cardinality = pref.Cardinality(v) fd.cardinality = pref.Cardinality(v)
case fieldDesc_Kind: case descfield.FieldDescriptorProto_Type:
fd.kind = pref.Kind(v) fd.kind = pref.Kind(v)
case fieldDesc_OneofIndex: case descfield.FieldDescriptorProto_OneofIndex:
// In messageDesc.UnmarshalFull, we allocate slices for both // In messageDesc.UnmarshalFull, we allocate slices for both
// the field and oneof descriptors before unmarshaling either // the field and oneof descriptors before unmarshaling either
// of them. This ensures pointers to slice elements are stable. // of them. This ensures pointers to slice elements are stable.
@ -654,17 +655,17 @@ func (fd *fieldDesc) unmarshalFull(b []byte, nb *nameBuilder, pf *fileDesc, pd p
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldDesc_Name: case descfield.FieldDescriptorProto_Name:
fd.fullName = nb.AppendFullName(pd.FullName(), v) fd.fullName = nb.AppendFullName(pd.FullName(), v)
case fieldDesc_JSONName: case descfield.FieldDescriptorProto_JsonName:
fd.hasJSONName = true fd.hasJSONName = true
fd.jsonName = nb.MakeString(v) fd.jsonName = nb.MakeString(v)
case fieldDesc_Default: case descfield.FieldDescriptorProto_DefaultValue:
fd.defVal.has = true fd.defVal.has = true
rawDefVal = v rawDefVal = v
case fieldDesc_TypeName: case descfield.FieldDescriptorProto_TypeName:
rawTypeName = v rawTypeName = v
case fieldDesc_Options: case descfield.FieldDescriptorProto_Options:
fd.unmarshalOptions(v) fd.unmarshalOptions(v)
} }
default: default:
@ -703,10 +704,10 @@ func (fd *fieldDesc) unmarshalOptions(b []byte) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldOptions_IsPacked: case descfield.FieldOptions_Packed:
fd.hasPacked = true fd.hasPacked = true
fd.isPacked = wire.DecodeBool(v) fd.isPacked = wire.DecodeBool(v)
case fieldOptions_IsWeak: case descfield.FieldOptions_Weak:
fd.isWeak = wire.DecodeBool(v) fd.isWeak = wire.DecodeBool(v)
} }
default: default:
@ -729,9 +730,9 @@ func (od *oneofDesc) unmarshalFull(b []byte, nb *nameBuilder, pf *fileDesc, pd p
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case oneofDesc_Name: case descfield.OneofDescriptorProto_Name:
od.fullName = nb.AppendFullName(pd.FullName(), v) od.fullName = nb.AppendFullName(pd.FullName(), v)
case oneofDesc_Options: case descfield.OneofDescriptorProto_Options:
od.options = append(od.options, v...) od.options = append(od.options, v...)
} }
default: default:
@ -754,22 +755,22 @@ func (xd *extensionDesc) unmarshalFull(b []byte, nb *nameBuilder) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldDesc_Cardinality: case descfield.FieldDescriptorProto_Label:
xd.lazy.cardinality = pref.Cardinality(v) xd.lazy.cardinality = pref.Cardinality(v)
case fieldDesc_Kind: case descfield.FieldDescriptorProto_Type:
xd.lazy.kind = pref.Kind(v) xd.lazy.kind = pref.Kind(v)
} }
case wire.BytesType: case wire.BytesType:
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldDesc_JSONName: case descfield.FieldDescriptorProto_JsonName:
xd.lazy.hasJSONName = true xd.lazy.hasJSONName = true
xd.lazy.jsonName = nb.MakeString(v) xd.lazy.jsonName = nb.MakeString(v)
case fieldDesc_Default: case descfield.FieldDescriptorProto_DefaultValue:
xd.lazy.defVal.has = true xd.lazy.defVal.has = true
rawDefVal = v rawDefVal = v
case fieldDesc_Options: case descfield.FieldDescriptorProto_Options:
xd.unmarshalOptions(v) xd.unmarshalOptions(v)
} }
default: default:
@ -799,7 +800,7 @@ func (xd *extensionDesc) unmarshalOptions(b []byte) {
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case fieldOptions_IsPacked: case descfield.FieldOptions_Packed:
xd.lazy.isPacked = wire.DecodeBool(v) xd.lazy.isPacked = wire.DecodeBool(v)
} }
default: default:
@ -820,9 +821,9 @@ func (sd *serviceDesc) unmarshalFull(b []byte, nb *nameBuilder) {
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case serviceDesc_Methods: case descfield.ServiceDescriptorProto_Method:
rawMethods = append(rawMethods, v) rawMethods = append(rawMethods, v)
case serviceDesc_Options: case descfield.ServiceDescriptorProto_Options:
sd.lazy.options = append(sd.lazy.options, v...) sd.lazy.options = append(sd.lazy.options, v...)
} }
default: default:
@ -854,18 +855,18 @@ func (md *methodDesc) unmarshalFull(b []byte, nb *nameBuilder, pf *fileDesc, pd
v, m := wire.ConsumeVarint(b) v, m := wire.ConsumeVarint(b)
b = b[m:] b = b[m:]
switch num { switch num {
case methodDesc_IsStreamingClient: case descfield.MethodDescriptorProto_ClientStreaming:
md.isStreamingClient = wire.DecodeBool(v) md.isStreamingClient = wire.DecodeBool(v)
case methodDesc_IsStreamingServer: case descfield.MethodDescriptorProto_ServerStreaming:
md.isStreamingServer = wire.DecodeBool(v) md.isStreamingServer = wire.DecodeBool(v)
} }
case wire.BytesType: case wire.BytesType:
v, m := wire.ConsumeBytes(b) v, m := wire.ConsumeBytes(b)
b = b[m:] b = b[m:]
switch num { switch num {
case methodDesc_Name: case descfield.MethodDescriptorProto_Name:
md.fullName = nb.AppendFullName(pd.FullName(), v) md.fullName = nb.AppendFullName(pd.FullName(), v)
case methodDesc_Options: case descfield.MethodDescriptorProto_Options:
md.options = append(md.options, v...) md.options = append(md.options, v...)
} }
default: default:

View File

@ -1,94 +0,0 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package fileinit
// Constants for field numbers of messages declared in descriptor.proto.
const (
// FileDescriptorProto field numbers
fileDesc_Syntax = 12 // optional string
fileDesc_Name = 1 // optional string
fileDesc_Package = 2 // optional string
fileDesc_Imports = 3 // repeated string
fileDesc_PublicImports = 10 // repeated int32
fileDesc_WeakImports = 11 // repeated int32
fileDesc_Enums = 5 // repeated EnumDescriptorProto
fileDesc_Messages = 4 // repeated DescriptorProto
fileDesc_Extensions = 7 // repeated FieldDescriptorProto
fileDesc_Services = 6 // repeated ServiceDescriptorProto
fileDesc_Options = 8 // optional FileOptions
// EnumDescriptorProto field numbers
enumDesc_Name = 1 // optional string
enumDesc_Values = 2 // repeated EnumValueDescriptorProto
enumDesc_ReservedNames = 5 // repeated string
enumDesc_ReservedRanges = 4 // repeated EnumReservedRange
enumDesc_Options = 3 // optional EnumOptions
// EnumReservedRange field numbers
enumReservedRange_Start = 1 // optional int32
enumReservedRange_End = 2 // optional int32
// EnumValueDescriptorProto field numbers
enumValueDesc_Name = 1 // optional string
enumValueDesc_Number = 2 // optional int32
enumValueDesc_Options = 3 // optional EnumValueOptions
// DescriptorProto field numbers
messageDesc_Name = 1 // optional string
messageDesc_Fields = 2 // repeated FieldDescriptorProto
messageDesc_Oneofs = 8 // repeated OneofDescriptorProto
messageDesc_ReservedNames = 10 // repeated string
messageDesc_ReservedRanges = 9 // repeated ReservedRange
messageDesc_ExtensionRanges = 5 // repeated ExtensionRange
messageDesc_Enums = 4 // repeated EnumDescriptorProto
messageDesc_Messages = 3 // repeated DescriptorProto
messageDesc_Extensions = 6 // repeated FieldDescriptorProto
messageDesc_Options = 7 // optional MessageOptions
// ReservedRange field numbers
messageReservedRange_Start = 1 // optional int32
messageReservedRange_End = 2 // optional int32
// ExtensionRange field numbers
messageExtensionRange_Start = 1 // optional int32
messageExtensionRange_End = 2 // optional int32
messageExtensionRange_Options = 3 // optional ExtensionRangeOptions
// MessageOptions field numbers
messageOptions_IsMapEntry = 7 // optional bool
// FieldDescriptorProto field numbers
fieldDesc_Name = 1 // optional string
fieldDesc_Number = 3 // optional int32
fieldDesc_Cardinality = 4 // optional Label
fieldDesc_Kind = 5 // optional Type
fieldDesc_JSONName = 10 // optional string
fieldDesc_Default = 7 // optional string
fieldDesc_OneofIndex = 9 // optional int32
fieldDesc_TypeName = 6 // optional string
fieldDesc_ExtendedType = 2 // optional string
fieldDesc_Options = 8 // optional FieldOptions
// FieldOptions field numbers
fieldOptions_IsPacked = 2 // optional bool
fieldOptions_IsWeak = 10 // optional bool
// OneofDescriptorProto field numbers
oneofDesc_Name = 1 // optional string
oneofDesc_Options = 2 // optional OneofOptions
// ServiceDescriptorProto field numbers
serviceDesc_Name = 1 // optional string
serviceDesc_Methods = 2 // repeated MethodDescriptorProto
serviceDesc_Options = 3 // optional ServiceOptions
// MethodDescriptorProto field numbers
methodDesc_Name = 1 // optional string
methodDesc_InputType = 2 // optional string
methodDesc_OutputType = 3 // optional string
methodDesc_IsStreamingClient = 5 // optional bool
methodDesc_IsStreamingServer = 6 // optional bool
methodDesc_Options = 4 // optional MethodOptions
)

View File

@ -29,6 +29,7 @@ import (
"strings" "strings"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/v2/internal/descfield"
"github.com/golang/protobuf/v2/internal/scalar" "github.com/golang/protobuf/v2/internal/scalar"
"github.com/golang/protobuf/v2/reflect/protodesc" "github.com/golang/protobuf/v2/reflect/protodesc"
"github.com/golang/protobuf/v2/reflect/protoreflect" "github.com/golang/protobuf/v2/reflect/protoreflect"
@ -519,9 +520,9 @@ type Message struct {
func newMessage(gen *Plugin, f *File, parent *Message, desc protoreflect.MessageDescriptor) *Message { func newMessage(gen *Plugin, f *File, parent *Message, desc protoreflect.MessageDescriptor) *Message {
var loc Location var loc Location
if parent != nil { if parent != nil {
loc = parent.Location.appendPath(messageMessageField, int32(desc.Index())) loc = parent.Location.appendPath(descfield.DescriptorProto_NestedType, int32(desc.Index()))
} else { } else {
loc = f.location(fileMessageField, int32(desc.Index())) loc = f.location(descfield.FileDescriptorProto_MessageType, int32(desc.Index()))
} }
message := &Message{ message := &Message{
Desc: desc, Desc: desc,
@ -637,11 +638,11 @@ func newField(gen *Plugin, f *File, message *Message, desc protoreflect.FieldDes
var loc Location var loc Location
switch { switch {
case desc.ExtendedType() != nil && message == nil: case desc.ExtendedType() != nil && message == nil:
loc = f.location(fileExtensionField, int32(desc.Index())) loc = f.location(descfield.FileDescriptorProto_Extension, int32(desc.Index()))
case desc.ExtendedType() != nil && message != nil: case desc.ExtendedType() != nil && message != nil:
loc = message.Location.appendPath(messageExtensionField, int32(desc.Index())) loc = message.Location.appendPath(descfield.DescriptorProto_Extension, int32(desc.Index()))
default: default:
loc = message.Location.appendPath(messageFieldField, int32(desc.Index())) loc = message.Location.appendPath(descfield.DescriptorProto_Field, int32(desc.Index()))
} }
field := &Field{ field := &Field{
Desc: desc, Desc: desc,
@ -702,7 +703,7 @@ func newOneof(gen *Plugin, f *File, message *Message, desc protoreflect.OneofDes
Desc: desc, Desc: desc,
ParentMessage: message, ParentMessage: message,
GoName: camelCase(string(desc.Name())), GoName: camelCase(string(desc.Name())),
Location: message.Location.appendPath(messageOneofField, int32(desc.Index())), Location: message.Location.appendPath(descfield.DescriptorProto_OneofDecl, int32(desc.Index())),
} }
} }
@ -724,9 +725,9 @@ type Enum struct {
func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescriptor) *Enum { func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescriptor) *Enum {
var loc Location var loc Location
if parent != nil { if parent != nil {
loc = parent.Location.appendPath(messageEnumField, int32(desc.Index())) loc = parent.Location.appendPath(descfield.DescriptorProto_EnumType, int32(desc.Index()))
} else { } else {
loc = f.location(fileEnumField, int32(desc.Index())) loc = f.location(descfield.FileDescriptorProto_EnumType, int32(desc.Index()))
} }
enum := &Enum{ enum := &Enum{
Desc: desc, Desc: desc,
@ -761,7 +762,7 @@ func newEnumValue(gen *Plugin, f *File, message *Message, enum *Enum, desc proto
return &EnumValue{ return &EnumValue{
Desc: desc, Desc: desc,
GoIdent: f.GoImportPath.Ident(name), GoIdent: f.GoImportPath.Ident(name),
Location: enum.Location.appendPath(enumValueField, int32(desc.Index())), Location: enum.Location.appendPath(descfield.EnumDescriptorProto_Value, int32(desc.Index())),
} }
} }
@ -778,7 +779,7 @@ func newService(gen *Plugin, f *File, desc protoreflect.ServiceDescriptor) *Serv
service := &Service{ service := &Service{
Desc: desc, Desc: desc,
GoName: camelCase(string(desc.Name())), GoName: camelCase(string(desc.Name())),
Location: f.location(fileServiceField, int32(desc.Index())), Location: f.location(descfield.FileDescriptorProto_Service, int32(desc.Index())),
} }
for i, mdescs := 0, desc.Methods(); i < mdescs.Len(); i++ { for i, mdescs := 0, desc.Methods(); i < mdescs.Len(); i++ {
service.Methods = append(service.Methods, newMethod(gen, f, service, mdescs.Get(i))) service.Methods = append(service.Methods, newMethod(gen, f, service, mdescs.Get(i)))
@ -802,7 +803,7 @@ func newMethod(gen *Plugin, f *File, service *Service, desc protoreflect.MethodD
Desc: desc, Desc: desc,
GoName: camelCase(string(desc.Name())), GoName: camelCase(string(desc.Name())),
ParentService: service, ParentService: service,
Location: service.Location.appendPath(serviceMethodField, int32(desc.Index())), Location: service.Location.appendPath(descfield.ServiceDescriptorProto_Method, int32(desc.Index())),
} }
return method return method
} }
@ -1081,34 +1082,6 @@ const (
pathTypeSourceRelative pathTypeSourceRelative
) )
// The SourceCodeInfo message describes the location of elements of a parsed
// .proto file by way of a "path", which is a sequence of integers that
// describe the route from a FileDescriptorProto to the relevant submessage.
// The path alternates between a field number of a repeated field, and an index
// into that repeated field. The constants below define the field numbers that
// are used.
//
// See descriptor.proto for more information about this.
const (
// field numbers in FileDescriptorProto
filePackageField = 2 // package
fileMessageField = 4 // message_type
fileEnumField = 5 // enum_type
fileServiceField = 6 // service
fileExtensionField = 7 // extension
// field numbers in DescriptorProto
messageFieldField = 2 // field
messageMessageField = 3 // nested_type
messageEnumField = 4 // enum_type
messageExtensionField = 6 // extension
messageOneofField = 8 // oneof_decl
// field numbers in EnumDescriptorProto
enumValueField = 2 // value
// field numbers in ServiceDescriptorProto
serviceMethodField = 2 // method
serviceStreamField = 4 // stream
)
// A Location is a location in a .proto source file. // A Location is a location in a .proto source file.
// //
// See the google.protobuf.SourceCodeInfo documentation in descriptor.proto // See the google.protobuf.SourceCodeInfo documentation in descriptor.proto