reflect/protoreflect: rename methods with Type suffix

The protobuf type system uses the word "descriptor" instead of "type".
We should avoid the "type" verbage when we aren't talking about Go types.
The old names are temporarily kept around for compatibility reasons.

Change-Id: Icc99c913528ead011f7a74aa8399d9c5ec6dc56e
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/172238
Reviewed-by: Herbie Ong <herbie@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
Joe Tsai 2019-04-15 23:39:09 -07:00 committed by Joe Tsai
parent 1e09691415
commit d24bc72368
35 changed files with 405 additions and 329 deletions

View File

@ -181,20 +181,20 @@ func genService(gen *protogen.Plugin, file *protogen.File, g *protogen.Generated
func clientSignature(g *protogen.GeneratedFile, method *protogen.Method) string {
s := method.GoName + "(ctx " + g.QualifiedGoIdent(contextPackage.Ident("Context"))
if !method.Desc.IsStreamingClient() {
s += ", in *" + g.QualifiedGoIdent(method.InputType.GoIdent)
s += ", in *" + g.QualifiedGoIdent(method.Input.GoIdent)
}
s += ", opts ..." + g.QualifiedGoIdent(grpcPackage.Ident("CallOption")) + ") ("
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
s += "*" + g.QualifiedGoIdent(method.OutputType.GoIdent)
s += "*" + g.QualifiedGoIdent(method.Output.GoIdent)
} else {
s += method.ParentService.GoName + "_" + method.GoName + "Client"
s += method.Parent.GoName + "_" + method.GoName + "Client"
}
s += ", error)"
return s
}
func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method, index int) {
service := method.ParentService
service := method.Parent
sname := fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.Desc.Name())
if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {
@ -202,7 +202,7 @@ func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
}
g.P("func (c *", unexport(service.GoName), "Client) ", clientSignature(g, method), "{")
if !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() {
g.P("out := new(", method.OutputType.GoIdent, ")")
g.P("out := new(", method.Output.GoIdent, ")")
g.P(`err := c.cc.Invoke(ctx, "`, sname, `", in, out, opts...)`)
g.P("if err != nil { return nil, err }")
g.P("return out, nil")
@ -230,13 +230,13 @@ func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
// Stream auxiliary types and methods.
g.P("type ", service.GoName, "_", method.GoName, "Client interface {")
if genSend {
g.P("Send(*", method.InputType.GoIdent, ") error")
g.P("Send(*", method.Input.GoIdent, ") error")
}
if genRecv {
g.P("Recv() (*", method.OutputType.GoIdent, ", error)")
g.P("Recv() (*", method.Output.GoIdent, ", error)")
}
if genCloseAndRecv {
g.P("CloseAndRecv() (*", method.OutputType.GoIdent, ", error)")
g.P("CloseAndRecv() (*", method.Output.GoIdent, ", error)")
}
g.P(grpcPackage.Ident("ClientStream"))
g.P("}")
@ -248,23 +248,23 @@ func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
g.P()
if genSend {
g.P("func (x *", streamType, ") Send(m *", method.InputType.GoIdent, ") error {")
g.P("func (x *", streamType, ") Send(m *", method.Input.GoIdent, ") error {")
g.P("return x.ClientStream.SendMsg(m)")
g.P("}")
g.P()
}
if genRecv {
g.P("func (x *", streamType, ") Recv() (*", method.OutputType.GoIdent, ", error) {")
g.P("m := new(", method.OutputType.GoIdent, ")")
g.P("func (x *", streamType, ") Recv() (*", method.Output.GoIdent, ", error) {")
g.P("m := new(", method.Output.GoIdent, ")")
g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
g.P("return m, nil")
g.P("}")
g.P()
}
if genCloseAndRecv {
g.P("func (x *", streamType, ") CloseAndRecv() (*", method.OutputType.GoIdent, ", error) {")
g.P("func (x *", streamType, ") CloseAndRecv() (*", method.Output.GoIdent, ", error) {")
g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }")
g.P("m := new(", method.OutputType.GoIdent, ")")
g.P("m := new(", method.Output.GoIdent, ")")
g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
g.P("return m, nil")
g.P("}")
@ -277,24 +277,24 @@ func serverSignature(g *protogen.GeneratedFile, method *protogen.Method) string
ret := "error"
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
reqArgs = append(reqArgs, g.QualifiedGoIdent(contextPackage.Ident("Context")))
ret = "(*" + g.QualifiedGoIdent(method.OutputType.GoIdent) + ", error)"
ret = "(*" + g.QualifiedGoIdent(method.Output.GoIdent) + ", error)"
}
if !method.Desc.IsStreamingClient() {
reqArgs = append(reqArgs, "*"+g.QualifiedGoIdent(method.InputType.GoIdent))
reqArgs = append(reqArgs, "*"+g.QualifiedGoIdent(method.Input.GoIdent))
}
if method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() {
reqArgs = append(reqArgs, method.ParentService.GoName+"_"+method.GoName+"Server")
reqArgs = append(reqArgs, method.Parent.GoName+"_"+method.GoName+"Server")
}
return method.GoName + "(" + strings.Join(reqArgs, ", ") + ") " + ret
}
func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method) string {
service := method.ParentService
service := method.Parent
hname := fmt.Sprintf("_%s_%s_Handler", service.GoName, method.GoName)
if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
g.P("func ", hname, "(srv interface{}, ctx ", contextPackage.Ident("Context"), ", dec func(interface{}) error, interceptor ", grpcPackage.Ident("UnaryServerInterceptor"), ") (interface{}, error) {")
g.P("in := new(", method.InputType.GoIdent, ")")
g.P("in := new(", method.Input.GoIdent, ")")
g.P("if err := dec(in); err != nil { return nil, err }")
g.P("if interceptor == nil { return srv.(", service.GoName, "Server).", method.GoName, "(ctx, in) }")
g.P("info := &", grpcPackage.Ident("UnaryServerInfo"), "{")
@ -302,7 +302,7 @@ func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.GoName)), ",")
g.P("}")
g.P("handler := func(ctx ", contextPackage.Ident("Context"), ", req interface{}) (interface{}, error) {")
g.P("return srv.(", service.GoName, "Server).", method.GoName, "(ctx, req.(*", method.InputType.GoIdent, "))")
g.P("return srv.(", service.GoName, "Server).", method.GoName, "(ctx, req.(*", method.Input.GoIdent, "))")
g.P("}")
g.P("return interceptor(ctx, in, info, handler)")
g.P("}")
@ -312,7 +312,7 @@ func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
streamType := unexport(service.GoName) + method.GoName + "Server"
g.P("func ", hname, "(srv interface{}, stream ", grpcPackage.Ident("ServerStream"), ") error {")
if !method.Desc.IsStreamingClient() {
g.P("m := new(", method.InputType.GoIdent, ")")
g.P("m := new(", method.Input.GoIdent, ")")
g.P("if err := stream.RecvMsg(m); err != nil { return err }")
g.P("return srv.(", service.GoName, "Server).", method.GoName, "(m, &", streamType, "{stream})")
} else {
@ -328,13 +328,13 @@ func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
// Stream auxiliary types and methods.
g.P("type ", service.GoName, "_", method.GoName, "Server interface {")
if genSend {
g.P("Send(*", method.OutputType.GoIdent, ") error")
g.P("Send(*", method.Output.GoIdent, ") error")
}
if genSendAndClose {
g.P("SendAndClose(*", method.OutputType.GoIdent, ") error")
g.P("SendAndClose(*", method.Output.GoIdent, ") error")
}
if genRecv {
g.P("Recv() (*", method.InputType.GoIdent, ", error)")
g.P("Recv() (*", method.Input.GoIdent, ", error)")
}
g.P(grpcPackage.Ident("ServerStream"))
g.P("}")
@ -346,20 +346,20 @@ func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.Gene
g.P()
if genSend {
g.P("func (x *", streamType, ") Send(m *", method.OutputType.GoIdent, ") error {")
g.P("func (x *", streamType, ") Send(m *", method.Output.GoIdent, ") error {")
g.P("return x.ServerStream.SendMsg(m)")
g.P("}")
g.P()
}
if genSendAndClose {
g.P("func (x *", streamType, ") SendAndClose(m *", method.OutputType.GoIdent, ") error {")
g.P("func (x *", streamType, ") SendAndClose(m *", method.Output.GoIdent, ") error {")
g.P("return x.ServerStream.SendMsg(m)")
g.P("}")
g.P()
}
if genRecv {
g.P("func (x *", streamType, ") Recv() (*", method.InputType.GoIdent, ", error) {")
g.P("m := new(", method.InputType.GoIdent, ")")
g.P("func (x *", streamType, ") Recv() (*", method.Input.GoIdent, ", error) {")
g.P("m := new(", method.Input.GoIdent, ")")
g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }")
g.P("return m, nil")
g.P("}")

View File

@ -350,13 +350,13 @@ func genMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo, me
g.Annotate(message.GoIdent.GoName, message.Location)
g.P("type ", message.GoIdent, " struct {")
for _, field := range message.Fields {
if field.OneofType != nil {
if field.Oneof != nil {
// It would be a bit simpler to iterate over the oneofs below,
// but generating the field here keeps the contents of the Go
// struct in the same order as the contents of the source
// .proto file.
if field == field.OneofType.Fields[0] {
genOneofField(gen, g, f, message, field.OneofType)
if field == field.Oneof.Fields[0] {
genOneofField(gen, g, f, message, field.Oneof)
}
continue
}
@ -370,8 +370,8 @@ func genMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo, me
fmt.Sprintf("json:%q", fieldJSONTag(field)),
}
if field.Desc.IsMap() {
key := field.MessageType.Fields[0]
val := field.MessageType.Fields[1]
key := field.Message.Fields[0]
val := field.Message.Fields[1]
tags = append(tags,
fmt.Sprintf("protobuf_key:%q", fieldProtobufTag(key)),
fmt.Sprintf("protobuf_val:%q", fieldProtobufTag(val)),
@ -459,9 +459,9 @@ func genMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo, me
g.P("var ", defVarName, " []byte = []byte(", strconv.Quote(string(def.Bytes())), ")")
case protoreflect.EnumKind:
evalueDesc := field.Desc.DefaultEnumValue()
enum := field.EnumType
enum := field.Enum
evalue := enum.Values[evalueDesc.Index()]
g.P("const ", defVarName, " ", field.EnumType.GoIdent, " = ", evalue.GoIdent)
g.P("const ", defVarName, " ", field.Enum.GoIdent, " = ", evalue.GoIdent)
case protoreflect.FloatKind, protoreflect.DoubleKind:
// Floating point numbers need extra handling for -Inf/Inf/NaN.
f := field.Desc.Default().Float()
@ -498,7 +498,7 @@ func genMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo, me
// Getter methods.
for _, field := range message.Fields {
if isFirstOneofField(field) {
genOneofGetter(gen, g, f, message, field.OneofType)
genOneofGetter(gen, g, f, message, field.Oneof)
}
goType, pointer := fieldGoType(g, field)
defaultValue := fieldDefaultValue(g, message, field)
@ -507,8 +507,8 @@ func genMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo, me
}
g.Annotate(message.GoIdent.GoName+".Get"+field.GoName, field.Location)
g.P("func (x *", message.GoIdent, ") Get", field.GoName, "() ", goType, " {")
if field.OneofType != nil {
g.P("if x, ok := x.Get", field.OneofType.GoName, "().(*", fieldOneofType(field), "); ok {")
if field.Oneof != nil {
g.P("if x, ok := x.Get", field.Oneof.GoName, "().(*", fieldOneofType(field), "); ok {")
g.P("return x.", field.GoName)
g.P("}")
} else {
@ -549,7 +549,7 @@ func fieldGoType(g *protogen.GeneratedFile, field *protogen.Field) (goType strin
case protoreflect.BoolKind:
goType = "bool"
case protoreflect.EnumKind:
goType = g.QualifiedGoIdent(field.EnumType.GoIdent)
goType = g.QualifiedGoIdent(field.Enum.GoIdent)
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
goType = "int32"
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
@ -569,11 +569,11 @@ func fieldGoType(g *protogen.GeneratedFile, field *protogen.Field) (goType strin
pointer = false
case protoreflect.MessageKind, protoreflect.GroupKind:
if field.Desc.IsMap() {
keyType, _ := fieldGoType(g, field.MessageType.Fields[0])
valType, _ := fieldGoType(g, field.MessageType.Fields[1])
keyType, _ := fieldGoType(g, field.Message.Fields[0])
valType, _ := fieldGoType(g, field.Message.Fields[1])
return fmt.Sprintf("map[%v]%v", keyType, valType), false
}
goType = "*" + g.QualifiedGoIdent(field.MessageType.GoIdent)
goType = "*" + g.QualifiedGoIdent(field.Message.GoIdent)
pointer = false
}
if field.Desc.Cardinality() == protoreflect.Repeated {
@ -581,7 +581,7 @@ func fieldGoType(g *protogen.GeneratedFile, field *protogen.Field) (goType strin
pointer = false
}
// Extension fields always have pointer type, even when defined in a proto3 file.
if field.Desc.Syntax() == protoreflect.Proto3 && field.Desc.ExtendedType() == nil {
if field.Desc.Syntax() == protoreflect.Proto3 && field.Desc.Extendee() == nil {
pointer = false
}
return goType, pointer
@ -590,7 +590,7 @@ func fieldGoType(g *protogen.GeneratedFile, field *protogen.Field) (goType strin
func fieldProtobufTag(field *protogen.Field) string {
var enumName string
if field.Desc.Kind() == protoreflect.EnumKind {
enumName = enumLegacyName(field.EnumType)
enumName = enumLegacyName(field.Enum)
}
return tag.Marshal(field.Desc, enumName)
}
@ -614,7 +614,7 @@ func fieldDefaultValue(g *protogen.GeneratedFile, message *protogen.Message, fie
case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.BytesKind:
return "nil"
case protoreflect.EnumKind:
return g.QualifiedGoIdent(field.EnumType.Values[0].GoIdent)
return g.QualifiedGoIdent(field.Enum.Values[0].GoIdent)
default:
return "0"
}
@ -645,7 +645,7 @@ func genExtensions(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo)
}
g.P("{")
g.P("ExtendedType: (*", extension.ExtendedType.GoIdent, ")(nil),")
g.P("ExtendedType: (*", extension.Extendee.GoIdent, ")(nil),")
goType, pointer := fieldGoType(g, extension)
if pointer {
goType = "*" + goType
@ -662,13 +662,13 @@ func genExtensions(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo)
g.P("var (")
for i, extension := range f.allExtensions {
ed := extension.Desc
targetName := string(ed.ExtendedType().FullName())
targetName := string(ed.Extendee().FullName())
typeName := ed.Kind().String()
switch ed.Kind() {
case protoreflect.EnumKind:
typeName = string(ed.EnumType().FullName())
typeName = string(ed.Enum().FullName())
case protoreflect.MessageKind, protoreflect.GroupKind:
typeName = string(ed.MessageType().FullName())
typeName = string(ed.Message().FullName())
}
fieldName := string(ed.Name())
g.P("// extend ", targetName, " { ", ed.Cardinality().String(), " ", typeName, " ", fieldName, " = ", ed.Number(), "; }")
@ -681,11 +681,11 @@ func genExtensions(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo)
// isExtensionMessageSetELement returns the adjusted name of an extension
// which extends proto2.bridge.MessageSet.
func isExtensionMessageSetElement(extension *protogen.Extension) (name protoreflect.FullName, ok bool) {
opts := extension.ExtendedType.Desc.Options().(*descriptorpb.MessageOptions)
opts := extension.Extendee.Desc.Options().(*descriptorpb.MessageOptions)
if !opts.GetMessageSetWireFormat() || extension.Desc.Name() != "message_set_extension" {
return "", false
}
if extension.ParentMessage == nil {
if extension.Parent == nil {
// This case shouldn't be given special handling at all--we're
// only supposed to drop the ".message_set_extension" for
// extensions defined within a message (i.e., the extension
@ -704,8 +704,8 @@ func isExtensionMessageSetElement(extension *protogen.Extension) (name protorefl
// extensionVar returns the var holding the ExtensionDesc for an extension.
func extensionVar(f *protogen.File, extension *protogen.Extension) protogen.GoIdent {
name := "E_"
if extension.ParentMessage != nil {
name += extension.ParentMessage.GoIdent.GoName + "_"
if extension.Parent != nil {
name += extension.Parent.GoIdent.GoName + "_"
}
name += extension.GoName
return f.GoImportPath.Ident(name)
@ -820,7 +820,7 @@ func genOneofTypes(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo,
// isFirstOneofField reports whether this is the first field in a oneof.
func isFirstOneofField(field *protogen.Field) bool {
return field.OneofType != nil && field.OneofType.Fields[0] == field
return field.Oneof != nil && field.Oneof.Fields[0] == field
}
// oneofFieldName returns the name of the struct field holding the oneof value.
@ -834,14 +834,14 @@ func oneofFieldName(oneof *protogen.Oneof) string {
// oneofInterfaceName returns the name of the interface type implemented by
// the oneof field value types.
func oneofInterfaceName(oneof *protogen.Oneof) string {
return fmt.Sprintf("is%s_%s", oneof.ParentMessage.GoIdent.GoName, oneof.GoName)
return fmt.Sprintf("is%s_%s", oneof.Parent.GoIdent.GoName, oneof.GoName)
}
// fieldOneofType returns the wrapper type used to represent a field in a oneof.
func fieldOneofType(field *protogen.Field) protogen.GoIdent {
ident := protogen.GoIdent{
GoImportPath: field.ParentMessage.GoIdent.GoImportPath,
GoName: field.ParentMessage.GoIdent.GoName + "_" + field.GoName,
GoImportPath: field.Parent.GoIdent.GoImportPath,
GoName: field.Parent.GoIdent.GoName + "_" + field.GoName,
}
// Check for collisions with nested messages or enums.
//
@ -853,13 +853,13 @@ func fieldOneofType(field *protogen.Field) protogen.GoIdent {
// field and type names in mostly unpredictable ways.
Loop:
for {
for _, message := range field.ParentMessage.Messages {
for _, message := range field.Parent.Messages {
if message.GoIdent == ident {
ident.GoName += "_"
continue Loop
}
}
for _, enum := range field.ParentMessage.Enums {
for _, enum := range field.Parent.Enums {
if enum.GoIdent == ident {
ident.GoName += "_"
continue Loop

View File

@ -82,7 +82,7 @@ func genReflectFileDescriptor(gen *protogen.Plugin, g *protogen.GeneratedFile, f
}
for _, extension := range f.allExtensions {
source := string(extension.Desc.FullName())
genMessage(extension.ExtendedType, source+":extendee")
genMessage(extension.Extendee, source+":extendee")
}
for _, message := range f.allMessages {
for _, field := range message.Fields {
@ -90,20 +90,20 @@ func genReflectFileDescriptor(gen *protogen.Plugin, g *protogen.GeneratedFile, f
continue
}
source := string(field.Desc.FullName())
genEnum(field.EnumType, source+":type_name")
genMessage(field.MessageType, source+":type_name")
genEnum(field.Enum, source+":type_name")
genMessage(field.Message, source+":type_name")
}
}
for _, extension := range f.allExtensions {
source := string(extension.Desc.FullName())
genEnum(extension.EnumType, source+":type_name")
genMessage(extension.MessageType, source+":type_name")
genEnum(extension.Enum, source+":type_name")
genMessage(extension.Message, source+":type_name")
}
for _, service := range f.Services {
for _, method := range service.Methods {
source := string(method.Desc.FullName())
genMessage(method.InputType, source+":input_type")
genMessage(method.OutputType, source+":output_type")
genMessage(method.Input, source+":input_type")
genMessage(method.Output, source+":output_type")
}
}
if len(depIdxs) > math.MaxInt32 {

View File

@ -125,7 +125,7 @@ func setList(list pref.List, fd pref.FieldDescriptor, level int) {
}
func setMap(mmap pref.Map, fd pref.FieldDescriptor, level int) {
fields := fd.MessageType().Fields()
fields := fd.Message().Fields()
keyDesc := fields.ByNumber(1)
valDesc := fields.ByNumber(2)

View File

@ -242,7 +242,7 @@ Loop:
}
} else {
// If field is a oneof, check if it has already been set.
if od := fd.OneofType(); od != nil {
if od := fd.Oneof(); od != nil {
idx := uint64(od.Index())
if seenOneofs.Has(idx) {
return errors.New("%v: oneof is already set", od.FullName())
@ -276,12 +276,12 @@ func (o UnmarshalOptions) findExtension(xtName pref.FullName) (pref.ExtensionTyp
}
func isKnownValue(fd pref.FieldDescriptor) bool {
md := fd.MessageType()
md := fd.Message()
return md != nil && md.FullName() == "google.protobuf.Value"
}
func isNullValue(fd pref.FieldDescriptor) bool {
ed := fd.EnumType()
ed := fd.Enum()
return ed != nil && ed.FullName() == "google.protobuf.NullValue"
}
@ -506,7 +506,7 @@ func unmarshalEnum(jval json.Value, fd pref.FieldDescriptor) (pref.Value, error)
case json.String:
// Lookup EnumNumber based on name.
s := jval.String()
if enumVal := fd.EnumType().Values().ByName(pref.Name(s)); enumVal != nil {
if enumVal := fd.Enum().Values().ByName(pref.Name(s)); enumVal != nil {
return pref.ValueOf(enumVal.Number()), nil
}
return pref.Value{}, newError("invalid enum value %q", jval)
@ -602,7 +602,7 @@ func (o UnmarshalOptions) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) e
return unexpectedJSONError{jval}
}
fields := fd.MessageType().Fields()
fields := fd.Message().Fields()
keyDesc := fields.ByNumber(1)
valDesc := fields.ByNumber(2)

View File

@ -178,19 +178,16 @@ func (o MarshalOptions) marshalSingular(val pref.Value, fd pref.FieldDescriptor)
}
case pref.EnumKind:
enumType := fd.EnumType()
num := val.Enum()
if enumType.FullName() == "google.protobuf.NullValue" {
if fd.Enum().FullName() == "google.protobuf.NullValue" {
o.encoder.WriteNull()
} else if desc := enumType.Values().ByNumber(num); desc != nil {
} else if desc := fd.Enum().Values().ByNumber(val.Enum()); desc != nil {
err := o.encoder.WriteString(string(desc.Name()))
if !nerr.Merge(err) {
return err
}
} else {
// Use numeric value if there is no enum value descriptor.
o.encoder.WriteInt(int64(num))
o.encoder.WriteInt(int64(val.Enum()))
}
case pref.MessageKind, pref.GroupKind:
@ -229,7 +226,7 @@ func (o MarshalOptions) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) error
o.encoder.StartObject()
defer o.encoder.EndObject()
msgFields := fd.MessageType().Fields()
msgFields := fd.Message().Fields()
keyType := msgFields.ByNumber(1)
valType := msgFields.ByNumber(2)
@ -286,7 +283,7 @@ func (o MarshalOptions) marshalExtensions(knownFields pref.KnownFields) error {
name := xt.FullName()
// If extended type is a MessageSet, set field name to be the message type name.
if isMessageSetExtension(xt) {
name = xt.MessageType().FullName()
name = xt.Message().FullName()
}
num := xt.Number()
@ -328,13 +325,13 @@ func isMessageSetExtension(xt pref.ExtensionType) bool {
if xt.Name() != "message_set_extension" {
return false
}
mt := xt.MessageType()
if mt == nil {
md := xt.Message()
if md == nil {
return false
}
if xt.FullName().Parent() != mt.FullName() {
if xt.FullName().Parent() != md.FullName() {
return false
}
xmt, ok := xt.ExtendedType().(interface{ IsMessageSet() bool })
return ok && xmt.IsMessageSet()
xmd, ok := xt.Extendee().(interface{ IsMessageSet() bool })
return ok && xmd.IsMessageSet()
}

View File

@ -164,7 +164,7 @@ func (o UnmarshalOptions) unmarshalMessage(tmsg [][2]text.Value, m pref.Message)
}
} else {
// If field is a oneof, check if it has already been set.
if od := fd.OneofType(); od != nil {
if od := fd.Oneof(); od != nil {
idx := uint64(od.Index())
if seenOneofs.Has(idx) {
return errors.New("oneof %v is already set", od.FullName())
@ -313,7 +313,7 @@ func unmarshalScalar(input text.Value, fd pref.FieldDescriptor) (pref.Value, err
}
if name, ok := input.Name(); ok {
// Lookup EnumNumber based on name.
if enumVal := fd.EnumType().Values().ByName(name); enumVal != nil {
if enumVal := fd.Enum().Values().ByName(name); enumVal != nil {
return pref.ValueOf(enumVal.Number()), nil
}
}
@ -356,7 +356,7 @@ func (o UnmarshalOptions) unmarshalList(inputList []text.Value, fd pref.FieldDes
// unmarshalMap unmarshals given []text.Value into given protoreflect.Map.
func (o UnmarshalOptions) unmarshalMap(input []text.Value, fd pref.FieldDescriptor, mmap pref.Map) error {
var nerr errors.NonFatal
fields := fd.MessageType().Fields()
fields := fd.Message().Fields()
keyDesc := fields.ByNumber(1)
valDesc := fields.ByNumber(2)

View File

@ -101,7 +101,7 @@ func (o MarshalOptions) marshalMessage(m pref.Message) (text.Value, error) {
name := text.ValueOf(fd.Name())
// Use type name for group field name.
if fd.Kind() == pref.GroupKind {
name = text.ValueOf(fd.MessageType().Name())
name = text.ValueOf(fd.Message().Name())
}
pval := knownFields.Get(num)
var err error
@ -189,7 +189,7 @@ func (o MarshalOptions) marshalSingular(val pref.Value, fd pref.FieldDescriptor)
case pref.EnumKind:
num := val.Enum()
if desc := fd.EnumType().Values().ByNumber(num); desc != nil {
if desc := fd.Enum().Values().ByNumber(num); desc != nil {
return text.ValueOf(desc.Name()), nil
}
// Use numeric value if there is no enum description.
@ -231,7 +231,7 @@ func (o MarshalOptions) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) ([]te
var nerr errors.NonFatal
// values is a list of messages.
values := make([]text.Value, 0, mmap.Len())
msgFields := fd.MessageType().Fields()
msgFields := fd.Message().Fields()
keyType := msgFields.ByNumber(1)
valType := msgFields.ByNumber(2)
@ -274,7 +274,7 @@ func (o MarshalOptions) appendExtensions(msgFields [][2]text.Value, knownFields
name := xt.FullName()
// If extended type is a MessageSet, set field name to be the message type name.
if isMessageSetExtension(xt) {
name = xt.MessageType().FullName()
name = xt.Message().FullName()
}
num := xt.Number()
@ -306,15 +306,15 @@ func isMessageSetExtension(xt pref.ExtensionType) bool {
if xt.Name() != "message_set_extension" {
return false
}
mt := xt.MessageType()
if mt == nil {
md := xt.Message()
if md == nil {
return false
}
if xt.FullName().Parent() != mt.FullName() {
if xt.FullName().Parent() != md.FullName() {
return false
}
xmt, ok := xt.ExtendedType().(interface{ IsMessageSet() bool })
return ok && xmt.IsMessageSet()
xmd, ok := xt.Extendee().(interface{ IsMessageSet() bool })
return ok && xmd.IsMessageSet()
}
// appendUnknown parses the given []byte and appends field(s) into the given fields slice.

View File

@ -234,9 +234,9 @@ func generateFieldNumbers(gen *protogen.Plugin, file *protogen.File) {
typeName := fd.Kind().String()
switch fd.Kind() {
case protoreflect.EnumKind:
typeName = string(fd.EnumType().FullName())
typeName = string(fd.Enum().FullName())
case protoreflect.MessageKind, protoreflect.GroupKind:
typeName = string(fd.MessageType().FullName())
typeName = string(fd.Message().FullName())
}
g.P(message.GoIdent.GoName, "_", field.GoName, "=", fd.Number(), "// ", fd.Cardinality(), " ", typeName)
}

View File

@ -325,7 +325,7 @@ func (p *parser) parseMessage(msgDesc protoreflect.MessageDescriptor, group bool
kind = fieldDesc.Kind()
switch kind {
case protoreflect.MessageKind, protoreflect.GroupKind:
subDesc = fieldDesc.MessageType()
subDesc = fieldDesc.Message()
if subDesc == nil || subDesc.IsPlaceholder() {
kind = 0
}

View File

@ -166,7 +166,7 @@ func Marshal(fd pref.FieldDescriptor, enumName string) string {
// The name of the FieldDescriptor for a group field is
// lowercased. To find the original capitalization, we
// look in the field's MessageType.
name = string(fd.MessageType().Name())
name = string(fd.Message().Name())
}
tag = append(tag, "name="+name)
if jsonName := fd.JSONName(); jsonName != "" && jsonName != name {
@ -175,13 +175,13 @@ func Marshal(fd pref.FieldDescriptor, enumName string) string {
// 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 fd.Syntax() == pref.Proto3 && fd.ExtendedType() == nil {
if fd.Syntax() == pref.Proto3 && fd.Extendee() == nil {
tag = append(tag, "proto3")
}
if fd.Kind() == pref.EnumKind && enumName != "" {
tag = append(tag, "enum="+enumName)
}
if fd.OneofType() != nil {
if fd.Oneof() != nil {
tag = append(tag, "oneof")
}
// This must appear last in the tag, since commas in strings aren't escaped.

View File

@ -439,13 +439,19 @@ func (fd *fieldDesc) IsMap() bool { return fd.isM
func (fd *fieldDesc) HasDefault() bool { return fd.defVal.has }
func (fd *fieldDesc) Default() pref.Value { return fd.defVal.get() }
func (fd *fieldDesc) DefaultEnumValue() pref.EnumValueDescriptor { return fd.defVal.enum }
func (fd *fieldDesc) OneofType() pref.OneofDescriptor { return fd.oneofType }
func (fd *fieldDesc) ExtendedType() pref.MessageDescriptor { return nil }
func (fd *fieldDesc) EnumType() pref.EnumDescriptor { return fd.enumType }
func (fd *fieldDesc) MessageType() pref.MessageDescriptor { return fd.messageType }
func (fd *fieldDesc) Oneof() pref.OneofDescriptor { return fd.oneofType }
func (fd *fieldDesc) Extendee() pref.MessageDescriptor { return nil }
func (fd *fieldDesc) Enum() pref.EnumDescriptor { return fd.enumType }
func (fd *fieldDesc) Message() pref.MessageDescriptor { return fd.messageType }
func (fd *fieldDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, fd) }
func (fd *fieldDesc) ProtoType(pref.FieldDescriptor) {}
// TODO: Remove these methods.
func (fd *fieldDesc) OneofType() pref.OneofDescriptor { return fd.Oneof() }
func (fd *fieldDesc) ExtendedType() pref.MessageDescriptor { return fd.Extendee() }
func (fd *fieldDesc) EnumType() pref.EnumDescriptor { return fd.Enum() }
func (fd *fieldDesc) MessageType() pref.MessageDescriptor { return fd.Message() }
func (od *oneofDesc) Options() pref.ProtoMessage {
return unmarshalOptions(descopts.Oneof, od.options)
}
@ -506,10 +512,10 @@ func (xd *extensionDesc) IsMap() bool { return fa
func (xd *extensionDesc) HasDefault() bool { return xd.lazyInit().defVal.has }
func (xd *extensionDesc) Default() pref.Value { return xd.lazyInit().defVal.get() }
func (xd *extensionDesc) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().defVal.enum }
func (xd *extensionDesc) OneofType() pref.OneofDescriptor { return nil }
func (xd *extensionDesc) ExtendedType() pref.MessageDescriptor { return xd.extendedType }
func (xd *extensionDesc) EnumType() pref.EnumDescriptor { return xd.lazyInit().enumType }
func (xd *extensionDesc) MessageType() pref.MessageDescriptor { return xd.lazyInit().messageType }
func (xd *extensionDesc) Oneof() pref.OneofDescriptor { return nil }
func (xd *extensionDesc) Extendee() pref.MessageDescriptor { return xd.extendedType }
func (xd *extensionDesc) Enum() pref.EnumDescriptor { return xd.lazyInit().enumType }
func (xd *extensionDesc) Message() pref.MessageDescriptor { return xd.lazyInit().messageType }
func (xd *extensionDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, xd) }
func (xd *extensionDesc) ProtoType(pref.FieldDescriptor) {}
func (xd *extensionDesc) ProtoInternal(pragma.DoNotImplement) {}
@ -527,6 +533,12 @@ func (xd *extensionDesc) ProtoLegacyExtensionDesc() *piface.ExtensionDescV1 {
return xd.legacyDesc
}
// TODO: Remove these methods.
func (xd *extensionDesc) OneofType() pref.OneofDescriptor { return xd.Oneof() }
func (xd *extensionDesc) ExtendedType() pref.MessageDescriptor { return xd.Extendee() }
func (xd *extensionDesc) EnumType() pref.EnumDescriptor { return xd.Enum() }
func (xd *extensionDesc) MessageType() pref.MessageDescriptor { return xd.Message() }
type (
serviceDesc struct {
baseDesc
@ -563,14 +575,18 @@ func (sd *serviceDesc) lazyInit() *serviceLazy {
func (md *methodDesc) Options() pref.ProtoMessage {
return unmarshalOptions(descopts.Method, md.options)
}
func (md *methodDesc) InputType() pref.MessageDescriptor { return md.inputType }
func (md *methodDesc) OutputType() pref.MessageDescriptor { return md.outputType }
func (md *methodDesc) Input() pref.MessageDescriptor { return md.inputType }
func (md *methodDesc) Output() pref.MessageDescriptor { return md.outputType }
func (md *methodDesc) IsStreamingClient() bool { return md.isStreamingClient }
func (md *methodDesc) IsStreamingServer() bool { return md.isStreamingServer }
func (md *methodDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, md) }
func (md *methodDesc) ProtoType(pref.MethodDescriptor) {}
func (md *methodDesc) ProtoInternal(pragma.DoNotImplement) {}
// TODO: Remove these methods.
func (md *methodDesc) InputType() pref.MessageDescriptor { return md.Input() }
func (md *methodDesc) OutputType() pref.MessageDescriptor { return md.Output() }
type baseDesc struct {
parentFile *fileDesc
parent pref.Descriptor

View File

@ -70,7 +70,7 @@ func TestInit(t *testing.T) {
// Verify that message descriptors for map entries have no Go type info.
mapEntryName := protoreflect.FullName("goproto.proto.test.TestAllTypes.MapInt32Int32Entry")
d := testpb.File_test_test_proto.Messages().ByName("TestAllTypes").Fields().ByName("map_int32_int32").MessageType()
d := testpb.File_test_test_proto.Messages().ByName("TestAllTypes").Fields().ByName("map_int32_int32").Message()
if gotName, wantName := d.FullName(), mapEntryName; gotName != wantName {
t.Fatalf("looked up wrong descriptor: got %v, want %v", gotName, wantName)
}

View File

@ -149,7 +149,7 @@ func (p legacyExtensionTypes) Len() (n int) {
}
func (p legacyExtensionTypes) Register(t pref.ExtensionType) {
if p.mi.PBType.FullName() != t.ExtendedType().FullName() {
if p.mi.PBType.FullName() != t.Extendee().FullName() {
panic("extended type mismatch")
}
if !p.mi.PBType.ExtensionRanges().Has(t.Number()) {

View File

@ -769,7 +769,7 @@ func TestExtensionConvert(t *testing.T) {
// Ignore New since it a constructor.
case "Options":
// Ignore descriptor options since protos are not cmperable.
case "EnumType", "MessageType", "ExtendedType":
case "Oneof", "Extendee", "Enum", "Message":
// Avoid descending into a dependency to avoid a cycle.
// Just record the full name if available.
//
@ -778,6 +778,12 @@ func TestExtensionConvert(t *testing.T) {
if !v.IsNil() {
out[name] = v.Interface().(pref.Descriptor).FullName()
}
// TODO: Remove this when the methods are deleted.
case "OneofType", "ExtendedType", "EnumType", "MessageType":
v := m.Call(nil)[0]
if !v.IsNil() {
out[name] = v.Interface().(pref.Descriptor).FullName()
}
default:
out[name] = m.Call(nil)[0].Interface()
}

View File

@ -115,8 +115,8 @@ fieldLoop:
switch {
case fd.IsWeak():
fi = fieldInfoForWeak(fd, specialByName["XXX_weak"])
case fd.OneofType() != nil:
fi = fieldInfoForOneof(fd, oneofsByName[fd.OneofType().Name()], oneofWrappersByNumber[fd.Number()])
case fd.Oneof() != nil:
fi = fieldInfoForOneof(fd, oneofsByName[fd.Oneof().Name()], oneofWrappersByNumber[fd.Number()])
case fd.IsMap():
fi = fieldInfoForMap(fd, fs)
case fd.Cardinality() == pref.Repeated:

View File

@ -98,8 +98,8 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField) fieldInfo
if ft.Kind() != reflect.Map {
panic(fmt.Sprintf("invalid type: got %v, want map kind", ft))
}
keyConv := pvalue.NewLegacyConverter(ft.Key(), fd.MessageType().Fields().ByNumber(1).Kind(), legacyWrapper)
valConv := pvalue.NewLegacyConverter(ft.Elem(), fd.MessageType().Fields().ByNumber(2).Kind(), legacyWrapper)
keyConv := pvalue.NewLegacyConverter(ft.Key(), fd.Message().Fields().ByNumber(1).Kind(), legacyWrapper)
valConv := pvalue.NewLegacyConverter(ft.Elem(), fd.Message().Fields().ByNumber(2).Kind(), legacyWrapper)
fieldOffset := offsetOf(fs)
// TODO: Implement unsafe fast path?
return fieldInfo{

View File

@ -64,7 +64,7 @@ func extensionDescFromType(t pref.ExtensionType) *piface.ExtensionDescV1 {
// Determine the parent type if possible.
var parent piface.MessageV1
if mt, ok := t.ExtendedType().(pref.MessageType); ok {
if mt, ok := t.Extendee().(pref.MessageType); ok {
// Create a new parent message and unwrap it if possible.
mv := mt.New().Interface()
t := reflect.TypeOf(mv)
@ -97,7 +97,7 @@ func extensionDescFromType(t pref.ExtensionType) *piface.ExtensionDescV1 {
if t.Kind() == pref.EnumKind {
// Derive Go type name.
// For legacy enums, unwrap the wrapper to get the underlying Go type.
et := t.EnumType().(pref.EnumType)
et := t.Enum().(pref.EnumType)
var ev interface{} = et.New(0)
if u, ok := ev.(pvalue.Unwrapper); ok {
ev = u.ProtoUnwrap()

View File

@ -431,7 +431,7 @@ func TestDescriptor(t *testing.T) {
case "HasJSONName":
// Ignore this since the semantics of the field has
// changed across protoc and protoc-gen-go releases.
case "OneofType", "ExtendedType", "EnumType", "MessageType":
case "Oneof", "Extendee", "Enum", "Message":
// Avoid descending into a dependency to avoid a cycle.
// Just record the full name if available.
//
@ -440,6 +440,12 @@ func TestDescriptor(t *testing.T) {
if !v.IsNil() {
out[name] = v.Interface().(pref.Descriptor).FullName()
}
// TODO: Remove this when the methods are deleted.
case "OneofType", "ExtendedType", "EnumType", "MessageType":
v := m.Call(nil)[0]
if !v.IsNil() {
out[name] = v.Interface().(pref.Descriptor).FullName()
}
default:
out[name] = m.Call(nil)[0].Interface()
}

View File

@ -55,24 +55,24 @@ func TestConcurrentInit(t *testing.T) {
var (
wantMTA = messageATypes[0]
wantMDA = messageATypes[0].Fields().ByNumber(1).MessageType()
wantMDA = messageATypes[0].Fields().ByNumber(1).Message()
wantMTB = messageBTypes[0]
wantMDB = messageBTypes[0].Fields().ByNumber(2).MessageType()
wantMDB = messageBTypes[0].Fields().ByNumber(2).Message()
wantET = enumTypes[0]
wantED = messageATypes[0].Fields().ByNumber(3).EnumType()
wantED = messageATypes[0].Fields().ByNumber(3).Enum()
)
for _, gotMT := range messageATypes[1:] {
if gotMT != wantMTA {
t.Error("MessageType(MessageA) mismatch")
}
if gotMDA := gotMT.Fields().ByNumber(1).MessageType(); gotMDA != wantMDA {
if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
t.Error("MessageDescriptor(MessageA) mismatch")
}
if gotMDB := gotMT.Fields().ByNumber(2).MessageType(); gotMDB != wantMDB {
if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
t.Error("MessageDescriptor(MessageB) mismatch")
}
if gotED := gotMT.Fields().ByNumber(3).EnumType(); gotED != wantED {
if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
t.Error("EnumDescriptor(Enum) mismatch")
}
}
@ -80,13 +80,13 @@ func TestConcurrentInit(t *testing.T) {
if gotMT != wantMTB {
t.Error("MessageType(MessageB) mismatch")
}
if gotMDA := gotMT.Fields().ByNumber(1).MessageType(); gotMDA != wantMDA {
if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
t.Error("MessageDescriptor(MessageA) mismatch")
}
if gotMDB := gotMT.Fields().ByNumber(2).MessageType(); gotMDB != wantMDB {
if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
t.Error("MessageDescriptor(MessageB) mismatch")
}
if gotED := gotMT.Fields().ByNumber(3).EnumType(); gotED != wantED {
if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
t.Error("EnumDescriptor(Enum) mismatch")
}
}

View File

@ -118,12 +118,12 @@ func (t *goMessage) Format(s fmt.State, r rune) {
// The type M is the concrete message type returned by NewMessage,
// which is often, but not required to be, a pointer to a named struct type.
func GoExtension(xd protoreflect.ExtensionDescriptor, et protoreflect.EnumType, mt protoreflect.MessageType) protoreflect.ExtensionType {
if xd.ExtendedType() == nil {
if xd.Extendee() == nil {
panic("field descriptor does not extend a message")
}
switch xd.Kind() {
case protoreflect.EnumKind:
if et2, ok := xd.EnumType().(protoreflect.EnumType); ok && et == nil {
if et2, ok := xd.Enum().(protoreflect.EnumType); ok && et == nil {
et = et2
}
if et == nil {
@ -133,7 +133,7 @@ func GoExtension(xd protoreflect.ExtensionDescriptor, et protoreflect.EnumType,
panic("message type provided for enum kind")
}
case protoreflect.MessageKind, protoreflect.GroupKind:
if mt2, ok := xd.MessageType().(protoreflect.MessageType); ok && mt == nil {
if mt2, ok := xd.Message().(protoreflect.MessageType); ok && mt == nil {
mt = mt2
}
if et != nil {

View File

@ -101,11 +101,11 @@ type oneofFields oneofFieldsMeta
func (p *oneofFieldsMeta) lazyInit(parent pref.Descriptor) *oneofFields {
p.once.Do(func() {
otyp := parent.(pref.OneofDescriptor)
mtyp, _ := parent.Parent()
fs := mtyp.(pref.MessageDescriptor).Fields()
od := parent.(pref.OneofDescriptor)
md, _ := parent.Parent()
fs := md.(pref.MessageDescriptor).Fields()
for i := 0; i < fs.Len(); i++ {
if f := fs.Get(i); otyp == f.OneofType() {
if f := fs.Get(i); od == f.Oneof() {
p.typs = append(p.typs, f)
}
}

View File

@ -160,20 +160,26 @@ func (t fieldDesc) IsPacked() bool {
}
func (t fieldDesc) IsWeak() bool { return t.f.IsWeak }
func (t fieldDesc) IsMap() bool {
mt := t.MessageType()
mt := t.Message()
return mt != nil && mt.IsMapEntry()
}
func (t fieldDesc) HasDefault() bool { return t.f.Default.IsValid() }
func (t fieldDesc) Default() pref.Value { return t.f.dv.value(t, t.f.Default) }
func (t fieldDesc) DefaultEnumValue() pref.EnumValueDescriptor { return t.f.dv.enum(t, t.f.Default) }
func (t fieldDesc) OneofType() pref.OneofDescriptor { return t.f.ot.lazyInit(t, t.f.OneofName) }
func (t fieldDesc) ExtendedType() pref.MessageDescriptor { return nil }
func (t fieldDesc) MessageType() pref.MessageDescriptor { return t.f.mt.lazyInit(t, &t.f.MessageType) }
func (t fieldDesc) EnumType() pref.EnumDescriptor { return t.f.et.lazyInit(t, &t.f.EnumType) }
func (t fieldDesc) Oneof() pref.OneofDescriptor { return t.f.ot.lazyInit(t, t.f.OneofName) }
func (t fieldDesc) Extendee() pref.MessageDescriptor { return nil }
func (t fieldDesc) Enum() pref.EnumDescriptor { return t.f.et.lazyInit(t, &t.f.EnumType) }
func (t fieldDesc) Message() pref.MessageDescriptor { return t.f.mt.lazyInit(t, &t.f.MessageType) }
func (t fieldDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, t) }
func (t fieldDesc) ProtoType(pref.FieldDescriptor) {}
func (t fieldDesc) ProtoInternal(pragma.DoNotImplement) {}
// TODO: Remove these methods.
func (t fieldDesc) OneofType() pref.OneofDescriptor { return t.Oneof() }
func (t fieldDesc) ExtendedType() pref.MessageDescriptor { return t.Extendee() }
func (t fieldDesc) EnumType() pref.EnumDescriptor { return t.Enum() }
func (t fieldDesc) MessageType() pref.MessageDescriptor { return t.Message() }
func isPacked(packed OptionalBool, s pref.Syntax, c pref.Cardinality, k pref.Kind) bool {
if packed == False || (packed == DefaultBool && s == pref.Proto2) {
return false
@ -289,17 +295,19 @@ func (t extensionDesc) IsMap() bool { return fals
func (t extensionDesc) HasDefault() bool { return t.x.Default.IsValid() }
func (t extensionDesc) Default() pref.Value { return t.x.dv.value(t, t.x.Default) }
func (t extensionDesc) DefaultEnumValue() pref.EnumValueDescriptor { return t.x.dv.enum(t, t.x.Default) }
func (t extensionDesc) OneofType() pref.OneofDescriptor { return nil }
func (t extensionDesc) ExtendedType() pref.MessageDescriptor {
return t.x.xt.lazyInit(t, &t.x.ExtendedType)
}
func (t extensionDesc) MessageType() pref.MessageDescriptor {
return t.x.mt.lazyInit(t, &t.x.MessageType)
}
func (t extensionDesc) EnumType() pref.EnumDescriptor { return t.x.et.lazyInit(t, &t.x.EnumType) }
func (t extensionDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, t) }
func (t extensionDesc) ProtoType(pref.FieldDescriptor) {}
func (t extensionDesc) ProtoInternal(pragma.DoNotImplement) {}
func (t extensionDesc) Oneof() pref.OneofDescriptor { return nil }
func (t extensionDesc) Extendee() pref.MessageDescriptor { return t.x.xt.lazyInit(t, &t.x.ExtendedType) }
func (t extensionDesc) Enum() pref.EnumDescriptor { return t.x.et.lazyInit(t, &t.x.EnumType) }
func (t extensionDesc) Message() pref.MessageDescriptor { return t.x.mt.lazyInit(t, &t.x.MessageType) }
func (t extensionDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, t) }
func (t extensionDesc) ProtoType(pref.FieldDescriptor) {}
func (t extensionDesc) ProtoInternal(pragma.DoNotImplement) {}
// TODO: Remove these methods.
func (t extensionDesc) OneofType() pref.OneofDescriptor { return t.Oneof() }
func (t extensionDesc) ExtendedType() pref.MessageDescriptor { return t.Extendee() }
func (t extensionDesc) EnumType() pref.EnumDescriptor { return t.Enum() }
func (t extensionDesc) MessageType() pref.MessageDescriptor { return t.Message() }
type enumMeta struct {
inheritedMeta
@ -377,14 +385,18 @@ func (t methodDesc) Name() pref.Name { return t.m.Name }
func (t methodDesc) FullName() pref.FullName { return t.m.fullName }
func (t methodDesc) IsPlaceholder() bool { return false }
func (t methodDesc) Options() pref.ProtoMessage { return altOptions(t.m.Options, descopts.Method) }
func (t methodDesc) InputType() pref.MessageDescriptor { return t.m.mit.lazyInit(t, &t.m.InputType) }
func (t methodDesc) OutputType() pref.MessageDescriptor { return t.m.mot.lazyInit(t, &t.m.OutputType) }
func (t methodDesc) Input() pref.MessageDescriptor { return t.m.mit.lazyInit(t, &t.m.InputType) }
func (t methodDesc) Output() pref.MessageDescriptor { return t.m.mot.lazyInit(t, &t.m.OutputType) }
func (t methodDesc) IsStreamingClient() bool { return t.m.IsStreamingClient }
func (t methodDesc) IsStreamingServer() bool { return t.m.IsStreamingServer }
func (t methodDesc) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, t) }
func (t methodDesc) ProtoType(pref.MethodDescriptor) {}
func (t methodDesc) ProtoInternal(pragma.DoNotImplement) {}
// TODO: Remove these methods.
func (t methodDesc) InputType() pref.MessageDescriptor { return t.Input() }
func (t methodDesc) OutputType() pref.MessageDescriptor { return t.Output() }
type defaultValue struct {
once sync.Once
val pref.Value
@ -417,12 +429,12 @@ func (p *defaultValue) lazyInit(t pref.FieldDescriptor, v pref.Value) {
// default value for an enum value is the wrong type.
switch v := v.Interface().(type) {
case string:
if ev := t.EnumType().Values().ByName(pref.Name(v)); ev != nil {
if ev := t.Enum().Values().ByName(pref.Name(v)); ev != nil {
p.eval = ev
p.val = pref.ValueOf(p.eval.Number())
}
case pref.EnumNumber:
p.eval = t.EnumType().Values().ByNumber(v)
p.eval = t.Enum().Values().ByNumber(v)
}
case pref.BytesKind:
// Store a copy of the default bytes, so that we can detect
@ -455,8 +467,8 @@ func (p *defaultValue) lazyInit(t pref.FieldDescriptor, v pref.Value) {
case pref.EnumKind:
p.val = zeroEnum
if t.Syntax() == pref.Proto2 {
if et := t.EnumType(); et != nil {
if vs := et.Values(); vs.Len() > 0 {
if ed := t.Enum(); ed != nil {
if vs := ed.Values(); vs.Len() > 0 {
p.val = pref.ValueOf(vs.Get(0).Number())
}
}

View File

@ -89,10 +89,16 @@ func (t standaloneExtension) Default() pref.Value { return t.x.dv.value(t, t.x.D
func (t standaloneExtension) DefaultEnumValue() pref.EnumValueDescriptor {
return t.x.dv.enum(t, t.x.Default)
}
func (t standaloneExtension) OneofType() pref.OneofDescriptor { return nil }
func (t standaloneExtension) MessageType() pref.MessageDescriptor { return t.x.MessageType }
func (t standaloneExtension) EnumType() pref.EnumDescriptor { return t.x.EnumType }
func (t standaloneExtension) ExtendedType() pref.MessageDescriptor { return t.x.ExtendedType }
func (t standaloneExtension) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, t) }
func (t standaloneExtension) ProtoType(pref.FieldDescriptor) {}
func (t standaloneExtension) ProtoInternal(pragma.DoNotImplement) {}
func (t standaloneExtension) Oneof() pref.OneofDescriptor { return nil }
func (t standaloneExtension) Extendee() pref.MessageDescriptor { return t.x.ExtendedType }
func (t standaloneExtension) Enum() pref.EnumDescriptor { return t.x.EnumType }
func (t standaloneExtension) Message() pref.MessageDescriptor { return t.x.MessageType }
func (t standaloneExtension) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, t) }
func (t standaloneExtension) ProtoType(pref.FieldDescriptor) {}
func (t standaloneExtension) ProtoInternal(pragma.DoNotImplement) {}
// TODO: Remove these methods.
func (t standaloneExtension) OneofType() pref.OneofDescriptor { return t.Oneof() }
func (t standaloneExtension) ExtendedType() pref.MessageDescriptor { return t.Extendee() }
func (t standaloneExtension) EnumType() pref.EnumDescriptor { return t.Enum() }
func (t standaloneExtension) MessageType() pref.MessageDescriptor { return t.Message() }

View File

@ -391,42 +391,42 @@ func testFileAccessors(t *testing.T, fd pref.FileDescriptor) {
"Fields": M{
"Len": 2,
"ByNumber:1": M{
"Parent": M{"FullName": pref.FullName("test.A")},
"Index": 0,
"Name": pref.Name("key"),
"FullName": pref.FullName("test.A.key"),
"Number": pref.FieldNumber(1),
"Cardinality": pref.Optional,
"Kind": pref.StringKind,
"Options": &descriptorpb.FieldOptions{Deprecated: scalar.Bool(true)},
"HasJSONName": false,
"JSONName": "key",
"IsPacked": false,
"IsMap": false,
"IsWeak": false,
"Default": "",
"OneofType": nil,
"ExtendedType": nil,
"MessageType": nil,
"EnumType": nil,
"Parent": M{"FullName": pref.FullName("test.A")},
"Index": 0,
"Name": pref.Name("key"),
"FullName": pref.FullName("test.A.key"),
"Number": pref.FieldNumber(1),
"Cardinality": pref.Optional,
"Kind": pref.StringKind,
"Options": &descriptorpb.FieldOptions{Deprecated: scalar.Bool(true)},
"HasJSONName": false,
"JSONName": "key",
"IsPacked": false,
"IsMap": false,
"IsWeak": false,
"Default": "",
"Oneof": nil,
"Extendee": nil,
"Message": nil,
"Enum": nil,
},
"ByNumber:2": M{
"Parent": M{"FullName": pref.FullName("test.A")},
"Index": 1,
"Name": pref.Name("value"),
"FullName": pref.FullName("test.A.value"),
"Number": pref.FieldNumber(2),
"Cardinality": pref.Optional,
"Kind": pref.MessageKind,
"JSONName": "value",
"IsPacked": false,
"IsMap": false,
"IsWeak": false,
"Default": nil,
"OneofType": nil,
"ExtendedType": nil,
"MessageType": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
"EnumType": nil,
"Parent": M{"FullName": pref.FullName("test.A")},
"Index": 1,
"Name": pref.Name("value"),
"FullName": pref.FullName("test.A.value"),
"Number": pref.FieldNumber(2),
"Cardinality": pref.Optional,
"Kind": pref.MessageKind,
"JSONName": "value",
"IsPacked": false,
"IsMap": false,
"IsWeak": false,
"Default": nil,
"Oneof": nil,
"Extendee": nil,
"Message": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
"Enum": nil,
},
"ByNumber:3": nil,
},
@ -444,11 +444,11 @@ func testFileAccessors(t *testing.T, fd pref.FileDescriptor) {
"Len": 6,
"ByJSONName:field_one": nil,
"ByJSONName:fieldOne": M{
"Name": pref.Name("field_one"),
"Index": 0,
"JSONName": "fieldOne",
"Default": "hello, \"world!\"\n",
"OneofType": M{"Name": pref.Name("O1"), "IsPlaceholder": false},
"Name": pref.Name("field_one"),
"Index": 0,
"JSONName": "fieldOne",
"Default": "hello, \"world!\"\n",
"Oneof": M{"Name": pref.Name("O1"), "IsPlaceholder": false},
},
"ByJSONName:fieldTwo": nil,
"ByJSONName:Field2": M{
@ -457,20 +457,20 @@ func testFileAccessors(t *testing.T, fd pref.FileDescriptor) {
"HasJSONName": true,
"JSONName": "Field2",
"Default": pref.EnumNumber(1),
"OneofType": M{"Name": pref.Name("O2"), "IsPlaceholder": false},
"Oneof": M{"Name": pref.Name("O2"), "IsPlaceholder": false},
},
"ByName:fieldThree": nil,
"ByName:field_three": M{
"IsMap": false,
"MessageType": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
"OneofType": M{"Name": pref.Name("O2"), "IsPlaceholder": false},
"IsMap": false,
"Message": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
"Oneof": M{"Name": pref.Name("O2"), "IsPlaceholder": false},
},
"ByNumber:12": nil,
"ByNumber:4": M{
"Cardinality": pref.Repeated,
"IsMap": true,
"Default": nil,
"MessageType": M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
"Message": M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
},
"ByNumber:5": M{
"Cardinality": pref.Repeated,
@ -481,7 +481,7 @@ func testFileAccessors(t *testing.T, fd pref.FileDescriptor) {
"ByNumber:6": M{
"Cardinality": pref.Required,
"Default": []byte(nil),
"OneofType": nil,
"Oneof": nil,
},
},
"Oneofs": M{
@ -601,14 +601,14 @@ func testFileAccessors(t *testing.T, fd pref.FileDescriptor) {
"Extensions": M{
"Len": 1,
"ByName:X": M{
"Name": pref.Name("X"),
"Number": pref.FieldNumber(1000),
"Cardinality": pref.Repeated,
"Kind": pref.MessageKind,
"IsPacked": false,
"MessageType": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
"ExtendedType": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
"Options": &descriptorpb.FieldOptions{Packed: scalar.Bool(true)},
"Name": pref.Name("X"),
"Number": pref.FieldNumber(1000),
"Cardinality": pref.Repeated,
"Kind": pref.MessageKind,
"IsPacked": false,
"Message": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
"Extendee": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
"Options": &descriptorpb.FieldOptions{Packed: scalar.Bool(true)},
},
},
"Services": M{
@ -625,8 +625,8 @@ func testFileAccessors(t *testing.T, fd pref.FileDescriptor) {
"Parent": M{"FullName": pref.FullName("test.S")},
"Name": pref.Name("M"),
"FullName": pref.FullName("test.S.M"),
"InputType": M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
"OutputType": M{"FullName": pref.FullName("test.C.A"), "IsPlaceholder": false},
"Input": M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
"Output": M{"FullName": pref.FullName("test.C.A"), "IsPlaceholder": false},
"IsStreamingClient": true,
"IsStreamingServer": true,
"Options": &descriptorpb.MethodOptions{Deprecated: scalar.Bool(true)},
@ -728,7 +728,7 @@ func testFileFormat(t *testing.T, fd pref.FileDescriptor) {
Cardinality: optional
Kind: message
JSONName: "value"
MessageType: test.B
Message: test.B
}]
}, {
Name: B
@ -740,7 +740,7 @@ func testFileFormat(t *testing.T, fd pref.FileDescriptor) {
JSONName: "fieldOne"
HasDefault: true
Default: "hello, \"world!\"\n"
OneofType: O1
Oneof: O1
}, {
Name: field_two
Number: 2
@ -750,16 +750,16 @@ func testFileFormat(t *testing.T, fd pref.FileDescriptor) {
JSONName: "Field2"
HasDefault: true
Default: 1
OneofType: O2
EnumType: test.E1
Oneof: O2
Enum: test.E1
}, {
Name: field_three
Number: 3
Cardinality: optional
Kind: message
JSONName: "fieldThree"
OneofType: O2
MessageType: test.C
Oneof: O2
Message: test.C
}, {
Name: field_four
Number: 4
@ -768,7 +768,7 @@ func testFileFormat(t *testing.T, fd pref.FileDescriptor) {
HasJSONName: true
JSONName: "Field4"
IsMap: true
MessageType: test.A
Message: test.A
}, {
Name: field_five
Number: 5
@ -817,12 +817,12 @@ func testFileFormat(t *testing.T, fd pref.FileDescriptor) {
]
}]
Extensions: [{
Name: X
Number: 1000
Cardinality: repeated
Kind: message
ExtendedType: test.B
MessageType: test.C
Name: X
Number: 1000
Cardinality: repeated
Kind: message
Extendee: test.B
Message: test.C
}]
}]
Enums: [{
@ -835,19 +835,19 @@ func testFileFormat(t *testing.T, fd pref.FileDescriptor) {
ReservedRanges: [10:20, 30]
}]
Extensions: [{
Name: X
Number: 1000
Cardinality: repeated
Kind: message
ExtendedType: test.B
MessageType: test.C
Name: X
Number: 1000
Cardinality: repeated
Kind: message
Extendee: test.B
Message: test.C
}]
Services: [{
Name: S
Methods: [{
Name: M
InputType: test.A
OutputType: test.C.A
Input: test.A
Output: test.C.A
IsStreamingClient: true
IsStreamingServer: true
}]

View File

@ -27,6 +27,14 @@ func TestDescriptorAccessors(t *testing.T) {
"DescriptorProto": true,
"ExtensionRangeOptions": true,
"Options": true,
// TODO: Remove these when the methods are removed.
"OneofType": true,
"ExtendedType": true,
"EnumType": true,
"MessageType": true,
"InputType": true,
"OutputType": true,
}
for rt, m := range descriptorAccessors {

View File

@ -106,12 +106,12 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string {
var descriptorAccessors = map[reflect.Type][]string{
reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"},
reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"},
reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "IsPacked", "IsMap", "IsWeak", "HasDefault", "Default", "OneofType", "ExtendedType", "MessageType", "EnumType"},
reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "IsPacked", "IsMap", "IsWeak", "HasDefault", "Default", "Oneof", "Extendee", "Message", "Enum"},
reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt
reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"},
reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"},
reflect.TypeOf((*pref.ServiceDescriptor)(nil)).Elem(): {"Methods"},
reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem(): {"InputType", "OutputType", "IsStreamingClient", "IsStreamingServer"},
reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"},
}
func FormatDesc(s fmt.State, r rune, t pref.Descriptor) {

View File

@ -118,7 +118,7 @@ func (o UnmarshalOptions) unmarshalScalarField(b []byte, wtyp wire.Type, num wir
// TODO: C++ merges into oneofs, while v1 does not.
// Evaluate which behavior to pick.
var m protoreflect.Message
if knownFields.Has(num) && field.OneofType() == nil {
if knownFields.Has(num) && field.Oneof() == nil {
m = knownFields.Get(num).Message()
} else {
m = knownFields.NewMessage(num)
@ -144,8 +144,8 @@ func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp wire.Type, num wire.Number
return 0, wire.ParseError(n)
}
var (
keyField = field.MessageType().Fields().ByNumber(1)
valField = field.MessageType().Fields().ByNumber(2)
keyField = field.Message().Fields().ByNumber(1)
valField = field.Message().Fields().ByNumber(2)
key protoreflect.Value
val protoreflect.Value
haveKey bool

View File

@ -184,7 +184,7 @@ func (o MarshalOptions) marshalField(b []byte, field protoreflect.FieldDescripto
b = wire.AppendTag(b, num, wireTypes[kind])
return o.marshalSingular(b, num, field, value)
case field.IsMap():
return o.marshalMap(b, num, kind, field.MessageType(), value.Map())
return o.marshalMap(b, num, kind, field.Message(), value.Map())
case field.IsPacked():
return o.marshalPacked(b, num, field, value.List())
default:

View File

@ -48,12 +48,12 @@ func isInitialized(m pref.Message, stack []interface{}) error {
}
// Look for fields containing a message: Messages, groups, and maps
// with a message or group value.
ft := field.MessageType()
if ft == nil {
md := field.Message()
if md == nil {
return true
}
if field.IsMap() {
if ft.Fields().ByNumber(2).MessageType() == nil {
if md.Fields().ByNumber(2).Message() == nil {
return true
}
}

View File

@ -61,7 +61,7 @@ func sizeField(field protoreflect.FieldDescriptor, value protoreflect.Value) (si
case field.Cardinality() != protoreflect.Repeated:
return wire.SizeTag(num) + sizeSingular(num, kind, value)
case field.IsMap():
return sizeMap(num, kind, field.MessageType(), value.Map())
return sizeMap(num, kind, field.Message(), value.Map())
case field.IsPacked():
return sizePacked(num, kind, value.List())
default:

View File

@ -582,12 +582,12 @@ func newMessage(gen *Plugin, f *File, parent *Message, desc protoreflect.Message
seenOneofs := make(map[int]bool)
for _, field := range message.Fields {
field.GoName = makeNameUnique(field.GoName, true)
if field.OneofType != nil {
if !seenOneofs[field.OneofType.Desc.Index()] {
if field.Oneof != nil {
if !seenOneofs[field.Oneof.Desc.Index()] {
// If this is a field in a oneof that we haven't seen before,
// make the name for that oneof unique as well.
field.OneofType.GoName = makeNameUnique(field.OneofType.GoName, false)
seenOneofs[field.OneofType.Desc.Index()] = true
field.Oneof.GoName = makeNameUnique(field.Oneof.GoName, false)
seenOneofs[field.Oneof.Desc.Index()] = true
}
}
}
@ -626,32 +626,32 @@ type Field struct {
// '{{GoName}}' and a getter method named 'Get{{GoName}}'.
GoName string
ParentMessage *Message // message in which this field is defined; nil if top-level extension
ExtendedType *Message // extended message for extension fields; nil otherwise
MessageType *Message // type for message or group fields; nil otherwise
EnumType *Enum // type for enum fields; nil otherwise
OneofType *Oneof // containing oneof; nil if not part of a oneof
Location Location // location of this field
Parent *Message // message in which this field is defined; nil if top-level extension
Oneof *Oneof // containing oneof; nil if not part of a oneof
Extendee *Message // extended message for extension fields; nil otherwise
Enum *Enum // type for enum fields; nil otherwise
Message *Message // type for message or group fields; nil otherwise
Location Location // location of this field
}
func newField(gen *Plugin, f *File, message *Message, desc protoreflect.FieldDescriptor) *Field {
var loc Location
switch {
case desc.ExtendedType() != nil && message == nil:
case desc.Extendee() != nil && message == nil:
loc = f.location(fieldnum.FileDescriptorProto_Extension, int32(desc.Index()))
case desc.ExtendedType() != nil && message != nil:
case desc.Extendee() != nil && message != nil:
loc = message.Location.appendPath(fieldnum.DescriptorProto_Extension, int32(desc.Index()))
default:
loc = message.Location.appendPath(fieldnum.DescriptorProto_Field, int32(desc.Index()))
}
field := &Field{
Desc: desc,
GoName: camelCase(string(desc.Name())),
ParentMessage: message,
Location: loc,
Desc: desc,
GoName: camelCase(string(desc.Name())),
Parent: message,
Location: loc,
}
if desc.OneofType() != nil {
field.OneofType = message.Oneofs[desc.OneofType().Index()]
if desc.Oneof() != nil {
field.Oneof = message.Oneofs[desc.Oneof().Index()]
}
return field
}
@ -663,27 +663,27 @@ func (field *Field) init(gen *Plugin) error {
desc := field.Desc
switch desc.Kind() {
case protoreflect.MessageKind, protoreflect.GroupKind:
mname := desc.MessageType().FullName()
mname := desc.Message().FullName()
message, ok := gen.messagesByName[mname]
if !ok {
return fmt.Errorf("field %v: no descriptor for type %v", desc.FullName(), mname)
}
field.MessageType = message
field.Message = message
case protoreflect.EnumKind:
ename := field.Desc.EnumType().FullName()
ename := field.Desc.Enum().FullName()
enum, ok := gen.enumsByName[ename]
if !ok {
return fmt.Errorf("field %v: no descriptor for enum %v", desc.FullName(), ename)
}
field.EnumType = enum
field.Enum = enum
}
if desc.ExtendedType() != nil {
mname := desc.ExtendedType().FullName()
if desc.Extendee() != nil {
mname := desc.Extendee().FullName()
message, ok := gen.messagesByName[mname]
if !ok {
return fmt.Errorf("field %v: no descriptor for type %v", desc.FullName(), mname)
}
field.ExtendedType = message
field.Extendee = message
}
return nil
}
@ -692,18 +692,19 @@ func (field *Field) init(gen *Plugin) error {
type Oneof struct {
Desc protoreflect.OneofDescriptor
GoName string // Go field name of this oneof
ParentMessage *Message // message in which this oneof occurs
Fields []*Field // fields that are part of this oneof
Location Location // location of this oneof
GoName string // Go field name of this oneof
Parent *Message // message in which this oneof occurs
Fields []*Field // fields that are part of this oneof
Location Location // location of this oneof
}
func newOneof(gen *Plugin, f *File, message *Message, desc protoreflect.OneofDescriptor) *Oneof {
return &Oneof{
Desc: desc,
ParentMessage: message,
GoName: camelCase(string(desc.Name())),
Location: message.Location.appendPath(fieldnum.DescriptorProto_OneofDecl, int32(desc.Index())),
Desc: desc,
Parent: message,
GoName: camelCase(string(desc.Name())),
Location: message.Location.appendPath(fieldnum.DescriptorProto_OneofDecl, int32(desc.Index())),
}
}
@ -717,9 +718,10 @@ func (oneof *Oneof) init(gen *Plugin, parent *Message) {
type Enum struct {
Desc protoreflect.EnumDescriptor
GoIdent GoIdent // name of the generated Go type
Values []*EnumValue // enum values
Location Location // location of this enum
GoIdent GoIdent // name of the generated Go type
Values []*EnumValue // enum values
Location Location // location of this enum
}
func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescriptor) *Enum {
@ -745,7 +747,8 @@ func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescri
type EnumValue struct {
Desc protoreflect.EnumValueDescriptor
GoIdent GoIdent // name of the generated Go type
GoIdent GoIdent // name of the generated Go type
Location Location // location of this enum value
}
@ -770,9 +773,10 @@ func newEnumValue(gen *Plugin, f *File, message *Message, enum *Enum, desc proto
type Service struct {
Desc protoreflect.ServiceDescriptor
GoName string
Location Location // location of this service
Methods []*Method // service method definitions
GoName string
Methods []*Method // service method definitions
Location Location // location of this service
}
func newService(gen *Plugin, f *File, desc protoreflect.ServiceDescriptor) *Service {
@ -791,19 +795,20 @@ func newService(gen *Plugin, f *File, desc protoreflect.ServiceDescriptor) *Serv
type Method struct {
Desc protoreflect.MethodDescriptor
GoName string
ParentService *Service
Location Location // location of this method
InputType *Message
OutputType *Message
GoName string
Parent *Service
Input *Message
Output *Message
Location Location // location of this method
}
func newMethod(gen *Plugin, f *File, service *Service, desc protoreflect.MethodDescriptor) *Method {
method := &Method{
Desc: desc,
GoName: camelCase(string(desc.Name())),
ParentService: service,
Location: service.Location.appendPath(fieldnum.ServiceDescriptorProto_Method, int32(desc.Index())),
Desc: desc,
GoName: camelCase(string(desc.Name())),
Parent: service,
Location: service.Location.appendPath(fieldnum.ServiceDescriptorProto_Method, int32(desc.Index())),
}
return method
}
@ -811,19 +816,19 @@ func newMethod(gen *Plugin, f *File, service *Service, desc protoreflect.MethodD
func (method *Method) init(gen *Plugin) error {
desc := method.Desc
inName := desc.InputType().FullName()
inName := desc.Input().FullName()
in, ok := gen.messagesByName[inName]
if !ok {
return fmt.Errorf("method %v: no descriptor for type %v", desc.FullName(), inName)
}
method.InputType = in
method.Input = in
outName := desc.OutputType().FullName()
outName := desc.Output().FullName()
out, ok := gen.messagesByName[outName]
if !ok {
return fmt.Errorf("method %v: no descriptor for type %v", desc.FullName(), outName)
}
method.OutputType = out
method.Output = out
return nil
}

View File

@ -100,14 +100,14 @@ func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.Fi
Number: scalar.Int32(int32(field.Number())),
Label: descriptorpb.FieldDescriptorProto_Label(field.Cardinality()).Enum(),
Type: descriptorpb.FieldDescriptorProto_Type(field.Kind()).Enum(),
Extendee: fullNameOf(field.ExtendedType()),
Extendee: fullNameOf(field.Extendee()),
Options: field.Options().(*descriptorpb.FieldOptions),
}
switch field.Kind() {
case protoreflect.EnumKind:
p.TypeName = fullNameOf(field.EnumType())
p.TypeName = fullNameOf(field.Enum())
case protoreflect.MessageKind, protoreflect.GroupKind:
p.TypeName = fullNameOf(field.MessageType())
p.TypeName = fullNameOf(field.Message())
}
if field.HasJSONName() {
p.JsonName = scalar.String(field.JSONName())
@ -125,7 +125,7 @@ func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.Fi
p.DefaultValue = scalar.String(def)
}
}
if oneof := field.OneofType(); oneof != nil {
if oneof := field.Oneof(); oneof != nil {
p.OneofIndex = scalar.Int32(int32(oneof.Index()))
}
return p
@ -191,8 +191,8 @@ func ToServiceDescriptorProto(service protoreflect.ServiceDescriptor) *descripto
func ToMethodDescriptorProto(method protoreflect.MethodDescriptor) *descriptorpb.MethodDescriptorProto {
p := &descriptorpb.MethodDescriptorProto{
Name: scalar.String(string(method.Name())),
InputType: fullNameOf(method.InputType()),
OutputType: fullNameOf(method.OutputType()),
InputType: fullNameOf(method.Input()),
OutputType: fullNameOf(method.Output()),
Options: method.Options().(*descriptorpb.MethodOptions),
}
if method.IsStreamingClient() {

View File

@ -297,26 +297,39 @@ type FieldDescriptor interface {
// The Value type is determined by the Kind.
Default() Value
// DefaultEnumValue returns the EnummValueDescriptor for the default value
// DefaultEnumValue returns the EnumValueDescriptor for the default value
// of an enum field, and is nil for any other kind of field.
DefaultEnumValue() EnumValueDescriptor
// OneofType is the containing oneof that this field belongs to,
// Oneof is the containing oneof that this field belongs to,
// and is nil if this field is not part of a oneof.
OneofType() OneofDescriptor
Oneof() OneofDescriptor
// ExtendedType returns a MessageDescriptor for the extended message
// Extendee returns a message descriptor for the extended message
// that this extension field belongs in.
// It returns nil if this field is not an extension.
Extendee() MessageDescriptor
// Enum is the enum descriptor if Kind is EnumKind.
// It returns nil for any other Kind.
Enum() EnumDescriptor
// Message is the message descriptor if Kind is
// MessageKind or GroupKind. It returns nil for any other Kind.
Message() MessageDescriptor
// OneofType has been renamed to Oneof.
// Deprecated: Use Oneof instead; this will be removed.
OneofType() OneofDescriptor
// ExtendedType has been renamed to Extendee.
// Deprecated: Use Extendee instead; this will be removed.
ExtendedType() MessageDescriptor
// MessageType is the message type if Kind is MessageKind or GroupKind.
// It returns nil for any other Kind.
MessageType() MessageDescriptor
// EnumType is the enum type if Kind is EnumKind.
// It returns nil for any other Kind.
// EnumType has been renamed to Enum.
// Deprecated: Use Enum instead; this will be removed.
EnumType() EnumDescriptor
// MessageType has been renamed to Message.
// Deprecated: Use Message instead; this will be removed.
MessageType() MessageDescriptor
isFieldDescriptor
}
@ -387,7 +400,7 @@ type ExtensionDescriptors interface {
//
// While a normal field is a member of the parent message that it is declared
// within (see Descriptor.Parent), an extension field is a member of some other
// target message (see ExtensionDescriptor.ExtendedType) and may have no
// target message (see ExtensionDescriptor.Extendee) and may have no
// relationship with the parent. However, the full name of an extension field is
// relative to the parent that it is declared within.
//
@ -550,15 +563,22 @@ type ServiceDescriptors interface {
type MethodDescriptor interface {
Descriptor
// InputType is the input message type.
InputType() MessageDescriptor
// OutputType is the output message type.
OutputType() MessageDescriptor
// Input is the input message descriptor.
Input() MessageDescriptor
// Output is the output message descriptor.
Output() MessageDescriptor
// IsStreamingClient reports whether the client streams multiple messages.
IsStreamingClient() bool
// IsStreamingServer reports whether the server streams multiple messages.
IsStreamingServer() bool
// InputType has been renamed to Input.
// Deprecated: Use Input instead; this will be removed.
InputType() MessageDescriptor
// OutputType has been renamed to Output.
// Deprecated: Use Output instead; this will be removed.
OutputType() MessageDescriptor
isMethodDescriptor
}
type isMethodDescriptor interface{ ProtoType(MethodDescriptor) }

View File

@ -372,7 +372,7 @@ typeLoop:
// Check for conflicts in extensionsByMessage.
if xt, _ := typ.(protoreflect.ExtensionType); xt != nil {
field := xt.Number()
message := xt.ExtendedType().FullName()
message := xt.Extendee().FullName()
if r.extensionsByMessage[message][field] != nil {
if firstErr == nil {
firstErr = errors.New("extension %v is already registered on message %v", name, message)