Skip to content

Commit 33e0e43

Browse files
authored
Merge pull request #183 from JoelSpeed/fix-preferred-markers
Fix conflicts between preferred markers and qualified name changes
2 parents fdcba6a + c0fcbd0 commit 33e0e43

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

pkg/analysis/preferredmarkers/analyzer.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ func (a *analyzer) run(pass *analysis.Pass) (any, error) {
7474
return nil, kalerrors.ErrCouldNotGetInspector
7575
}
7676

77-
inspect.InspectFields(func(field *ast.Field, _ extractjsontags.FieldTagInfo, markersAccess markers.Markers) {
78-
checkField(pass, field, markersAccess, a.equivalentToPreferred)
77+
inspect.InspectFields(func(field *ast.Field, _ extractjsontags.FieldTagInfo, markersAccess markers.Markers, qualifiedFieldName string) {
78+
checkField(pass, field, markersAccess, a.equivalentToPreferred, qualifiedFieldName)
7979
})
8080

8181
inspect.InspectTypeSpec(func(typeSpec *ast.TypeSpec, markersAccess markers.Markers) {
@@ -88,14 +88,14 @@ func (a *analyzer) run(pass *analysis.Pass) (any, error) {
8888
// checkField validates a single struct field for marker usage.
8989
// Only checks markers directly on the field, not inherited from type aliases,
9090
// since inherited markers are already reported at the type level.
91-
func checkField(pass *analysis.Pass, field *ast.Field, markersAccess markers.Markers, equivalentToPreferred map[string]string) {
91+
func checkField(pass *analysis.Pass, field *ast.Field, markersAccess markers.Markers, equivalentToPreferred map[string]string, qualifiedFieldName string) {
9292
if field == nil || len(field.Names) == 0 {
9393
return
9494
}
9595

9696
markerSet := markersAccess.FieldMarkers(field)
9797
check(markerSet, equivalentToPreferred, func(marks []markers.Marker, preferredIdentifier string, preferredExists bool) {
98-
reportMarkers(pass, marks, preferredIdentifier, field.Names[0].Name, field.Pos(), "field", preferredExists)
98+
reportMarkers(pass, marks, preferredIdentifier, qualifiedFieldName, field.Pos(), "field", preferredExists)
9999
})
100100
}
101101

pkg/analysis/preferredmarkers/testdata/src/a/a.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,35 +44,35 @@ type MultipleEquivalentMarkersType string // want `type MultipleEquivalentMarker
4444
type Test struct {
4545
// Field with kubebuilder optional marker (should be k8s:optional)
4646
// +kubebuilder:validation:Optional
47-
OptionalFieldKubebuilder string `json:"optionalFieldKubebuilder"` // want `field OptionalFieldKubebuilder uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
47+
OptionalFieldKubebuilder string `json:"optionalFieldKubebuilder"` // want `field Test.OptionalFieldKubebuilder uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
4848

4949
// Inherited from type alias (not reported since type is already checked)
5050
OptionalFieldKubebuilderTypeAlias OptionalTypeKubebuilder `json:"optionalFieldKubebuilderTypeAlias"`
5151

5252
// Field with custom optional marker (should be k8s:optional)
5353
// +custom:optional
54-
OptionalFieldCustom string `json:"optionalFieldCustom"` // want `field OptionalFieldCustom uses marker "custom:optional", should use preferred marker "k8s:optional" instead`
54+
OptionalFieldCustom string `json:"optionalFieldCustom"` // want `field Test.OptionalFieldCustom uses marker "custom:optional", should use preferred marker "k8s:optional" instead`
5555

5656
// Inherited from type alias (not reported since type is already checked)
5757
OptionalFieldCustomTypeAlias OptionalTypeCustom `json:"optionalFieldCustomTypeAlias"`
5858

5959
// Field with kubebuilder required marker (should be k8s:required)
6060
// +kubebuilder:validation:Required
61-
RequiredFieldKubebuilder string `json:"requiredFieldKubebuilder"` // want `field RequiredFieldKubebuilder uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
61+
RequiredFieldKubebuilder string `json:"requiredFieldKubebuilder"` // want `field Test.RequiredFieldKubebuilder uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
6262

6363
// Inherited from type alias (not reported since type is already checked)
6464
RequiredFieldKubebuilderTypeAlias RequiredTypeKubebuilder `json:"requiredFieldKubebuilderTypeAlias"`
6565

6666
// Field with custom old marker (should be custom:preferred)
6767
// +custom:old
68-
CustomOldField string `json:"customOldField"` // want `field CustomOldField uses marker "custom:old", should use preferred marker "custom:preferred" instead`
68+
CustomOldField string `json:"customOldField"` // want `field Test.CustomOldField uses marker "custom:old", should use preferred marker "custom:preferred" instead`
6969

7070
// Inherited from type alias (not reported since type is already checked)
7171
CustomOldFieldTypeAlias CustomOldType `json:"customOldFieldTypeAlias"`
7272

7373
// Field with custom deprecated marker (should be custom:preferred)
7474
// +custom:deprecated
75-
CustomDeprecatedField string `json:"customDeprecatedField"` // want `field CustomDeprecatedField uses marker "custom:deprecated", should use preferred marker "custom:preferred" instead`
75+
CustomDeprecatedField string `json:"customDeprecatedField"` // want `field Test.CustomDeprecatedField uses marker "custom:deprecated", should use preferred marker "custom:preferred" instead`
7676

7777
// Inherited from type alias (not reported since type is already checked)
7878
CustomDeprecatedFieldTypeAlias CustomDeprecatedType `json:"customDeprecatedFieldTypeAlias"`
@@ -108,18 +108,18 @@ type Test struct {
108108
// Field with multiple equivalent markers (both should be reported)
109109
// +kubebuilder:validation:Optional
110110
// +custom:optional
111-
MultipleEquivalentMarkersField string `json:"multipleEquivalentMarkersField"` // want `field MultipleEquivalentMarkersField uses markers "custom:optional", "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
111+
MultipleEquivalentMarkersField string `json:"multipleEquivalentMarkersField"` // want `field Test.MultipleEquivalentMarkersField uses markers "custom:optional", "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
112112

113113
// Inherited from type alias with multiple markers (not reported since type is already checked)
114114
MultipleEquivalentMarkersFieldTypeAlias MultipleEquivalentMarkersType `json:"multipleEquivalentMarkersFieldTypeAlias"`
115115

116116
// Test marker with unnamed expression (should preserve expression)
117117
// +kubebuilder:validation:Optional:=someValue
118-
OptionalWithUnnamedExpression string `json:"optionalWithUnnamedExpression"` // want `field OptionalWithUnnamedExpression uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
118+
OptionalWithUnnamedExpression string `json:"optionalWithUnnamedExpression"` // want `field Test.OptionalWithUnnamedExpression uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
119119

120120
// Test marker with named expressions (should preserve expressions)
121121
// +custom:old:key1=val1,key2=val2
122-
CustomWithNamedExpressions string `json:"customWithNamedExpressions"` // want `field CustomWithNamedExpressions uses marker "custom:old", should use preferred marker "custom:preferred" instead`
122+
CustomWithNamedExpressions string `json:"customWithNamedExpressions"` // want `field Test.CustomWithNamedExpressions uses marker "custom:old", should use preferred marker "custom:preferred" instead`
123123
}
124124

125125
// Type with unnamed expression (should preserve expression)
@@ -145,10 +145,10 @@ type EdgeCaseTest struct {
145145
// Field with both preferred and equivalent markers (should only remove equivalent)
146146
// +k8s:optional
147147
// +kubebuilder:validation:Optional
148-
FieldWithBothPreferredAndEquivalent string `json:"fieldWithBothPreferredAndEquivalent"` // want `field FieldWithBothPreferredAndEquivalent uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
148+
FieldWithBothPreferredAndEquivalent string `json:"fieldWithBothPreferredAndEquivalent"` // want `field EdgeCaseTest.FieldWithBothPreferredAndEquivalent uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
149149

150150
// Field with both preferred and multiple equivalent markers (should remove all equivalents)
151151
// +k8s:required
152152
// +kubebuilder:validation:Required
153-
FieldWithPreferredAndMultipleEquivalents string `json:"fieldWithPreferredAndMultipleEquivalents"` // want `field FieldWithPreferredAndMultipleEquivalents uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
153+
FieldWithPreferredAndMultipleEquivalents string `json:"fieldWithPreferredAndMultipleEquivalents"` // want `field EdgeCaseTest.FieldWithPreferredAndMultipleEquivalents uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
154154
}

pkg/analysis/preferredmarkers/testdata/src/a/a.go.golden

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,35 +43,35 @@ type MultipleEquivalentMarkersType string // want `type MultipleEquivalentMarker
4343
type Test struct {
4444
// Field with kubebuilder optional marker (should be k8s:optional)
4545
// +k8s:optional
46-
OptionalFieldKubebuilder string `json:"optionalFieldKubebuilder"` // want `field OptionalFieldKubebuilder uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
46+
OptionalFieldKubebuilder string `json:"optionalFieldKubebuilder"` // want `field Test.OptionalFieldKubebuilder uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
4747

4848
// Inherited from type alias (not reported since type is already checked)
4949
OptionalFieldKubebuilderTypeAlias OptionalTypeKubebuilder `json:"optionalFieldKubebuilderTypeAlias"`
5050

5151
// Field with custom optional marker (should be k8s:optional)
5252
// +k8s:optional
53-
OptionalFieldCustom string `json:"optionalFieldCustom"` // want `field OptionalFieldCustom uses marker "custom:optional", should use preferred marker "k8s:optional" instead`
53+
OptionalFieldCustom string `json:"optionalFieldCustom"` // want `field Test.OptionalFieldCustom uses marker "custom:optional", should use preferred marker "k8s:optional" instead`
5454

5555
// Inherited from type alias (not reported since type is already checked)
5656
OptionalFieldCustomTypeAlias OptionalTypeCustom `json:"optionalFieldCustomTypeAlias"`
5757

5858
// Field with kubebuilder required marker (should be k8s:required)
5959
// +k8s:required
60-
RequiredFieldKubebuilder string `json:"requiredFieldKubebuilder"` // want `field RequiredFieldKubebuilder uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
60+
RequiredFieldKubebuilder string `json:"requiredFieldKubebuilder"` // want `field Test.RequiredFieldKubebuilder uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
6161

6262
// Inherited from type alias (not reported since type is already checked)
6363
RequiredFieldKubebuilderTypeAlias RequiredTypeKubebuilder `json:"requiredFieldKubebuilderTypeAlias"`
6464

6565
// Field with custom old marker (should be custom:preferred)
6666
// +custom:preferred
67-
CustomOldField string `json:"customOldField"` // want `field CustomOldField uses marker "custom:old", should use preferred marker "custom:preferred" instead`
67+
CustomOldField string `json:"customOldField"` // want `field Test.CustomOldField uses marker "custom:old", should use preferred marker "custom:preferred" instead`
6868

6969
// Inherited from type alias (not reported since type is already checked)
7070
CustomOldFieldTypeAlias CustomOldType `json:"customOldFieldTypeAlias"`
7171

7272
// Field with custom deprecated marker (should be custom:preferred)
7373
// +custom:preferred
74-
CustomDeprecatedField string `json:"customDeprecatedField"` // want `field CustomDeprecatedField uses marker "custom:deprecated", should use preferred marker "custom:preferred" instead`
74+
CustomDeprecatedField string `json:"customDeprecatedField"` // want `field Test.CustomDeprecatedField uses marker "custom:deprecated", should use preferred marker "custom:preferred" instead`
7575

7676
// Inherited from type alias (not reported since type is already checked)
7777
CustomDeprecatedFieldTypeAlias CustomDeprecatedType `json:"customDeprecatedFieldTypeAlias"`
@@ -106,18 +106,18 @@ type Test struct {
106106

107107
// Field with multiple equivalent markers (both should be reported)
108108
// +k8s:optional
109-
MultipleEquivalentMarkersField string `json:"multipleEquivalentMarkersField"` // want `field MultipleEquivalentMarkersField uses markers "custom:optional", "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
109+
MultipleEquivalentMarkersField string `json:"multipleEquivalentMarkersField"` // want `field Test.MultipleEquivalentMarkersField uses markers "custom:optional", "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
110110

111111
// Inherited from type alias with multiple markers (not reported since type is already checked)
112112
MultipleEquivalentMarkersFieldTypeAlias MultipleEquivalentMarkersType `json:"multipleEquivalentMarkersFieldTypeAlias"`
113113

114114
// Test marker with unnamed expression (should preserve expression)
115115
// +k8s:optional=someValue
116-
OptionalWithUnnamedExpression string `json:"optionalWithUnnamedExpression"` // want `field OptionalWithUnnamedExpression uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
116+
OptionalWithUnnamedExpression string `json:"optionalWithUnnamedExpression"` // want `field Test.OptionalWithUnnamedExpression uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
117117

118118
// Test marker with named expressions (should preserve expressions)
119119
// +custom:preferred:key1=val1,key2=val2
120-
CustomWithNamedExpressions string `json:"customWithNamedExpressions"` // want `field CustomWithNamedExpressions uses marker "custom:old", should use preferred marker "custom:preferred" instead`
120+
CustomWithNamedExpressions string `json:"customWithNamedExpressions"` // want `field Test.CustomWithNamedExpressions uses marker "custom:old", should use preferred marker "custom:preferred" instead`
121121
}
122122

123123
// Type with unnamed expression (should preserve expression)
@@ -139,9 +139,9 @@ type TypeWithPreferredAndMultipleEquivalents string // want `type TypeWithPrefer
139139
type EdgeCaseTest struct {
140140
// Field with both preferred and equivalent markers (should only remove equivalent)
141141
// +k8s:optional
142-
FieldWithBothPreferredAndEquivalent string `json:"fieldWithBothPreferredAndEquivalent"` // want `field FieldWithBothPreferredAndEquivalent uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
142+
FieldWithBothPreferredAndEquivalent string `json:"fieldWithBothPreferredAndEquivalent"` // want `field EdgeCaseTest.FieldWithBothPreferredAndEquivalent uses marker "kubebuilder:validation:Optional", should use preferred marker "k8s:optional" instead`
143143

144144
// Field with both preferred and multiple equivalent markers (should remove all equivalents)
145145
// +k8s:required
146-
FieldWithPreferredAndMultipleEquivalents string `json:"fieldWithPreferredAndMultipleEquivalents"` // want `field FieldWithPreferredAndMultipleEquivalents uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
146+
FieldWithPreferredAndMultipleEquivalents string `json:"fieldWithPreferredAndMultipleEquivalents"` // want `field EdgeCaseTest.FieldWithPreferredAndMultipleEquivalents uses marker "kubebuilder:validation:Required", should use preferred marker "k8s:required" instead`
147147
}

0 commit comments

Comments
 (0)