Skip to content

Commit 0b29555

Browse files
committed
Refactor FunctionGen - no interface needed
1 parent f9e92a1 commit 0b29555

File tree

7 files changed

+147
-164
lines changed

7 files changed

+147
-164
lines changed

staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,14 +1093,14 @@ func (g *genValidations) emitCallToOtherTypeFunc(c *generator.Context, node *typ
10931093
// Emitted code assumes that the value in question is always a pair of nilable
10941094
// variables named "obj" and "oldObj", and the field path to this value is
10951095
// named "fldPath".
1096-
func emitCallsToValidators(c *generator.Context, validations []validators.FunctionGen, sw *generator.SnippetWriter) {
1096+
func emitCallsToValidators(c *generator.Context, validations []*validators.FunctionGen, sw *generator.SnippetWriter) {
10971097
// Helper func
1098-
sort := func(in []validators.FunctionGen) []validators.FunctionGen {
1099-
sooner := make([]validators.FunctionGen, 0, len(in))
1100-
later := make([]validators.FunctionGen, 0, len(in))
1098+
sort := func(in []*validators.FunctionGen) []*validators.FunctionGen {
1099+
sooner := make([]*validators.FunctionGen, 0, len(in))
1100+
later := make([]*validators.FunctionGen, 0, len(in))
11011101

11021102
for _, fg := range in {
1103-
isShortCircuit := (fg.Flags().IsSet(validators.ShortCircuit))
1103+
isShortCircuit := (fg.Flags.IsSet(validators.ShortCircuit))
11041104

11051105
if isShortCircuit {
11061106
sooner = append(sooner, fg)
@@ -1116,19 +1116,17 @@ func emitCallsToValidators(c *generator.Context, validations []validators.Functi
11161116
validations = sort(validations)
11171117

11181118
for _, v := range validations {
1119-
isShortCircuit := v.Flags().IsSet(validators.ShortCircuit)
1120-
isNonError := v.Flags().IsSet(validators.NonError)
1119+
isShortCircuit := v.Flags.IsSet(validators.ShortCircuit)
1120+
isNonError := v.Flags.IsSet(validators.NonError)
11211121

1122-
fn, extraArgs := v.SignatureAndArgs()
11231122
targs := generator.Args{
1124-
"funcName": c.Universe.Type(fn),
1123+
"funcName": c.Universe.Type(v.Function),
11251124
"field": mkSymbolArgs(c, fieldPkgSymbols),
11261125
}
11271126

11281127
emitCall := func() {
11291128
sw.Do("$.funcName|raw$", targs)
1130-
typeArgs := v.TypeArgs()
1131-
if len(typeArgs) > 0 {
1129+
if typeArgs := v.TypeArgs; len(typeArgs) > 0 {
11321130
sw.Do("[", nil)
11331131
for i, typeArg := range typeArgs {
11341132
sw.Do("$.|raw$", c.Universe.Type(typeArg))
@@ -1139,29 +1137,29 @@ func emitCallsToValidators(c *generator.Context, validations []validators.Functi
11391137
sw.Do("]", nil)
11401138
}
11411139
sw.Do("(ctx, op, fldPath, obj, oldObj", targs)
1142-
for _, arg := range extraArgs {
1140+
for _, arg := range v.Args {
11431141
sw.Do(", ", nil)
11441142
toGolangSourceDataLiteral(sw, c, arg)
11451143
}
11461144
sw.Do(")", targs)
11471145
}
11481146

11491147
// If validation is conditional, wrap the validation function with a conditions check.
1150-
if !v.Conditions().Empty() {
1148+
if !v.Conditions.Empty() {
11511149
emitBaseFunction := emitCall
11521150
emitCall = func() {
11531151
sw.Do("func() $.field.ErrorList|raw$ {\n", targs)
11541152
sw.Do(" if ", nil)
11551153
firstCondition := true
1156-
if len(v.Conditions().OptionEnabled) > 0 {
1157-
sw.Do("op.Options.Has($.$)", strconv.Quote(v.Conditions().OptionEnabled))
1154+
if len(v.Conditions.OptionEnabled) > 0 {
1155+
sw.Do("op.Options.Has($.$)", strconv.Quote(v.Conditions.OptionEnabled))
11581156
firstCondition = false
11591157
}
1160-
if len(v.Conditions().OptionDisabled) > 0 {
1158+
if len(v.Conditions.OptionDisabled) > 0 {
11611159
if !firstCondition {
11621160
sw.Do(" && ", nil)
11631161
}
1164-
sw.Do("!op.Options.Has($.$)", strconv.Quote(v.Conditions().OptionDisabled))
1162+
sw.Do("!op.Options.Has($.$)", strconv.Quote(v.Conditions.OptionDisabled))
11651163
}
11661164
sw.Do(" {\n", nil)
11671165
sw.Do(" return ", nil)
@@ -1174,7 +1172,7 @@ func emitCallsToValidators(c *generator.Context, validations []validators.Functi
11741172
}
11751173
}
11761174

1177-
for _, comment := range v.Comments() {
1175+
for _, comment := range v.Comments {
11781176
sw.Do("// $.$\n", comment)
11791177
}
11801178
if isShortCircuit {
@@ -1218,16 +1216,15 @@ func (g *genValidations) emitValidationVariables(c *generator.Context, t *types.
12181216
})
12191217
for _, variable := range variables {
12201218
fn := variable.Init()
1221-
supportInitFn, supportInitArgs := fn.SignatureAndArgs()
12221219
targs := generator.Args{
12231220
"varName": c.Universe.Type(types.Name(variable.Var())),
1224-
"initFn": c.Universe.Type(supportInitFn),
1221+
"initFn": c.Universe.Type(fn.Function),
12251222
}
1226-
for _, comment := range fn.Comments() {
1223+
for _, comment := range fn.Comments {
12271224
sw.Do("// $.$\n", comment)
12281225
}
12291226
sw.Do("var $.varName|private$ = $.initFn|raw$", targs)
1230-
typeArgs := variable.Init().TypeArgs()
1227+
typeArgs := variable.Init().TypeArgs
12311228
if len(typeArgs) > 0 {
12321229
sw.Do("[", nil)
12331230
for i, typeArg := range typeArgs {
@@ -1239,11 +1236,11 @@ func (g *genValidations) emitValidationVariables(c *generator.Context, t *types.
12391236
sw.Do("]", nil)
12401237
}
12411238
sw.Do("(", targs)
1242-
for i, arg := range supportInitArgs {
1243-
toGolangSourceDataLiteral(sw, c, arg)
1244-
if i < len(supportInitArgs)-1 {
1239+
for i, arg := range fn.Args {
1240+
if i != 0 {
12451241
sw.Do(", ", nil)
12461242
}
1243+
toGolangSourceDataLiteral(sw, c, arg)
12471244
}
12481245
sw.Do(")\n", nil)
12491246

@@ -1277,22 +1274,21 @@ func toGolangSourceDataLiteral(sw *generator.SnippetWriter, c *generator.Context
12771274
case *validators.PrivateVar:
12781275
sw.Do("$.|private$", c.Universe.Type(types.Name(*v)))
12791276
case validators.WrapperFunction:
1280-
fn, extraArgs := v.Function.SignatureAndArgs()
1281-
if len(extraArgs) == 0 {
1277+
if extraArgs := v.Function.Args; len(extraArgs) == 0 {
12821278
// If the function to be wrapped has no additional arguments, we can
12831279
// just use it directly.
12841280
targs := generator.Args{
1285-
"funcName": c.Universe.Type(fn),
1281+
"funcName": c.Universe.Type(v.Function.Function),
12861282
}
1287-
for _, comment := range v.Function.Comments() {
1283+
for _, comment := range v.Function.Comments {
12881284
sw.Do("// $.$\n", comment)
12891285
}
12901286
sw.Do("$.funcName|raw$", targs)
12911287
} else {
12921288
// If the function to be wrapped has additional arguments, we need
12931289
// a "standard signature" validation function to wrap it.
12941290
targs := generator.Args{
1295-
"funcName": c.Universe.Type(fn),
1291+
"funcName": c.Universe.Type(v.Function.Function),
12961292
"field": mkSymbolArgs(c, fieldPkgSymbols),
12971293
"operation": mkSymbolArgs(c, operationPkgSymbols),
12981294
"context": mkSymbolArgs(c, contextPkgSymbols),
@@ -1305,7 +1301,7 @@ func toGolangSourceDataLiteral(sw *generator.SnippetWriter, c *generator.Context
13051301

13061302
emitCall := func() {
13071303
sw.Do("return $.funcName|raw$", targs)
1308-
typeArgs := v.Function.TypeArgs()
1304+
typeArgs := v.Function.TypeArgs
13091305
if len(typeArgs) > 0 {
13101306
sw.Do("[", nil)
13111307
for i, typeArg := range typeArgs {

staging/src/k8s.io/code-generator/cmd/validation-gen/validators/each.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,8 @@ func (evtv eachValTagValidator) getValidations(fldPath *field.Path, t *types.Typ
250250

251251
// ForEachVal returns a validation that applies a function to each element of
252252
// a list or map.
253-
func ForEachVal(fldPath *field.Path, t *types.Type, fn FunctionGen) (Validations, error) {
254-
return globalEachVal.getValidations(fldPath, t, Validations{Functions: []FunctionGen{fn}})
253+
func ForEachVal(fldPath *field.Path, t *types.Type, fn *FunctionGen) (Validations, error) {
254+
return globalEachVal.getValidations(fldPath, t, Validations{Functions: []*FunctionGen{fn}})
255255
}
256256

257257
func (evtv eachValTagValidator) getListValidations(fldPath *field.Path, t *types.Type, validations Validations) (Validations, error) {
@@ -286,7 +286,7 @@ func (evtv eachValTagValidator) getListValidations(fldPath *field.Path, t *types
286286
cmpFn.Body = buf.String()
287287
cmpArg = cmpFn
288288
}
289-
f := Function(eachValTagName, vfn.Flags(), validateEachSliceVal, cmpArg, WrapperFunction{vfn, t.Elem})
289+
f := Function(eachValTagName, vfn.Flags, validateEachSliceVal, cmpArg, WrapperFunction{vfn, t.Elem})
290290
result.Functions = append(result.Functions, f)
291291
}
292292

@@ -298,7 +298,7 @@ func (evtv eachValTagValidator) getMapValidations(t *types.Type, validations Val
298298
result.OpaqueValType = validations.OpaqueType
299299

300300
for _, vfn := range validations.Functions {
301-
f := Function(eachValTagName, vfn.Flags(), validateEachMapVal, WrapperFunction{vfn, t.Elem})
301+
f := Function(eachValTagName, vfn.Flags, validateEachMapVal, WrapperFunction{vfn, t.Elem})
302302
result.Functions = append(result.Functions, f)
303303
}
304304

@@ -369,16 +369,16 @@ func (ektv eachKeyTagValidator) getValidations(t *types.Type, validations Valida
369369
result := Validations{}
370370
result.OpaqueKeyType = validations.OpaqueType
371371
for _, vfn := range validations.Functions {
372-
f := Function(eachKeyTagName, vfn.Flags(), validateEachMapKey, WrapperFunction{vfn, t.Key})
372+
f := Function(eachKeyTagName, vfn.Flags, validateEachMapKey, WrapperFunction{vfn, t.Key})
373373
result.Functions = append(result.Functions, f)
374374
}
375375
return result, nil
376376
}
377377

378378
// ForEachKey returns a validation that applies a function to each key of
379379
// a map.
380-
func ForEachKey(_ *field.Path, t *types.Type, fn FunctionGen) (Validations, error) {
381-
return globalEachKey.getValidations(t, Validations{Functions: []FunctionGen{fn}})
380+
func ForEachKey(_ *field.Path, t *types.Type, fn *FunctionGen) (Validations, error) {
381+
return globalEachKey.getValidations(t, Validations{Functions: []*FunctionGen{fn}})
382382
}
383383

384384
func (ektv eachKeyTagValidator) Docs() TagDoc {

staging/src/k8s.io/code-generator/cmd/validation-gen/validators/registry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func (reg *registry) sortTagsIntoPhases(tags map[string][]gengo.Tag) [][]string
165165
// Tag extraction will retain the relative order between 111 and 222, but
166166
// 333 is extracted as tag "k8s:ifOptionEnabled". Those are all in a map,
167167
// which we iterate (in a random order). When it reaches the emit stage,
168-
// the "ifOptionEnabled" part is gone, and we will have 3 functionGen
168+
// the "ifOptionEnabled" part is gone, and we will have 3 FunctionGen
169169
// objects, all with tag "k8s:validateFalse", in a non-deterministic order
170170
// because of the map iteration. If we sort them at that point, we won't
171171
// have enough information to do something smart, unless we look at the

staging/src/k8s.io/code-generator/cmd/validation-gen/validators/required.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ func (rtv requirednessTagValidator) doRequired(context Context) (Validations, er
9696
// do manual dispatch here.
9797
switch context.Type.Kind {
9898
case types.Slice:
99-
return Validations{Functions: []FunctionGen{Function(requiredTagName, ShortCircuit, requiredSliceValidator)}}, nil
99+
return Validations{Functions: []*FunctionGen{Function(requiredTagName, ShortCircuit, requiredSliceValidator)}}, nil
100100
case types.Map:
101-
return Validations{Functions: []FunctionGen{Function(requiredTagName, ShortCircuit, requiredMapValidator)}}, nil
101+
return Validations{Functions: []*FunctionGen{Function(requiredTagName, ShortCircuit, requiredMapValidator)}}, nil
102102
case types.Pointer:
103-
return Validations{Functions: []FunctionGen{Function(requiredTagName, ShortCircuit, requiredPointerValidator)}}, nil
103+
return Validations{Functions: []*FunctionGen{Function(requiredTagName, ShortCircuit, requiredPointerValidator)}}, nil
104104
case types.Struct:
105105
// The +k8s:required tag on a non-pointer struct is not supported.
106106
// If you encounter this error and believe you have a valid use case
@@ -109,7 +109,7 @@ func (rtv requirednessTagValidator) doRequired(context Context) (Validations, er
109109
// this behavior or provide alternative validation mechanisms.
110110
return Validations{}, fmt.Errorf("non-pointer structs cannot use the %q tag", requiredTagName)
111111
}
112-
return Validations{Functions: []FunctionGen{Function(requiredTagName, ShortCircuit, requiredValueValidator)}}, nil
112+
return Validations{Functions: []*FunctionGen{Function(requiredTagName, ShortCircuit, requiredValueValidator)}}, nil
113113
}
114114

115115
var (
@@ -167,11 +167,11 @@ func (rtv requirednessTagValidator) doOptional(context Context) (Validations, er
167167
// do manual dispatch here.
168168
switch context.Type.Kind {
169169
case types.Slice:
170-
return Validations{Functions: []FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalSliceValidator)}}, nil
170+
return Validations{Functions: []*FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalSliceValidator)}}, nil
171171
case types.Map:
172-
return Validations{Functions: []FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalMapValidator)}}, nil
172+
return Validations{Functions: []*FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalMapValidator)}}, nil
173173
case types.Pointer:
174-
return Validations{Functions: []FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalPointerValidator)}}, nil
174+
return Validations{Functions: []*FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalPointerValidator)}}, nil
175175
case types.Struct:
176176
// The +k8s:optional tag on a non-pointer struct is not supported.
177177
// If you encounter this error and believe you have a valid use case
@@ -180,7 +180,7 @@ func (rtv requirednessTagValidator) doOptional(context Context) (Validations, er
180180
// this behavior or provide alternative validation mechanisms.
181181
return Validations{}, fmt.Errorf("non-pointer structs cannot use the %q tag", optionalTagName)
182182
}
183-
return Validations{Functions: []FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalValueValidator)}}, nil
183+
return Validations{Functions: []*FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalValueValidator)}}, nil
184184
}
185185

186186
// hasZeroDefault returns whether the field has a default value and whether
@@ -268,21 +268,21 @@ func (requirednessTagValidator) doForbidden(context Context) (Validations, error
268268
switch context.Type.Kind {
269269
case types.Slice:
270270
return Validations{
271-
Functions: []FunctionGen{
271+
Functions: []*FunctionGen{
272272
Function(forbiddenTagName, ShortCircuit, forbiddenSliceValidator),
273273
Function(forbiddenTagName, ShortCircuit|NonError, optionalSliceValidator),
274274
},
275275
}, nil
276276
case types.Map:
277277
return Validations{
278-
Functions: []FunctionGen{
278+
Functions: []*FunctionGen{
279279
Function(forbiddenTagName, ShortCircuit, forbiddenMapValidator),
280280
Function(forbiddenTagName, ShortCircuit|NonError, optionalMapValidator),
281281
},
282282
}, nil
283283
case types.Pointer:
284284
return Validations{
285-
Functions: []FunctionGen{
285+
Functions: []*FunctionGen{
286286
Function(forbiddenTagName, ShortCircuit, forbiddenPointerValidator),
287287
Function(forbiddenTagName, ShortCircuit|NonError, optionalPointerValidator),
288288
},
@@ -296,7 +296,7 @@ func (requirednessTagValidator) doForbidden(context Context) (Validations, error
296296
return Validations{}, fmt.Errorf("non-pointer structs cannot use the %q tag", forbiddenTagName)
297297
}
298298
return Validations{
299-
Functions: []FunctionGen{
299+
Functions: []*FunctionGen{
300300
Function(forbiddenTagName, ShortCircuit, forbiddenValueValidator),
301301
Function(forbiddenTagName, ShortCircuit|NonError, optionalValueValidator),
302302
},

staging/src/k8s.io/code-generator/cmd/validation-gen/validators/subfield.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func (stv subfieldTagValidator) GetValidations(context Context, args []string, p
100100
Results: []ParamResult{{"", nilableFieldType}},
101101
}
102102
getFn.Body = fmt.Sprintf("return %so.%s", fieldExprPrefix, submemb.Name)
103-
f := Function(subfieldTagName, vfn.Flags(), validateSubfield, subname, getFn, WrapperFunction{vfn, submemb.Type})
103+
f := Function(subfieldTagName, vfn.Flags, validateSubfield, subname, getFn, WrapperFunction{vfn, submemb.Type})
104104
result.Functions = append(result.Functions, f)
105105
result.Variables = append(result.Variables, validations.Variables...)
106106
}

staging/src/k8s.io/code-generator/cmd/validation-gen/validators/testing.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (frtv fixedResultTagValidator) GetValidations(context Context, _ []string,
7373
if err != nil {
7474
return result, fmt.Errorf("can't decode tag payload: %w", err)
7575
}
76-
result.AddFunction(GenericFunction(frtv.TagName(), tag.flags, fixedResultValidator, tag.typeArgs, frtv.result, tag.msg))
76+
result.AddFunction(Function(frtv.TagName(), tag.flags, fixedResultValidator, frtv.result, tag.msg).WithTypeArgs(tag.typeArgs...))
7777

7878
return result, nil
7979
}

0 commit comments

Comments
 (0)