@@ -27,6 +27,7 @@ type CodeGenerator struct {
2727 ImportEncodingXML bool // For Go language
2828 ProtoTree []interface {}
2929 StructAST map [string ]string
30+ Hook Hook
3031}
3132
3233var goBuildinType = map [string ]bool {
@@ -59,12 +60,28 @@ var goBuildinType = map[string]bool{
5960// GenGo generate Go programming language source code for XML schema
6061// definition files.
6162func (gen * CodeGenerator ) GenGo () error {
63+ err := error (nil )
6264 fieldNameCount = make (map [string ]int )
6365 for _ , ele := range gen .ProtoTree {
6466 if ele == nil {
6567 continue
6668 }
67- funcName := fmt .Sprintf ("Go%s" , reflect .TypeOf (ele ).String ()[6 :])
69+
70+ next := true
71+ protoName := reflect .TypeOf (ele ).String ()[6 :]
72+ if gen .Hook != nil {
73+ next , err = gen .Hook .OnGenerate (gen , protoName , ele )
74+ if err != nil {
75+ return err
76+ }
77+
78+ // skip to next element (in tree)
79+ if ! next {
80+ continue
81+ }
82+ }
83+
84+ funcName := fmt .Sprintf ("Go%s" , protoName )
6885 callFuncByName (gen , funcName , []reflect.Value {reflect .ValueOf (ele )})
6986 }
7087 f , err := os .Create (gen .FileWithExtension (".go" ))
@@ -139,7 +156,12 @@ func (gen *CodeGenerator) GoSimpleType(v *SimpleType) {
139156 content := fmt .Sprintf (" []%s\n " , genGoFieldType (fieldType ))
140157 gen .StructAST [v .Name ] = content
141158 fieldName := genGoFieldName (v .Name , true )
142- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
159+
160+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
161+ if gen .Hook != nil {
162+ gen .Hook .OnAddContent (gen , & output )
163+ }
164+ gen .Field += output
143165 return
144166 }
145167 }
@@ -162,15 +184,25 @@ func (gen *CodeGenerator) GoSimpleType(v *SimpleType) {
162184 }
163185 content += "}\n "
164186 gen .StructAST [v .Name ] = content
165- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
187+
188+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
189+ if gen .Hook != nil {
190+ gen .Hook .OnAddContent (gen , & output )
191+ }
192+ gen .Field += output
166193 }
167194 return
168195 }
169196 if _ , ok := gen .StructAST [v .Name ]; ! ok {
170197 content := fmt .Sprintf (" %s\n " , genGoFieldType (getBasefromSimpleType (trimNSPrefix (v .Base ), gen .ProtoTree )))
171198 gen .StructAST [v .Name ] = content
172199 fieldName := genGoFieldName (v .Name , true )
173- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
200+
201+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
202+ if gen .Hook != nil {
203+ gen .Hook .OnAddContent (gen , & output )
204+ }
205+ gen .Field += output
174206 }
175207}
176208
@@ -244,7 +276,12 @@ func (gen *CodeGenerator) GoComplexType(v *ComplexType) {
244276 }
245277 content += "}\n "
246278 gen .StructAST [v .Name ] = content
247- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
279+
280+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
281+ if gen .Hook != nil {
282+ gen .Hook .OnAddContent (gen , & output )
283+ }
284+ gen .Field += output
248285 }
249286}
250287
@@ -280,7 +317,12 @@ func (gen *CodeGenerator) GoGroup(v *Group) {
280317
281318 content += "}\n "
282319 gen .StructAST [v .Name ] = content
283- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
320+
321+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
322+ if gen .Hook != nil {
323+ gen .Hook .OnAddContent (gen , & output )
324+ }
325+ gen .Field += output
284326 }
285327}
286328
@@ -303,7 +345,12 @@ func (gen *CodeGenerator) GoAttributeGroup(v *AttributeGroup) {
303345 }
304346 content += "}\n "
305347 gen .StructAST [v .Name ] = content
306- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
348+
349+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
350+ if gen .Hook != nil {
351+ gen .Hook .OnAddContent (gen , & output )
352+ }
353+ gen .Field += output
307354 }
308355}
309356
@@ -317,7 +364,12 @@ func (gen *CodeGenerator) GoElement(v *Element) {
317364 content := fmt .Sprintf ("\t %s%s\n " , plural , genGoFieldType (getBasefromSimpleType (trimNSPrefix (v .Type ), gen .ProtoTree )))
318365 gen .StructAST [v .Name ] = content
319366 fieldName := genGoFieldName (v .Name , false )
320- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
367+
368+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
369+ if gen .Hook != nil {
370+ gen .Hook .OnAddContent (gen , & output )
371+ }
372+ gen .Field += output
321373 }
322374}
323375
@@ -331,7 +383,12 @@ func (gen *CodeGenerator) GoAttribute(v *Attribute) {
331383 content := fmt .Sprintf ("\t %s%s\n " , plural , genGoFieldType (getBasefromSimpleType (trimNSPrefix (v .Type ), gen .ProtoTree )))
332384 gen .StructAST [v .Name ] = content
333385 fieldName := genGoFieldName (v .Name , true )
334- gen .Field += fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
386+
387+ output := fmt .Sprintf ("%stype %s%s" , genFieldComment (fieldName , v .Doc , "//" ), fieldName , gen .StructAST [v .Name ])
388+ if gen .Hook != nil {
389+ gen .Hook .OnAddContent (gen , & output )
390+ }
391+ gen .Field += output
335392 }
336393}
337394
0 commit comments