@@ -20,6 +20,7 @@ import (
20
20
"go/ast"
21
21
22
22
"golang.org/x/tools/go/analysis"
23
+ "k8s.io/apimachinery/pkg/util/sets"
23
24
24
25
kalerrors "sigs.k8s.io/kube-api-linter/pkg/analysis/errors"
25
26
"sigs.k8s.io/kube-api-linter/pkg/analysis/helpers/extractjsontags"
@@ -47,37 +48,54 @@ func run(pass *analysis.Pass) (any, error) {
47
48
}
48
49
49
50
inspect .InspectFields (func (field * ast.Field , _ []ast.Node , _ extractjsontags.FieldTagInfo , markersAccess markers.Markers ) {
50
- if len (field .Names ) == 0 {
51
- return
52
- }
53
51
checkField (pass , field , markersAccess )
54
52
})
55
53
54
+ inspect .InspectTypeSpec (func (typeSpec * ast.TypeSpec , markersAccess markers.Markers ) {
55
+ checkTypeSpec (pass , typeSpec , markersAccess )
56
+ })
57
+
56
58
return nil , nil //nolint:nilnil
57
59
}
58
60
59
61
func checkField (pass * analysis.Pass , field * ast.Field , markersAccess markers.Markers ) {
60
- set := markersAccess .FieldMarkers (field )
62
+ if field == nil || len (field .Names ) == 0 {
63
+ return
64
+ }
61
65
62
- fieldName := field . Names [ 0 ]. Name
66
+ fieldMarkers := markersAccess . FieldMarkers ( field )
63
67
64
- for _ , marker := range set .UnsortedList () {
65
- // TODO: Add check whether the marker is a duuplicate or not.
68
+ set := sets .New [string ]()
69
+
70
+ for _ , marker := range fieldMarkers .UnsortedList () {
71
+ if ! set .Has (marker .String ()) {
72
+ set .Insert (marker .String ())
73
+ continue
74
+ }
66
75
pass .Report (analysis.Diagnostic {
67
76
Pos : field .Pos (),
68
- Message : fmt .Sprintf ("%s has duplicated markers %s" , fieldName , marker .String ()),
69
- SuggestedFixes : []analysis.SuggestedFix {
70
- {
71
- Message : fmt .Sprintf ("should remove `// +%s`" , marker .String ()),
72
- TextEdits : []analysis.TextEdit {
73
- {
74
- Pos : marker .Pos ,
75
- End : marker .End ,
76
- NewText : nil ,
77
- },
78
- },
79
- },
80
- },
77
+ Message : fmt .Sprintf ("%s has duplicated markers %s" , field .Names [0 ].Name , marker .String ()),
78
+ })
79
+ }
80
+ }
81
+
82
+ func checkTypeSpec (pass * analysis.Pass , typeSpec * ast.TypeSpec , markersAccess markers.Markers ) {
83
+ if typeSpec == nil {
84
+ return
85
+ }
86
+
87
+ typeMarkers := markersAccess .TypeMarkers (typeSpec )
88
+
89
+ set := sets .New [string ]()
90
+
91
+ for _ , marker := range typeMarkers .UnsortedList () {
92
+ if ! set .Has (marker .String ()) {
93
+ set .Insert (marker .String ())
94
+ continue
95
+ }
96
+ pass .Report (analysis.Diagnostic {
97
+ Pos : typeSpec .Pos (),
98
+ Message : fmt .Sprintf ("%s has duplicated markers %s" , typeSpec .Name .Name , marker .String ()),
81
99
})
82
100
}
83
101
}
0 commit comments