package pkg import ( "encoding/json" "encoding/xml" ) type T1 struct{} type T2 struct{ x int } type T3 struct{ X int } type T4 struct{ T3 } type t5 struct{ X int } type T6 struct{ t5 } type T7 struct{ x int } func (T7) MarshalJSON() ([]byte, error) { return nil, nil } func (*T7) UnmarshalJSON([]byte) error { return nil } type T8 struct{ x int } func (T8) MarshalXML() ([]byte, error) { return nil, nil } func (*T8) UnmarshalXML(*xml.Decoder, *xml.StartElement) error { return nil } type T9 struct{} func (T9) MarshalText() ([]byte, error) { return nil, nil } func (*T9) UnmarshalText([]byte) error { return nil } type T10 struct{} type T11 struct{ T10 } type T12 struct{ T7 } type t13 struct{} func (t13) MarshalJSON() ([]byte, error) { return nil, nil } type T14 struct{ t13 } type T15 struct{ *t13 } type T16 struct{ *T3 } type T17 struct{ *T17 } type T18 struct { T17 Actual int } func fn() { // don't flag structs with no fields json.Marshal(T1{}) // no exported fields json.Marshal(T2{}) // want `struct doesn't have any exported fields, nor custom marshaling` // pointer vs non-pointer makes no difference json.Marshal(&T2{}) // want `struct doesn't have any exported fields, nor custom marshaling` // exported field json.Marshal(T3{}) // exported field, pointer makes no difference json.Marshal(&T3{}) // embeds struct with exported fields json.Marshal(T4{}) // exported field json.Marshal(t5{}) // embeds unexported type, but said type does have exported fields json.Marshal(T6{}) // MarshalJSON json.Marshal(T7{}) // MarshalXML does not apply to JSON json.Marshal(T8{}) // want `struct doesn't have any exported fields, nor custom marshaling` // MarshalText json.Marshal(T9{}) // embeds exported struct, but it has no fields json.Marshal(T11{}) // want `struct doesn't have any exported fields, nor custom marshaling` // embeds type with MarshalJSON json.Marshal(T12{}) // embeds type with MarshalJSON and type isn't exported json.Marshal(T14{}) // embedded pointer with MarshalJSON json.Marshal(T15{}) // embedded pointer to struct with exported fields json.Marshal(T16{}) // don't recurse forever on recursive data structure json.Marshal(T17{}) // want `struct doesn't have any exported fields, nor custom marshaling` json.Marshal(T18{}) // MarshalJSON does not apply to JSON xml.Marshal(T7{}) // want `struct doesn't have any exported fields, nor custom marshaling` // MarshalXML xml.Marshal(T8{}) var t2 T2 var t3 T3 var t7 T7 var t8 T8 var t9 T9 // check that all other variations of methods also work json.Unmarshal(nil, &t2) // want `struct doesn't have any exported fields, nor custom marshaling` json.Unmarshal(nil, &t3) json.Unmarshal(nil, &t9) xml.Unmarshal(nil, &t2) // want `struct doesn't have any exported fields, nor custom marshaling` xml.Unmarshal(nil, &t3) xml.Unmarshal(nil, &t9) (*json.Decoder)(nil).Decode(&t2) // want `struct doesn't have any exported fields, nor custom marshaling` (*json.Decoder)(nil).Decode(&t3) (*json.Decoder)(nil).Decode(&t9) (*json.Encoder)(nil).Encode(t2) // want `struct doesn't have any exported fields, nor custom marshaling` (*json.Encoder)(nil).Encode(t3) (*json.Encoder)(nil).Encode(t9) (*xml.Decoder)(nil).Decode(&t2) // want `struct doesn't have any exported fields, nor custom marshaling` (*xml.Decoder)(nil).Decode(&t3) (*xml.Decoder)(nil).Decode(&t9) (*xml.Encoder)(nil).Encode(t2) // want `struct doesn't have any exported fields, nor custom marshaling` (*xml.Encoder)(nil).Encode(t3) (*xml.Encoder)(nil).Encode(t9) (*json.Decoder)(nil).Decode(&t7) (*json.Decoder)(nil).Decode(&t8) // want `struct doesn't have any exported fields, nor custom marshaling` (*json.Encoder)(nil).Encode(t7) (*json.Encoder)(nil).Encode(t8) // want `struct doesn't have any exported fields, nor custom marshaling` (*xml.Decoder)(nil).Decode(&t7) // want `struct doesn't have any exported fields, nor custom marshaling` (*xml.Decoder)(nil).Decode(&t8) (*xml.Encoder)(nil).Encode(t7) // want `struct doesn't have any exported fields, nor custom marshaling` (*xml.Encoder)(nil).Encode(t8) } var _, _ = json.Marshal(T9{})