package impl
import (
"reflect"
"google.golang.org/protobuf/internal/descopts"
"google.golang.org/protobuf/internal/encoding/messageset"
ptag "google.golang.org/protobuf/internal/encoding/tag"
"google.golang.org/protobuf/internal/filedesc"
"google.golang.org/protobuf/internal/pragma"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/runtime/protoiface"
)
func (xi *ExtensionInfo ) initToLegacy () {
xd := xi .desc
var parent protoiface .MessageV1
messageName := xd .ContainingMessage ().FullName ()
if mt , _ := protoregistry .GlobalTypes .FindMessageByName (messageName ); mt != nil {
mv := mt .New ().Interface ()
t := reflect .TypeOf (mv )
if mv , ok := mv .(unwrapper ); ok {
t = reflect .TypeOf (mv .protoUnwrap ())
}
mz := reflect .Zero (t ).Interface ()
if mz , ok := mz .(protoiface .MessageV1 ); ok {
parent = mz
}
}
extType := xi .goType
switch extType .Kind () {
case reflect .Bool , reflect .Int32 , reflect .Int64 , reflect .Uint32 , reflect .Uint64 , reflect .Float32 , reflect .Float64 , reflect .String :
extType = reflect .PtrTo (extType )
}
var enumName string
if xd .Kind () == protoreflect .EnumKind {
enumName = legacyEnumName (xd .Enum ())
}
var filename string
if fd := xd .ParentFile (); fd != nil {
filename = fd .Path ()
}
name := xd .FullName ()
if messageset .IsMessageSetExtension (xd ) {
name = name .Parent ()
}
xi .ExtendedType = parent
xi .ExtensionType = reflect .Zero (extType ).Interface ()
xi .Field = int32 (xd .Number ())
xi .Name = string (name )
xi .Tag = ptag .Marshal (xd , enumName )
xi .Filename = filename
}
func (xi *ExtensionInfo ) initFromLegacy () {
if xi .ExtendedType == nil || xi .ExtensionType == nil {
xd := placeholderExtension {
name : protoreflect .FullName (xi .Name ),
number : protoreflect .FieldNumber (xi .Field ),
}
xi .desc = extensionTypeDescriptor {xd , xi }
return
}
var ed protoreflect .EnumDescriptor
var md protoreflect .MessageDescriptor
t := reflect .TypeOf (xi .ExtensionType )
isOptional := t .Kind () == reflect .Ptr && t .Elem ().Kind () != reflect .Struct
isRepeated := t .Kind () == reflect .Slice && t .Elem ().Kind () != reflect .Uint8
if isOptional || isRepeated {
t = t .Elem ()
}
switch v := reflect .Zero (t ).Interface ().(type ) {
case protoreflect .Enum :
ed = v .Descriptor ()
case enumV1 :
ed = LegacyLoadEnumDesc (t )
case protoreflect .ProtoMessage :
md = v .ProtoReflect ().Descriptor ()
case messageV1 :
md = LegacyLoadMessageDesc (t )
}
var evs protoreflect .EnumValueDescriptors
if ed != nil {
evs = ed .Values ()
}
fd := ptag .Unmarshal (xi .Tag , t , evs ).(*filedesc .Field )
xd := &filedesc .Extension {L2 : new (filedesc .ExtensionL2 )}
xd .L0 .ParentFile = filedesc .SurrogateProto2
xd .L0 .FullName = protoreflect .FullName (xi .Name )
xd .L1 .Number = protoreflect .FieldNumber (xi .Field )
xd .L1 .Cardinality = fd .L1 .Cardinality
xd .L1 .Kind = fd .L1 .Kind
xd .L1 .EditionFeatures = fd .L1 .EditionFeatures
xd .L2 .Default = fd .L1 .Default
xd .L1 .Extendee = Export {}.MessageDescriptorOf (xi .ExtendedType )
xd .L2 .Enum = ed
xd .L2 .Message = md
if messageset .IsMessageSet (xd .L1 .Extendee ) && md .FullName () == xd .L0 .FullName {
xd .L0 .FullName = xd .L0 .FullName .Append (messageset .ExtensionName )
}
tt := reflect .TypeOf (xi .ExtensionType )
if isOptional {
tt = tt .Elem ()
}
xi .goType = tt
xi .desc = extensionTypeDescriptor {xd , xi }
}
type placeholderExtension struct {
name protoreflect .FullName
number protoreflect .FieldNumber
}
func (x placeholderExtension ) ParentFile () protoreflect .FileDescriptor { return nil }
func (x placeholderExtension ) Parent () protoreflect .Descriptor { return nil }
func (x placeholderExtension ) Index () int { return 0 }
func (x placeholderExtension ) Syntax () protoreflect .Syntax { return 0 }
func (x placeholderExtension ) Name () protoreflect .Name { return x .name .Name () }
func (x placeholderExtension ) FullName () protoreflect .FullName { return x .name }
func (x placeholderExtension ) IsPlaceholder () bool { return true }
func (x placeholderExtension ) Options () protoreflect .ProtoMessage { return descopts .Field }
func (x placeholderExtension ) Number () protoreflect .FieldNumber { return x .number }
func (x placeholderExtension ) Cardinality () protoreflect .Cardinality { return 0 }
func (x placeholderExtension ) Kind () protoreflect .Kind { return 0 }
func (x placeholderExtension ) HasJSONName () bool { return false }
func (x placeholderExtension ) JSONName () string { return "[" + string (x .name ) + "]" }
func (x placeholderExtension ) TextName () string { return "[" + string (x .name ) + "]" }
func (x placeholderExtension ) HasPresence () bool { return false }
func (x placeholderExtension ) HasOptionalKeyword () bool { return false }
func (x placeholderExtension ) IsExtension () bool { return true }
func (x placeholderExtension ) IsWeak () bool { return false }
func (x placeholderExtension ) IsLazy () bool { return false }
func (x placeholderExtension ) IsPacked () bool { return false }
func (x placeholderExtension ) IsList () bool { return false }
func (x placeholderExtension ) IsMap () bool { return false }
func (x placeholderExtension ) MapKey () protoreflect .FieldDescriptor { return nil }
func (x placeholderExtension ) MapValue () protoreflect .FieldDescriptor { return nil }
func (x placeholderExtension ) HasDefault () bool { return false }
func (x placeholderExtension ) Default () protoreflect .Value { return protoreflect .Value {} }
func (x placeholderExtension ) DefaultEnumValue () protoreflect .EnumValueDescriptor { return nil }
func (x placeholderExtension ) ContainingOneof () protoreflect .OneofDescriptor { return nil }
func (x placeholderExtension ) ContainingMessage () protoreflect .MessageDescriptor { return nil }
func (x placeholderExtension ) Enum () protoreflect .EnumDescriptor { return nil }
func (x placeholderExtension ) Message () protoreflect .MessageDescriptor { return nil }
func (x placeholderExtension ) ProtoType (protoreflect .FieldDescriptor ) { return }
func (x placeholderExtension ) ProtoInternal (pragma .DoNotImplement ) { return }
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .