Skip to content

Commit 6fdb39d

Browse files
committed
support array type in go generate
1 parent a938017 commit 6fdb39d

File tree

3 files changed

+3661
-12
lines changed

3 files changed

+3661
-12
lines changed

github/gen-accessors.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ func (t *templateData) processAST(f *ast.File) error {
137137
case *ast.MapType:
138138
t.addMapType(x, ts.Name.String(), fieldName.String(), false)
139139
continue
140+
case *ast.ArrayType:
141+
t.addArrayType(x, ts.Name.String(), fieldName.String(), false)
142+
continue
140143
}
141144

142145
logf("Skipping field type %T, fieldName=%v", field.Type, fieldName)
@@ -145,7 +148,7 @@ func (t *templateData) processAST(f *ast.File) error {
145148

146149
switch x := se.X.(type) {
147150
case *ast.ArrayType:
148-
t.addArrayType(x, ts.Name.String(), fieldName.String())
151+
t.addArrayType(x, ts.Name.String(), fieldName.String(), true)
149152
case *ast.Ident:
150153
t.addIdent(x, ts.Name.String(), fieldName.String())
151154
case *ast.MapType:
@@ -218,17 +221,26 @@ func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct
218221
}
219222
}
220223

221-
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) {
224+
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string, isAPointer bool) {
222225
var eltType string
226+
var ng *getter
223227
switch elt := x.Elt.(type) {
224228
case *ast.Ident:
225229
eltType = elt.String()
230+
ng = newGetter(receiverType, fieldName, "[]"+eltType, "nil", false)
231+
case *ast.StarExpr:
232+
ident, ok := elt.X.(*ast.Ident)
233+
if !ok {
234+
return
235+
}
236+
ng = newGetter(receiverType, fieldName, "[]*"+ident.String(), "nil", false)
226237
default:
227238
logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt)
228239
return
229240
}
230241

231-
t.Getters = append(t.Getters, newGetter(receiverType, fieldName, "[]"+eltType, "nil", false))
242+
ng.ArrayType = !isAPointer
243+
t.Getters = append(t.Getters, ng)
232244
}
233245

234246
func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) {
@@ -322,6 +334,7 @@ type getter struct {
322334
ZeroValue string
323335
NamedStruct bool // Getter for named struct.
324336
MapType bool
337+
ArrayType bool
325338
}
326339

327340
type byName []*getter
@@ -356,8 +369,8 @@ func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} {
356369
}
357370
return {{.ReceiverVar}}.{{.FieldName}}
358371
}
359-
{{else if .MapType}}
360-
// Get{{.FieldName}} returns the {{.FieldName}} map if it's non-nil, an empty map otherwise.
372+
{{else if or .MapType .ArrayType }}
373+
// Get{{.FieldName}} returns the {{.FieldName}} {{if .MapType}}map{{else if .ArrayType }}array{{end}} if it's non-nil, an empty map otherwise.
361374
func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} {
362375
if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil {
363376
return {{.ZeroValue}}
@@ -402,7 +415,7 @@ func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
402415
{{.ReceiverVar}} = nil
403416
{{.ReceiverVar}}.Get{{.FieldName}}()
404417
}
405-
{{else if .MapType}}
418+
{{else if or .MapType .ArrayType}}
406419
func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
407420
zeroValue := {{.FieldType}}{}
408421
{{.ReceiverVar}} := &{{.ReceiverType}}{ {{.FieldName}}: zeroValue }

0 commit comments

Comments
 (0)