diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go index 3c5529ccf39..491c9f9fa38 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go @@ -627,9 +627,9 @@ func (td *typeDiscoverer) discoverStruct(thisNode *typeNode, fldPath *field.Path context := validators.Context{ Scope: validators.ScopeField, Type: childType, - ParentPath: fldPath, - Member: &memb, Path: childPath, + Member: &memb, + ParentPath: fldPath, } tags, err := td.validator.ExtractTags(context, memb.CommentLines) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/each.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/each.go index d0f3bbc0a02..a42a1fd2c80 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/each.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/each.go @@ -401,13 +401,15 @@ func (evtv eachValTagValidator) GetValidations(context Context, tag codetags.Tag switch nt.Kind { case types.Slice, types.Array, types.Map: default: - return Validations{}, fmt.Errorf("can only be used on list or map types (%s)", t.Kind) + return Validations{}, fmt.Errorf("can only be used on list or map types (%s)", nt.Kind) } elemContext := Context{ + // Scope is initialized below. Type: nt.Elem, + Path: context.Path.Key("(vals)"), + Member: nil, // NA for list/map values ParentPath: context.Path, - Path: context.Path.Key("*"), } switch nt.Kind { case types.Slice, types.Array: @@ -571,16 +573,18 @@ var ( func (ektv eachKeyTagValidator) GetValidations(context Context, tag codetags.Tag) (Validations, error) { // NOTE: pointers to lists are not supported, so we should never see a pointer here. - t := util.NativeType(context.Type) - if t.Kind != types.Map { - return Validations{}, fmt.Errorf("can only be used on map types (%s)", t.Kind) + t := context.Type + nt := util.NativeType(t) + if nt.Kind != types.Map { + return Validations{}, fmt.Errorf("can only be used on map types (%s)", nt.Kind) } elemContext := Context{ Scope: ScopeMapKey, - Type: t.Elem, + Type: nt.Elem, + Path: context.Path.Key("(keys)"), + Member: nil, // NA for map keys ParentPath: context.Path, - Path: context.Path.Child("(keys)"), } if validations, err := ektv.validator.ExtractValidations(elemContext, *tag.ValueTag); err != nil { @@ -595,12 +599,13 @@ func (ektv eachKeyTagValidator) GetValidations(context Context, tag codetags.Tag } func (ektv eachKeyTagValidator) getValidations(t *types.Type, validations Validations) (Validations, error) { + nt := util.NativeType(t) result := Validations{} result.OpaqueKeyType = validations.OpaqueType for _, vfn := range validations.Functions { comm := vfn.Comments vfn.Comments = nil - f := Function(eachKeyTagName, vfn.Flags, validateEachMapKey, WrapperFunction{vfn, t.Key}).WithComments(comm...) + f := Function(eachKeyTagName, vfn.Flags, validateEachMapKey, WrapperFunction{vfn, nt.Key}).WithComments(comm...) result.AddFunction(f) } return result, nil diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/item.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/item.go index 2cc5e150310..5cd5c9e3b5a 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/item.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/item.go @@ -261,8 +261,8 @@ func (iv itemValidator) GetValidations(context Context) (Validations, error) { Scope: ScopeListVal, Type: elemT, Path: context.Path.Key(subContextPath), + Member: nil, // NA for list items ParentPath: context.Path, - Member: nil, } validations, err := iv.validator.ExtractValidations(subContext, item.valueTag) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/subfield.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/subfield.go index 8349250e9ba..cf9a130cd51 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/subfield.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/subfield.go @@ -59,12 +59,13 @@ func (stv subfieldTagValidator) GetValidations(context Context, tag codetags.Tag args := tag.Args // This tag can apply to value and pointer fields, as well as typedefs // (which should never be pointers). We need to check the concrete type. - t := util.NonPointer(util.NativeType(context.Type)) - if t.Kind != types.Struct { - return Validations{}, fmt.Errorf("can only be used on struct types") + t := context.Type + nt := util.NonPointer(util.NativeType(t)) + if nt.Kind != types.Struct { + return Validations{}, fmt.Errorf("can only be used on struct types: %v", nt.Kind) } subname := args[0].Value - submemb := util.GetMemberByJSON(t, subname) + submemb := util.GetMemberByJSON(nt, subname) if submemb == nil { return Validations{}, fmt.Errorf("no field for json name %q", subname) } @@ -72,9 +73,9 @@ func (stv subfieldTagValidator) GetValidations(context Context, tag codetags.Tag subContext := Context{ Scope: ScopeField, Type: submemb.Type, - ParentPath: context.Path, - Member: submemb, Path: context.Path.Child(subname), + Member: submemb, + ParentPath: context.Path, } if validations, err := stv.validator.ExtractValidations(subContext, *tag.ValueTag); err != nil { return Validations{}, err