Skip to content

Commit 60429b4

Browse files
authored
Support array type in go generate with whitelist (#2776)
Fixes: #2425.
1 parent 21df6e0 commit 60429b4

File tree

3 files changed

+45
-6
lines changed

3 files changed

+45
-6
lines changed

github/gen-accessors.go

Lines changed: 27 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,12 @@ 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+
}
140151
}
141152

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

146157
switch x := se.X.(type) {
147158
case *ast.ArrayType:
148-
t.addArrayType(x, ts.Name.String(), fieldName.String())
159+
t.addArrayType(x, ts.Name.String(), fieldName.String(), true)
149160
case *ast.Ident:
150161
t.addIdent(x, ts.Name.String(), fieldName.String())
151162
case *ast.MapType:
@@ -218,17 +229,26 @@ func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct
218229
}
219230
}
220231

221-
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) {
232+
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string, isAPointer bool) {
222233
var eltType string
234+
var ng *getter
223235
switch elt := x.Elt.(type) {
224236
case *ast.Ident:
225237
eltType = elt.String()
238+
ng = newGetter(receiverType, fieldName, "[]"+eltType, "nil", false)
239+
case *ast.StarExpr:
240+
ident, ok := elt.X.(*ast.Ident)
241+
if !ok {
242+
return
243+
}
244+
ng = newGetter(receiverType, fieldName, "[]*"+ident.String(), "nil", false)
226245
default:
227246
logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt)
228247
return
229248
}
230249

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

234254
func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) {
@@ -322,6 +342,7 @@ type getter struct {
322342
ZeroValue string
323343
NamedStruct bool // Getter for named struct.
324344
MapType bool
345+
ArrayType bool
325346
}
326347

327348
type byName []*getter
@@ -356,8 +377,8 @@ func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} {
356377
}
357378
return {{.ReceiverVar}}.{{.FieldName}}
358379
}
359-
{{else if .MapType}}
360-
// Get{{.FieldName}} returns the {{.FieldName}} map if it's non-nil, an empty map otherwise.
380+
{{else if or .MapType .ArrayType }}
381+
// 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.
361382
func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} {
362383
if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil {
363384
return {{.ZeroValue}}
@@ -402,7 +423,7 @@ func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
402423
{{.ReceiverVar}} = nil
403424
{{.ReceiverVar}}.Get{{.FieldName}}()
404425
}
405-
{{else if .MapType}}
426+
{{else if or .MapType .ArrayType}}
406427
func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
407428
zeroValue := {{.FieldType}}{}
408429
{{.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)