@@ -5,10 +5,16 @@ import (
55 "strings"
66)
77
8+ type fieldIndex struct {
9+ index int
10+ field * field
11+ }
12+
813type serializer struct {
9- name string
10- version int32
11- fields []* field
14+ name string
15+ version int32
16+ fields []* field
17+ fieldIndexes map [string ]* fieldIndex
1218}
1319
1420func (s * serializer ) id () string {
@@ -36,15 +42,18 @@ func (s *serializer) getFieldForFieldPath(fp *fieldPath, pos int) *field {
3642}
3743
3844func (s * serializer ) getFieldPathForName (fp * fieldPath , name string ) bool {
39- for i , f := range s .fields {
40- if name == f .varName {
41- fp .path [fp .last ] = i
42- return true
43- }
45+ if s .fieldIndexes [name ] != nil {
46+ fp .path [fp .last ] = s .fieldIndexes [name ].index
47+ return true
48+ }
4449
45- if strings .HasPrefix (name , f .varName + "." ) {
46- fp .path [fp .last ] = i
50+ dotIndex := strings .Index (name , "." )
51+ if dotIndex != - 1 {
52+ nameBeforeDot := name [:dotIndex ]
53+ if s .fieldIndexes [nameBeforeDot ] != nil {
54+ fp .path [fp .last ] = s .fieldIndexes [nameBeforeDot ].index
4755 fp .last ++
56+ f := s .fieldIndexes [nameBeforeDot ].field
4857 return f .getFieldPathForName (fp , name [len (f .varName )+ 1 :])
4958 }
5059 }
@@ -64,3 +73,17 @@ func (s *serializer) getFieldPaths(fp *fieldPath, state *fieldState) []*fieldPat
6473func serializerId (name string , version int32 ) string {
6574 return fmt .Sprintf ("%s(%d)" , name , version )
6675}
76+
77+ func (s * serializer ) addField (f * field ) {
78+ newFieldIndex := len (s .fields )
79+ s .fields = append (s .fields , f )
80+
81+ if s .fieldIndexes == nil {
82+ s .fieldIndexes = make (map [string ]* fieldIndex )
83+ }
84+
85+ s .fieldIndexes [f .varName ] = & fieldIndex {
86+ index : newFieldIndex ,
87+ field : f ,
88+ }
89+ }
0 commit comments