Skip to content

Commit bce3dfd

Browse files
fatanugrahaldez
andauthored
unused: support passing in options (#4086)
Co-authored-by: Fernandez Ludovic <[email protected]>
1 parent 69d6cc9 commit bce3dfd

File tree

4 files changed

+83
-25
lines changed

4 files changed

+83
-25
lines changed

.golangci.reference.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,6 +2016,29 @@ linters-settings:
20162016
# Default: false
20172017
check-exported: true
20182018

2019+
unused:
2020+
# Mark all struct fields that have been written to as used.
2021+
# Default: true
2022+
field-writes-are-uses: false
2023+
# Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write.
2024+
# Default: false
2025+
post-statements-are-reads: true
2026+
# Mark all exported identifiers as used.
2027+
# Default: true
2028+
exported-is-used: false
2029+
# Mark all exported fields as used.
2030+
# default: true
2031+
exported-fields-are-used: false
2032+
# Mark all function parameters as used.
2033+
# default: true
2034+
parameters-are-used: false
2035+
# Mark all local variables as used.
2036+
# default: true
2037+
local-variables-are-used: false
2038+
# Mark all identifiers inside generated files as used.
2039+
# Default: true
2040+
generated-is-used: false
2041+
20192042
varcheck:
20202043
# Check usage of exported fields and variables.
20212044
# Default: false

pkg/config/linters_settings.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,15 @@ var defaultLintersSettings = LintersSettings{
126126
Unparam: UnparamSettings{
127127
Algo: "cha",
128128
},
129+
Unused: UnusedSettings{
130+
FieldWritesAreUses: true,
131+
PostStatementsAreReads: false,
132+
ExportedIsUsed: true,
133+
ExportedFieldsAreUsed: true,
134+
ParametersAreUsed: true,
135+
LocalVariablesAreUsed: true,
136+
GeneratedIsUsed: true,
137+
},
129138
UseStdlibVars: UseStdlibVarsSettings{
130139
HTTPMethod: true,
131140
HTTPStatusCode: true,
@@ -223,6 +232,7 @@ type LintersSettings struct {
223232
Testpackage TestpackageSettings
224233
Thelper ThelperSettings
225234
Unparam UnparamSettings
235+
Unused UnusedSettings
226236
UseStdlibVars UseStdlibVarsSettings
227237
Varcheck VarCheckSettings
228238
Varnamelen VarnamelenSettings
@@ -794,6 +804,16 @@ type UnparamSettings struct {
794804
Algo string
795805
}
796806

807+
type UnusedSettings struct {
808+
FieldWritesAreUses bool `mapstructure:"field-writes-are-uses"`
809+
PostStatementsAreReads bool `mapstructure:"post-statements-are-reads"`
810+
ExportedIsUsed bool `mapstructure:"exported-is-used"`
811+
ExportedFieldsAreUsed bool `mapstructure:"exported-fields-are-used"`
812+
ParametersAreUsed bool `mapstructure:"parameters-are-used"`
813+
LocalVariablesAreUsed bool `mapstructure:"local-variables-are-used"`
814+
GeneratedIsUsed bool `mapstructure:"generated-is-used"`
815+
}
816+
797817
type VarCheckSettings struct {
798818
CheckExportedFields bool `mapstructure:"exported-fields"`
799819
}

pkg/golinters/unused.go

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import (
55
"sync"
66

77
"golang.org/x/tools/go/analysis"
8+
"honnef.co/go/tools/analysis/facts/directives"
9+
"honnef.co/go/tools/analysis/facts/generated"
10+
"honnef.co/go/tools/analysis/lint"
811
"honnef.co/go/tools/unused"
912

1013
"github.com/golangci/golangci-lint/pkg/config"
@@ -15,11 +18,7 @@ import (
1518

1619
const unusedName = "unused"
1720

18-
type UnusedSettings struct {
19-
GoVersion string
20-
}
21-
22-
func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
21+
func NewUnused(settings *config.UnusedSettings, scSettings *config.StaticCheckSettings) *goanalysis.Linter {
2322
var mu sync.Mutex
2423
var resIssues []goanalysis.Issue
2524

@@ -28,11 +27,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
2827
Doc: unused.Analyzer.Analyzer.Doc,
2928
Requires: unused.Analyzer.Analyzer.Requires,
3029
Run: func(pass *analysis.Pass) (any, error) {
31-
issues, err := runUnused(pass)
32-
if err != nil {
33-
return nil, err
34-
}
35-
30+
issues := runUnused(pass, settings)
3631
if len(issues) == 0 {
3732
return nil, nil
3833
}
@@ -45,7 +40,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
4540
},
4641
}
4742

48-
setAnalyzerGoVersion(analyzer, getGoVersion(settings))
43+
setAnalyzerGoVersion(analyzer, getGoVersion(scSettings))
4944

5045
return goanalysis.NewLinter(
5146
unusedName,
@@ -57,21 +52,18 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
5752
}).WithLoadMode(goanalysis.LoadModeTypesInfo)
5853
}
5954

60-
func runUnused(pass *analysis.Pass) ([]goanalysis.Issue, error) {
61-
res, err := unused.Analyzer.Analyzer.Run(pass)
62-
if err != nil {
63-
return nil, err
64-
}
55+
func runUnused(pass *analysis.Pass, cfg *config.UnusedSettings) []goanalysis.Issue {
56+
res := getUnusedResults(pass, cfg)
6557

6658
used := make(map[string]bool)
67-
for _, obj := range res.(unused.Result).Used {
59+
for _, obj := range res.Used {
6860
used[fmt.Sprintf("%s %d %s", obj.Position.Filename, obj.Position.Line, obj.Name)] = true
6961
}
7062

7163
var issues []goanalysis.Issue
7264

7365
// Inspired by https://github.com/dominikh/go-tools/blob/d694aadcb1f50c2d8ac0a1dd06217ebb9f654764/lintcmd/lint.go#L177-L197
74-
for _, object := range res.(unused.Result).Unused {
66+
for _, object := range res.Unused {
7567
if object.Kind == "type param" {
7668
continue
7769
}
@@ -90,5 +82,31 @@ func runUnused(pass *analysis.Pass) ([]goanalysis.Issue, error) {
9082
issues = append(issues, issue)
9183
}
9284

93-
return issues, nil
85+
return issues
86+
}
87+
88+
func getUnusedResults(pass *analysis.Pass, settings *config.UnusedSettings) unused.Result {
89+
opts := unused.Options{
90+
FieldWritesAreUses: settings.FieldWritesAreUses,
91+
PostStatementsAreReads: settings.PostStatementsAreReads,
92+
ExportedIsUsed: settings.ExportedIsUsed,
93+
ExportedFieldsAreUsed: settings.ExportedFieldsAreUsed,
94+
ParametersAreUsed: settings.ParametersAreUsed,
95+
LocalVariablesAreUsed: settings.LocalVariablesAreUsed,
96+
GeneratedIsUsed: settings.GeneratedIsUsed,
97+
}
98+
99+
// ref: https://github.com/dominikh/go-tools/blob/4ec1f474ca6c0feb8e10a8fcca4ab95f5b5b9881/internal/cmd/unused/unused.go#L68
100+
nodes := unused.Graph(pass.Fset,
101+
pass.Files,
102+
pass.Pkg,
103+
pass.TypesInfo,
104+
pass.ResultOf[directives.Analyzer].([]lint.Directive),
105+
pass.ResultOf[generated.Analyzer].(map[string]generated.Generator),
106+
opts,
107+
)
108+
109+
sg := unused.SerializedGraph{}
110+
sg.Merge(nodes)
111+
return sg.Results()
94112
}

pkg/lint/lintersdb/manager.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
137137
testpackageCfg *config.TestpackageSettings
138138
thelperCfg *config.ThelperSettings
139139
unparamCfg *config.UnparamSettings
140-
unusedCfg *config.StaticCheckSettings
140+
unusedCfg *config.UnusedSettings
141141
usestdlibvars *config.UseStdlibVarsSettings
142142
varcheckCfg *config.VarCheckSettings
143143
varnamelenCfg *config.VarnamelenSettings
@@ -218,7 +218,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
218218
testpackageCfg = &m.cfg.LintersSettings.Testpackage
219219
thelperCfg = &m.cfg.LintersSettings.Thelper
220220
unparamCfg = &m.cfg.LintersSettings.Unparam
221-
unusedCfg = new(config.StaticCheckSettings)
221+
unusedCfg = &m.cfg.LintersSettings.Unused
222222
usestdlibvars = &m.cfg.LintersSettings.UseStdlibVars
223223
varcheckCfg = &m.cfg.LintersSettings.Varcheck
224224
varnamelenCfg = &m.cfg.LintersSettings.Varnamelen
@@ -247,9 +247,6 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
247247
if stylecheckCfg != nil && stylecheckCfg.GoVersion != "" {
248248
stylecheckCfg.GoVersion = trimGoVersion(m.cfg.Run.Go)
249249
}
250-
if unusedCfg != nil && unusedCfg.GoVersion == "" {
251-
unusedCfg.GoVersion = trimGoVersion(m.cfg.Run.Go)
252-
}
253250
}
254251

255252
const megacheckName = "megacheck"
@@ -846,7 +843,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
846843
WithLoadForGoAnalysis().
847844
WithURL("https://github.com/mvdan/unparam"),
848845

849-
linter.NewConfig(golinters.NewUnused(unusedCfg)).
846+
linter.NewConfig(golinters.NewUnused(unusedCfg, staticcheckCfg)).
850847
WithEnabledByDefault().
851848
WithSince("v1.20.0").
852849
WithLoadForGoAnalysis().

0 commit comments

Comments
 (0)