func (this *descMap) visit(pkgName string, msg *descriptor.DescriptorProto) error { if _, ok := this.msgToField[msg]; ok { return nil } fields := msg.GetField() if msg.HasExtension() { exts := this.findExts(pkgName, msg.GetName()) fields = append(fields, exts...) } for i, f := range fields { if _, ok := this.msgToField[msg]; !ok { this.msgToField[msg] = make(map[uint64]*descriptor.FieldDescriptorProto) } this.msgToField[msg][f.GetKeyUint64()] = fields[i] if f.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE { newPkgName, newMsgName := this.desc.FindMessage(pkgName, msg.GetName(), f.GetName()) if len(newMsgName) == 0 { return &errUnknown{pkgName + "." + msg.GetName() + "." + f.GetName()} } newMsg := this.desc.GetMessage(newPkgName, newMsgName) if newMsg == nil { return &errUnknown{newPkgName + "." + newMsgName} } this.fieldToMsg[fields[i]] = newMsg if _, ok := this.msgToField[newMsg]; ok { continue } if err := this.visit(newPkgName, newMsg); err != nil { return err } } } for i := range msg.GetNestedType() { if err := this.visit(pkgName, msg.GetNestedType()[i]); err != nil { return err } } return nil }