mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-02-11 06:40:37 +00:00
Rename each generated protobuf package such that the base of the Go package path is always equal to the Go package name to follow proper Go package naming conventions. The Go package name is derived from the .proto source file name by replacing ".proto" with "pb" and stripping all underscores. Change-Id: Iea05d1b5d94b1b2821ae10276ab771bb2df93c0e Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/177380 Reviewed-by: Damien Neil <dneil@google.com>
216 lines
7.9 KiB
Go
216 lines
7.9 KiB
Go
// 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.
|
|
package protodesc
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"google.golang.org/protobuf/internal/encoding/defval"
|
|
"google.golang.org/protobuf/internal/scalar"
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
|
|
"google.golang.org/protobuf/types/descriptorpb"
|
|
)
|
|
|
|
// ToFileDescriptorProto converts a FileDescriptor to a
|
|
// google.protobuf.FileDescriptorProto.
|
|
func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileDescriptorProto {
|
|
p := &descriptorpb.FileDescriptorProto{
|
|
Name: scalar.String(file.Path()),
|
|
Package: scalar.String(string(file.Package())),
|
|
// TODO: Clone options messages, or document this as aliasing.
|
|
Options: file.Options().(*descriptorpb.FileOptions),
|
|
}
|
|
for i, imports := 0, file.Imports(); i < imports.Len(); i++ {
|
|
imp := imports.Get(i)
|
|
p.Dependency = append(p.Dependency, imp.Path())
|
|
if imp.IsPublic {
|
|
p.PublicDependency = append(p.PublicDependency, int32(i))
|
|
}
|
|
if imp.IsWeak {
|
|
p.WeakDependency = append(p.WeakDependency, int32(i))
|
|
}
|
|
}
|
|
for i, messages := 0, file.Messages(); i < messages.Len(); i++ {
|
|
p.MessageType = append(p.MessageType, ToDescriptorProto(messages.Get(i)))
|
|
}
|
|
for i, enums := 0, file.Enums(); i < enums.Len(); i++ {
|
|
p.EnumType = append(p.EnumType, ToEnumDescriptorProto(enums.Get(i)))
|
|
}
|
|
for i, services := 0, file.Services(); i < services.Len(); i++ {
|
|
p.Service = append(p.Service, ToServiceDescriptorProto(services.Get(i)))
|
|
}
|
|
for i, exts := 0, file.Extensions(); i < exts.Len(); i++ {
|
|
p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i)))
|
|
}
|
|
if syntax := file.Syntax(); syntax != protoreflect.Proto2 {
|
|
p.Syntax = scalar.String(file.Syntax().String())
|
|
}
|
|
return p
|
|
}
|
|
|
|
// ToDescriptorProto converts a MessageDescriptor to a
|
|
// google.protobuf.DescriptorProto.
|
|
func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.DescriptorProto {
|
|
p := &descriptorpb.DescriptorProto{
|
|
Name: scalar.String(string(message.Name())),
|
|
Options: message.Options().(*descriptorpb.MessageOptions),
|
|
}
|
|
for i, fields := 0, message.Fields(); i < fields.Len(); i++ {
|
|
p.Field = append(p.Field, ToFieldDescriptorProto(fields.Get(i)))
|
|
}
|
|
for i, exts := 0, message.Extensions(); i < exts.Len(); i++ {
|
|
p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i)))
|
|
}
|
|
for i, messages := 0, message.Messages(); i < messages.Len(); i++ {
|
|
p.NestedType = append(p.NestedType, ToDescriptorProto(messages.Get(i)))
|
|
}
|
|
for i, enums := 0, message.Enums(); i < enums.Len(); i++ {
|
|
p.EnumType = append(p.EnumType, ToEnumDescriptorProto(enums.Get(i)))
|
|
}
|
|
for i, xranges := 0, message.ExtensionRanges(); i < xranges.Len(); i++ {
|
|
xrange := xranges.Get(i)
|
|
p.ExtensionRange = append(p.ExtensionRange, &descriptorpb.DescriptorProto_ExtensionRange{
|
|
Start: scalar.Int32(int32(xrange[0])),
|
|
End: scalar.Int32(int32(xrange[1])),
|
|
Options: message.ExtensionRangeOptions(i).(*descriptorpb.ExtensionRangeOptions),
|
|
})
|
|
}
|
|
for i, oneofs := 0, message.Oneofs(); i < oneofs.Len(); i++ {
|
|
p.OneofDecl = append(p.OneofDecl, ToOneofDescriptorProto(oneofs.Get(i)))
|
|
}
|
|
for i, ranges := 0, message.ReservedRanges(); i < ranges.Len(); i++ {
|
|
rrange := ranges.Get(i)
|
|
p.ReservedRange = append(p.ReservedRange, &descriptorpb.DescriptorProto_ReservedRange{
|
|
Start: scalar.Int32(int32(rrange[0])),
|
|
End: scalar.Int32(int32(rrange[1])),
|
|
})
|
|
}
|
|
for i, names := 0, message.ReservedNames(); i < names.Len(); i++ {
|
|
p.ReservedName = append(p.ReservedName, string(names.Get(i)))
|
|
}
|
|
return p
|
|
}
|
|
|
|
// ToFieldDescriptorProto converts a FieldDescriptor to a
|
|
// google.protobuf.FieldDescriptorProto.
|
|
func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.FieldDescriptorProto {
|
|
p := &descriptorpb.FieldDescriptorProto{
|
|
Name: scalar.String(string(field.Name())),
|
|
Number: scalar.Int32(int32(field.Number())),
|
|
Label: descriptorpb.FieldDescriptorProto_Label(field.Cardinality()).Enum(),
|
|
Type: descriptorpb.FieldDescriptorProto_Type(field.Kind()).Enum(),
|
|
Options: field.Options().(*descriptorpb.FieldOptions),
|
|
}
|
|
if field.IsExtension() {
|
|
p.Extendee = fullNameOf(field.ContainingMessage())
|
|
}
|
|
switch field.Kind() {
|
|
case protoreflect.EnumKind:
|
|
p.TypeName = fullNameOf(field.Enum())
|
|
case protoreflect.MessageKind, protoreflect.GroupKind:
|
|
p.TypeName = fullNameOf(field.Message())
|
|
}
|
|
if field.HasJSONName() {
|
|
p.JsonName = scalar.String(field.JSONName())
|
|
}
|
|
if field.HasDefault() {
|
|
if field.Kind() == protoreflect.EnumKind {
|
|
// TODO: defval.Marshal should probably take a FieldDescriptor
|
|
// instead of a Kind and do this itself.
|
|
p.DefaultValue = scalar.String(string(field.DefaultEnumValue().Name()))
|
|
} else {
|
|
def, err := defval.Marshal(field.Default(), field.Kind(), defval.Descriptor)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("%v: %v", field.FullName(), err))
|
|
}
|
|
p.DefaultValue = scalar.String(def)
|
|
}
|
|
}
|
|
if oneof := field.ContainingOneof(); oneof != nil {
|
|
p.OneofIndex = scalar.Int32(int32(oneof.Index()))
|
|
}
|
|
return p
|
|
}
|
|
|
|
// ToOneofDescriptorProto converts a OneofDescriptor to a
|
|
// google.protobuf.OneofDescriptorProto.
|
|
func ToOneofDescriptorProto(oneof protoreflect.OneofDescriptor) *descriptorpb.OneofDescriptorProto {
|
|
return &descriptorpb.OneofDescriptorProto{
|
|
Name: scalar.String(string(oneof.Name())),
|
|
Options: oneof.Options().(*descriptorpb.OneofOptions),
|
|
}
|
|
}
|
|
|
|
// ToEnumDescriptorProto converts a EnumDescriptor to a
|
|
// google.protobuf.EnumDescriptorProto.
|
|
func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumDescriptorProto {
|
|
p := &descriptorpb.EnumDescriptorProto{
|
|
Name: scalar.String(string(enum.Name())),
|
|
Options: enum.Options().(*descriptorpb.EnumOptions),
|
|
}
|
|
for i, values := 0, enum.Values(); i < values.Len(); i++ {
|
|
p.Value = append(p.Value, ToEnumValueDescriptorProto(values.Get(i)))
|
|
}
|
|
for i, ranges := 0, enum.ReservedRanges(); i < ranges.Len(); i++ {
|
|
rrange := ranges.Get(i)
|
|
p.ReservedRange = append(p.ReservedRange, &descriptorpb.EnumDescriptorProto_EnumReservedRange{
|
|
Start: scalar.Int32(int32(rrange[0])),
|
|
End: scalar.Int32(int32(rrange[1])),
|
|
})
|
|
}
|
|
for i, names := 0, enum.ReservedNames(); i < names.Len(); i++ {
|
|
p.ReservedName = append(p.ReservedName, string(names.Get(i)))
|
|
}
|
|
return p
|
|
}
|
|
|
|
// ToEnumValueDescriptorProto converts a EnumValueDescriptor to a
|
|
// google.protobuf.EnumValueDescriptorProto.
|
|
func ToEnumValueDescriptorProto(value protoreflect.EnumValueDescriptor) *descriptorpb.EnumValueDescriptorProto {
|
|
return &descriptorpb.EnumValueDescriptorProto{
|
|
Name: scalar.String(string(value.Name())),
|
|
Number: scalar.Int32(int32(value.Number())),
|
|
Options: value.Options().(*descriptorpb.EnumValueOptions),
|
|
}
|
|
}
|
|
|
|
// ToServiceDescriptorProto converts a ServiceDescriptor to a
|
|
// google.protobuf.ServiceDescriptorProto.
|
|
func ToServiceDescriptorProto(service protoreflect.ServiceDescriptor) *descriptorpb.ServiceDescriptorProto {
|
|
p := &descriptorpb.ServiceDescriptorProto{
|
|
Name: scalar.String(string(service.Name())),
|
|
Options: service.Options().(*descriptorpb.ServiceOptions),
|
|
}
|
|
for i, methods := 0, service.Methods(); i < methods.Len(); i++ {
|
|
p.Method = append(p.Method, ToMethodDescriptorProto(methods.Get(i)))
|
|
}
|
|
return p
|
|
}
|
|
|
|
// ToMethodDescriptorProto converts a MethodDescriptor to a
|
|
// google.protobuf.MethodDescriptorProto.
|
|
func ToMethodDescriptorProto(method protoreflect.MethodDescriptor) *descriptorpb.MethodDescriptorProto {
|
|
p := &descriptorpb.MethodDescriptorProto{
|
|
Name: scalar.String(string(method.Name())),
|
|
InputType: fullNameOf(method.Input()),
|
|
OutputType: fullNameOf(method.Output()),
|
|
Options: method.Options().(*descriptorpb.MethodOptions),
|
|
}
|
|
if method.IsStreamingClient() {
|
|
p.ClientStreaming = scalar.Bool(true)
|
|
}
|
|
if method.IsStreamingServer() {
|
|
p.ServerStreaming = scalar.Bool(true)
|
|
}
|
|
return p
|
|
}
|
|
|
|
func fullNameOf(d protoreflect.Descriptor) *string {
|
|
if d == nil {
|
|
return nil
|
|
}
|
|
return scalar.String("." + string(d.FullName()))
|
|
}
|