@@ -120,7 +120,7 @@ func (e *errchkjson) handleJSONMarshal(pass *analysis.Pass, ce *ast.CallExpr, fn
120120 t = t .(* types.Pointer ).Elem ()
121121 }
122122
123- err := e .jsonSafe (t , 0 )
123+ err := e .jsonSafe (t , 0 , map [types. Type ] struct {}{} )
124124 if err != nil {
125125 if _ , ok := err .(unsupported ); ok {
126126 pass .Reportf (ce .Pos (), "`%s` for %v" , fnName , err )
@@ -149,7 +149,11 @@ const (
149149 unsupportedBasicTypes = types .IsComplex
150150)
151151
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+
153157 if types .Implements (t , textMarshalerInterface ()) {
154158 return fmt .Errorf ("unsafe type `%s` found" , t .String ())
155159 }
@@ -176,20 +180,21 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
176180 }
177181
178182 case * types.Array :
179- err := e .jsonSafe (ut .Elem (), level + 1 )
183+ err := e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
180184 if err != nil {
181185 return err
182186 }
183187 return nil
184188
185189 case * types.Slice :
186- err := e .jsonSafe (ut .Elem (), level + 1 )
190+ err := e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
187191 if err != nil {
188192 return err
189193 }
190194 return nil
191195
192196 case * types.Struct :
197+ seenTypes [t ] = struct {}{}
193198 exported := 0
194199 for i := 0 ; i < ut .NumFields (); i ++ {
195200 if ! ut .Field (i ).Exported () {
@@ -202,7 +207,7 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
202207 continue
203208 }
204209 }
205- err := e .jsonSafe (ut .Field (i ).Type (), level + 1 )
210+ err := e .jsonSafe (ut .Field (i ).Type (), level + 1 , seenTypes )
206211 if err != nil {
207212 return err
208213 }
@@ -214,7 +219,7 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
214219 return nil
215220
216221 case * types.Pointer :
217- err := e .jsonSafe (ut .Elem (), level + 1 )
222+ err := e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
218223 if err != nil {
219224 return err
220225 }
@@ -225,7 +230,7 @@ func (e *errchkjson) jsonSafe(t types.Type, level int) error {
225230 if err != nil {
226231 return err
227232 }
228- err = e .jsonSafe (ut .Elem (), level + 1 )
233+ err = e .jsonSafe (ut .Elem (), level + 1 , seenTypes )
229234 if err != nil {
230235 return err
231236 }
0 commit comments