Skip to content

Commit 4464b1c

Browse files
committed
Add flag report-no-exported
This flag is needed to disable this check in order to prevent duplicate check results with staticcheck in golangci-lint. See: * golangci/golangci-lint#2349 (comment) * https://staticcheck.io/docs/checks/#SA9005
1 parent f5f3668 commit 4464b1c

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

errchkjson.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import (
1515
)
1616

1717
type errchkjson struct {
18-
omitSafe bool // -omit-safe flag
18+
omitSafe bool // -omit-safe flag
19+
reportNoExported bool // -report-no-exported flag
1920
}
2021

2122
// NewAnalyzer returns a new errchkjson analyzer.
@@ -30,6 +31,7 @@ func NewAnalyzer() *analysis.Analyzer {
3031

3132
a.Flags.Init("errchkjson", flag.ExitOnError)
3233
a.Flags.BoolVar(&errchkjson.omitSafe, "omit-safe", false, "if omit-safe is true, checking of safe returns is omitted")
34+
a.Flags.BoolVar(&errchkjson.reportNoExported, "report-no-exported", false, "if report-no-exported is true, encoding a struct without exported fields is reported as issue")
3335

3436
return a
3537
}
@@ -112,7 +114,7 @@ func (e *errchkjson) handleJSONMarshal(pass *analysis.Pass, ce *ast.CallExpr, fn
112114
t = t.(*types.Pointer).Elem()
113115
}
114116

115-
err := jsonSafe(t, 0)
117+
err := e.jsonSafe(t, 0)
116118
if err != nil {
117119
if _, ok := err.(unsupported); ok {
118120
pass.Reportf(ce.Pos(), "`%s` for %v", fnName, err)
@@ -141,7 +143,7 @@ const (
141143
unsupportedBasicTypes = types.IsComplex
142144
)
143145

144-
func jsonSafe(t types.Type, level int) error {
146+
func (e *errchkjson) jsonSafe(t types.Type, level int) error {
145147
if types.Implements(t, textMarshalerInterface()) {
146148
return fmt.Errorf("unsafe type `%s` found", t.String())
147149
}
@@ -168,14 +170,14 @@ func jsonSafe(t types.Type, level int) error {
168170
}
169171

170172
case *types.Array:
171-
err := jsonSafe(ut.Elem(), level+1)
173+
err := e.jsonSafe(ut.Elem(), level+1)
172174
if err != nil {
173175
return err
174176
}
175177
return nil
176178

177179
case *types.Slice:
178-
err := jsonSafe(ut.Elem(), level+1)
180+
err := e.jsonSafe(ut.Elem(), level+1)
179181
if err != nil {
180182
return err
181183
}
@@ -194,19 +196,19 @@ func jsonSafe(t types.Type, level int) error {
194196
continue
195197
}
196198
}
197-
err := jsonSafe(ut.Field(i).Type(), level+1)
199+
err := e.jsonSafe(ut.Field(i).Type(), level+1)
198200
if err != nil {
199201
return err
200202
}
201203
exported++
202204
}
203-
if level == 0 && exported == 0 {
205+
if e.reportNoExported && level == 0 && exported == 0 {
204206
return newNoexportedError(fmt.Errorf("struct does not export any field"))
205207
}
206208
return nil
207209

208210
case *types.Pointer:
209-
err := jsonSafe(ut.Elem(), level+1)
211+
err := e.jsonSafe(ut.Elem(), level+1)
210212
if err != nil {
211213
return err
212214
}
@@ -217,7 +219,7 @@ func jsonSafe(t types.Type, level int) error {
217219
if err != nil {
218220
return err
219221
}
220-
err = jsonSafe(ut.Elem(), level+1)
222+
err = e.jsonSafe(ut.Elem(), level+1)
221223
if err != nil {
222224
return err
223225
}

errchkjson_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ func TestNoExportedField(t *testing.T) {
3232
if err != nil {
3333
t.Fatalf("error setting 'omit-safe' command line flag: %v", err)
3434
}
35+
err = errchkjson.Flags.Set("report-no-exported", "true")
36+
if err != nil {
37+
t.Fatalf("error setting 'report-no-exported' command line flag: %v", err)
38+
}
3539
testdata := analysistest.TestData()
3640
analysistest.Run(t, testdata, errchkjson, "noexport")
3741
}

0 commit comments

Comments
 (0)