@@ -120,7 +120,7 @@ func (e *errchkjson) handleJSONMarshal(pass *analysis.Pass, ce *ast.CallExpr, fn
120
120
t = t .(* types.Pointer ).Elem ()
121
121
}
122
122
123
- err := e .jsonSafe (t , 0 )
123
+ err := e .jsonSafe (t , 0 , map [types. Type ] struct {}{} )
124
124
if err != nil {
125
125
if _ , ok := err .(unsupported ); ok {
126
126
pass .Reportf (ce .Pos (), "`%s` for %v" , fnName , err )
@@ -149,7 +149,11 @@ const (
149
149
unsupportedBasicTypes = types .IsComplex
150
150
)
151
151
152
- func (e * errchkjson ) jsonSafe (t types.Type , level int ) error {
152
+ func (e * errchkjson ) jsonSafe (t types.Type , level int , seenTypes map [types.Type ]struct {}) error {
153
+ if _ , ok := seenTypes [t ]; ok {
154
+ return nil
155
+ }
156
+
153
157
if types .Implements (t , textMarshalerInterface ()) {
154
158
return fmt .Errorf ("unsafe type `%s` found" , t .String ())
155
159
}
@@ -176,20 +180,21 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
176
180
}
177
181
178
182
case * types.Array :
179
- err := e .jsonSafe (ut .Elem (), level + 1 )
183
+ err := e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
180
184
if err != nil {
181
185
return err
182
186
}
183
187
return nil
184
188
185
189
case * types.Slice :
186
- err := e .jsonSafe (ut .Elem (), level + 1 )
190
+ err := e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
187
191
if err != nil {
188
192
return err
189
193
}
190
194
return nil
191
195
192
196
case * types.Struct :
197
+ seenTypes [t ] = struct {}{}
193
198
exported := 0
194
199
for i := 0 ; i < ut .NumFields (); i ++ {
195
200
if ! ut .Field (i ).Exported () {
@@ -202,7 +207,7 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
202
207
continue
203
208
}
204
209
}
205
- err := e .jsonSafe (ut .Field (i ).Type (), level + 1 )
210
+ err := e .jsonSafe (ut .Field (i ).Type (), level + 1 , seenTypes )
206
211
if err != nil {
207
212
return err
208
213
}
@@ -214,7 +219,7 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
214
219
return nil
215
220
216
221
case * types.Pointer :
217
- err := e .jsonSafe (ut .Elem (), level + 1 )
222
+ err := e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
218
223
if err != nil {
219
224
return err
220
225
}
@@ -225,7 +230,7 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
225
230
if err != nil {
226
231
return err
227
232
}
228
- err = e .jsonSafe (ut .Elem (), level + 1 )
233
+ err = e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
229
234
if err != nil {
230
235
return err
231
236
}
0 commit comments