6868 return "github.Timestamp{0001-01-01 00:00:00 +0000 UTC}"
6969 case "nil" :
7070 return "map[]"
71+ case `[]int{0}` :
72+ return `[0]`
73+ case `[]string{""}` :
74+ return `[""]`
75+ case "[]Scope{ScopeNone}" :
76+ return `["(no scope)"]`
7177 }
7278 log .Fatalf ("Unhandled zero value: %q" , v )
7379 return ""
@@ -144,7 +150,18 @@ func (t *templateData) processAST(f *ast.File) error {
144150 logf ("Got FuncDecl: Name=%q, id.Name=%#v" , fn .Name .Name , id .Name )
145151 t .StringFuncs [id .Name ] = true
146152 } else {
147- logf ("Ignoring FuncDecl: Name=%q, Type=%T" , fn .Name .Name , fn .Recv .List [0 ].Type )
153+ star , ok := fn .Recv .List [0 ].Type .(* ast.StarExpr )
154+ if ok && fn .Name .Name == "String" {
155+ id , ok := star .X .(* ast.Ident )
156+ if ok {
157+ logf ("Got FuncDecl: Name=%q, id.Name=%#v" , fn .Name .Name , id .Name )
158+ t .StringFuncs [id .Name ] = true
159+ } else {
160+ logf ("Ignoring FuncDecl: Name=%q, Type=%T" , fn .Name .Name , fn .Recv .List [0 ].Type )
161+ }
162+ } else {
163+ logf ("Ignoring FuncDecl: Name=%q, Type=%T" , fn .Name .Name , fn .Recv .List [0 ].Type )
164+ }
148165 }
149166 } else {
150167 logf ("Ignoring FuncDecl: Name=%q, fn=%#v" , fn .Name .Name , fn )
@@ -157,6 +174,7 @@ func (t *templateData) processAST(f *ast.File) error {
157174 logf ("Ignoring AST decl type %T" , decl )
158175 continue
159176 }
177+
160178 for _ , spec := range gd .Specs {
161179 ts , ok := spec .(* ast.TypeSpec )
162180 if ! ok {
@@ -188,6 +206,13 @@ func (t *templateData) processAST(f *ast.File) error {
188206 continue
189207 }
190208
209+ if at , ok := field .Type .(* ast.ArrayType ); ok {
210+ if id , ok := at .Elt .(* ast.Ident ); ok {
211+ t .addIdentSlice (id , ts .Name .String (), fieldName .String ())
212+ continue
213+ }
214+ }
215+
191216 se , ok := field .Type .(* ast.StarExpr )
192217 if ! ok {
193218 logf ("Ignoring type %T for Name=%q, FieldName=%q" , field .Type , ts .Name .String (), fieldName .String ())
@@ -272,6 +297,32 @@ func (t *templateData) addIdentPtr(x *ast.Ident, receiverType, fieldName string)
272297 t .StructFields [receiverType ] = append (t .StructFields [receiverType ], newStructField (receiverType , fieldName , x .String (), zeroValue , namedStruct ))
273298}
274299
300+ func (t * templateData ) addIdentSlice (x * ast.Ident , receiverType , fieldName string ) {
301+ var zeroValue string
302+ var namedStruct = false
303+ switch x .String () {
304+ case "int" :
305+ zeroValue = "[]int{0}"
306+ case "int64" :
307+ zeroValue = "[]int64{0}"
308+ case "float64" :
309+ zeroValue = "[]float64{0}"
310+ case "string" :
311+ zeroValue = `[]string{""}`
312+ case "bool" :
313+ zeroValue = "[]bool{false}"
314+ case "Scope" :
315+ zeroValue = "[]Scope{ScopeNone}"
316+ // case "Timestamp":
317+ // zeroValue = "&Timestamp{}"
318+ default :
319+ zeroValue = "nil"
320+ namedStruct = true
321+ }
322+
323+ t .StructFields [receiverType ] = append (t .StructFields [receiverType ], newStructField (receiverType , fieldName , x .String (), zeroValue , namedStruct ))
324+ }
325+
275326func (t * templateData ) dump () error {
276327 if len (t .StructFields ) == 0 {
277328 logf ("No StructFields for %v; skipping." , t .filename )
0 commit comments