Skip to content

Commit ff7fd8c

Browse files
committed
support array type in go generate
support array type in go generate with whitelist
1 parent a938017 commit ff7fd8c

File tree

3 files changed

+46
-6
lines changed

3 files changed

+46
-6
lines changed

github/gen-accessors.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ var (
5151
skipStructs = map[string]bool{
5252
"Client": true,
5353
}
54+
55+
// whitelistSliceGetters lists "struct.field" to add getter method
56+
whitelistSliceGetters = map[string]bool{
57+
"PushEvent.Commits": true,
58+
}
5459
)
5560

5661
func logf(fmt string, args ...interface{}) {
@@ -137,6 +142,13 @@ func (t *templateData) processAST(f *ast.File) error {
137142
case *ast.MapType:
138143
t.addMapType(x, ts.Name.String(), fieldName.String(), false)
139144
continue
145+
case *ast.ArrayType:
146+
if key := fmt.Sprintf("%v.%v", ts.Name, fieldName); whitelistSliceGetters[key] {
147+
logf("Method %v is whitelist; adding getter method.", key)
148+
t.addArrayType(x, ts.Name.String(), fieldName.String(), false)
149+
continue
150+
}
151+
continue
140152
}
141153

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

146158
switch x := se.X.(type) {
147159
case *ast.ArrayType:
148-
t.addArrayType(x, ts.Name.String(), fieldName.String())
160+
t.addArrayType(x, ts.Name.String(), fieldName.String(), true)
149161
case *ast.Ident:
150162
t.addIdent(x, ts.Name.String(), fieldName.String())
151163
case *ast.MapType:
@@ -218,17 +230,26 @@ func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct
218230
}
219231
}
220232

221-
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) {
233+
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string, isAPointer bool) {
222234
var eltType string
235+
var ng *getter
223236
switch elt := x.Elt.(type) {
224237
case *ast.Ident:
225238
eltType = elt.String()
239+
ng = newGetter(receiverType, fieldName, "[]"+eltType, "nil", false)
240+
case *ast.StarExpr:
241+
ident, ok := elt.X.(*ast.Ident)
242+
if !ok {
243+
return
244+
}
245+
ng = newGetter(receiverType, fieldName, "[]*"+ident.String(), "nil", false)
226246
default:
227247
logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt)
228248
return
229249
}
230250

231-
t.Getters = append(t.Getters, newGetter(receiverType, fieldName, "[]"+eltType, "nil", false))
251+
ng.ArrayType = !isAPointer
252+
t.Getters = append(t.Getters, ng)
232253
}
233254

234255
func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) {
@@ -322,6 +343,7 @@ type getter struct {
322343
ZeroValue string
323344
NamedStruct bool // Getter for named struct.
324345
MapType bool
346+
ArrayType bool
325347
}
326348

327349
type byName []*getter
@@ -356,8 +378,8 @@ func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} {
356378
}
357379
return {{.ReceiverVar}}.{{.FieldName}}
358380
}
359-
{{else if .MapType}}
360-
// Get{{.FieldName}} returns the {{.FieldName}} map if it's non-nil, an empty map otherwise.
381+
{{else if or .MapType .ArrayType }}
382+
// Get{{.FieldName}} returns the {{.FieldName}} {{if .MapType}}map{{else if .ArrayType }}slice{{end}} if it's non-nil, {{if .MapType}}an empty map{{else if .ArrayType }}nil{{end}} otherwise.
361383
func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} {
362384
if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil {
363385
return {{.ZeroValue}}
@@ -402,7 +424,7 @@ func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
402424
{{.ReceiverVar}} = nil
403425
{{.ReceiverVar}}.Get{{.FieldName}}()
404426
}
405-
{{else if .MapType}}
427+
{{else if or .MapType .ArrayType}}
406428
func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
407429
zeroValue := {{.FieldType}}{}
408430
{{.ReceiverVar}} := &{{.ReceiverType}}{ {{.FieldName}}: zeroValue }

github/github-accessors.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

github/github-accessors_test.go

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)