10 |
10 |
11 import ( |
11 import ( |
12 "google.golang.org/protobuf/encoding/protowire" |
12 "google.golang.org/protobuf/encoding/protowire" |
13 "google.golang.org/protobuf/internal/genid" |
13 "google.golang.org/protobuf/internal/genid" |
14 "google.golang.org/protobuf/reflect/protoreflect" |
14 "google.golang.org/protobuf/reflect/protoreflect" |
15 pref "google.golang.org/protobuf/reflect/protoreflect" |
15 "google.golang.org/protobuf/reflect/protoregistry" |
16 preg "google.golang.org/protobuf/reflect/protoregistry" |
|
17 ) |
16 ) |
18 |
17 |
19 // Builder construct a protoreflect.FileDescriptor from the raw descriptor. |
18 // Builder construct a protoreflect.FileDescriptor from the raw descriptor. |
20 type Builder struct { |
19 type Builder struct { |
21 // GoPackagePath is the Go package path that is invoking this builder. |
20 // GoPackagePath is the Go package path that is invoking this builder. |
36 NumServices int32 |
35 NumServices int32 |
37 |
36 |
38 // TypeResolver resolves extension field types for descriptor options. |
37 // TypeResolver resolves extension field types for descriptor options. |
39 // If nil, it uses protoregistry.GlobalTypes. |
38 // If nil, it uses protoregistry.GlobalTypes. |
40 TypeResolver interface { |
39 TypeResolver interface { |
41 preg.ExtensionTypeResolver |
40 protoregistry.ExtensionTypeResolver |
42 } |
41 } |
43 |
42 |
44 // FileRegistry is use to lookup file, enum, and message dependencies. |
43 // FileRegistry is use to lookup file, enum, and message dependencies. |
45 // Once constructed, the file descriptor is registered here. |
44 // Once constructed, the file descriptor is registered here. |
46 // If nil, it uses protoregistry.GlobalFiles. |
45 // If nil, it uses protoregistry.GlobalFiles. |
47 FileRegistry interface { |
46 FileRegistry interface { |
48 FindFileByPath(string) (protoreflect.FileDescriptor, error) |
47 FindFileByPath(string) (protoreflect.FileDescriptor, error) |
49 FindDescriptorByName(pref.FullName) (pref.Descriptor, error) |
48 FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) |
50 RegisterFile(pref.FileDescriptor) error |
49 RegisterFile(protoreflect.FileDescriptor) error |
51 } |
50 } |
52 } |
51 } |
53 |
52 |
54 // resolverByIndex is an interface Builder.FileRegistry may implement. |
53 // resolverByIndex is an interface Builder.FileRegistry may implement. |
55 // If so, it permits looking up an enum or message dependency based on the |
54 // If so, it permits looking up an enum or message dependency based on the |
56 // sub-list and element index into filetype.Builder.DependencyIndexes. |
55 // sub-list and element index into filetype.Builder.DependencyIndexes. |
57 type resolverByIndex interface { |
56 type resolverByIndex interface { |
58 FindEnumByIndex(int32, int32, []Enum, []Message) pref.EnumDescriptor |
57 FindEnumByIndex(int32, int32, []Enum, []Message) protoreflect.EnumDescriptor |
59 FindMessageByIndex(int32, int32, []Enum, []Message) pref.MessageDescriptor |
58 FindMessageByIndex(int32, int32, []Enum, []Message) protoreflect.MessageDescriptor |
60 } |
59 } |
61 |
60 |
62 // Indexes of each sub-list in filetype.Builder.DependencyIndexes. |
61 // Indexes of each sub-list in filetype.Builder.DependencyIndexes. |
63 const ( |
62 const ( |
64 listFieldDeps int32 = iota |
63 listFieldDeps int32 = iota |
95 db.unmarshalCounts(db.RawDescriptor, true) |
94 db.unmarshalCounts(db.RawDescriptor, true) |
96 } |
95 } |
97 |
96 |
98 // Initialize resolvers and registries if unpopulated. |
97 // Initialize resolvers and registries if unpopulated. |
99 if db.TypeResolver == nil { |
98 if db.TypeResolver == nil { |
100 db.TypeResolver = preg.GlobalTypes |
99 db.TypeResolver = protoregistry.GlobalTypes |
101 } |
100 } |
102 if db.FileRegistry == nil { |
101 if db.FileRegistry == nil { |
103 db.FileRegistry = preg.GlobalFiles |
102 db.FileRegistry = protoregistry.GlobalFiles |
104 } |
103 } |
105 |
104 |
106 fd := newRawFile(db) |
105 fd := newRawFile(db) |
107 out.File = fd |
106 out.File = fd |
108 out.Enums = fd.allEnums |
107 out.Enums = fd.allEnums |