-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproto_parser_message.go
76 lines (68 loc) · 1.9 KB
/
proto_parser_message.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package protokit
import (
"github.com/jhump/protoreflect/desc"
)
func (p *Parser) getDottedPackage(fd *desc.FileDescriptor) string {
dottedPkg := "." + fd.GetPackage()
if dottedPkg != "." {
dottedPkg += "."
}
return dottedPkg
}
func (p *Parser) parseMessages() {
for _, pf := range p.protoFilePathToProtoFile {
p.parseProtoFileMessages(pf)
}
}
func getProtoForMessageDescriptor(md *desc.MessageDescriptor) *desc.FileDescriptor {
return md.GetFile()
}
func (p *Parser) parsedMessageOrEnumGuard(d desc.Descriptor) bool {
_, ok := p.tmpParsedMessageOrEnumMapping[d]
if !ok {
p.tmpParsedMessageOrEnumMapping[d] = struct{}{}
}
return ok
}
func (p *Parser) parseProtoFileMessage(pf *ProtoFile, md *desc.MessageDescriptor) {
if p.parsedMessageOrEnumGuard(md) {
return
}
pd := getProtoForMessageDescriptor(md)
if pd != pf.fd {
return
}
pm := p.BuildProtoMessage(pf, md)
for _, f := range md.GetFields() {
protoField := p.BuildProtoField(pf, f)
pm.Fields = append(pm.Fields, protoField)
// 解析import
_, _ = p.addImportByDotFullyQualifiedTypeName(protoField.KeyTypeName, pm.ImportSet)
_, _ = p.addImportByDotFullyQualifiedTypeName(protoField.ValueTypeName, pm.ImportSet)
}
pf.Messages = append(pf.Messages, pm)
p.dotFullyQualifiedTypeNameToProtoMessage[pm.dotFullyQualifiedTypeName] = pm
for _, mt := range md.GetNestedMessageTypes() {
if mt.IsMapEntry() {
continue
}
p.parseProtoFileMessage(pf, mt)
}
for _, et := range md.GetNestedEnumTypes() {
p.parseProtoFileEnum(pf, et)
}
}
func (p *Parser) parseProtoFileEnum(pf *ProtoFile, ed *desc.EnumDescriptor) {
if p.parsedMessageOrEnumGuard(ed) {
return
}
pf.Enums = append(pf.Enums, p.BuildProtoEnum(pf, ed))
}
func (p *Parser) parseProtoFileMessages(pf *ProtoFile) {
for _, mt := range pf.fd.GetMessageTypes() {
p.parseProtoFileMessage(pf, mt)
}
for _, et := range pf.fd.GetEnumTypes() {
p.parseProtoFileEnum(pf, et)
}
}