Joe Tsai a95b29fbf6 types: consistently name generated protos
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>
2019-05-16 21:55:40 +00:00

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()))
}