Skip to content

Commit f851497

Browse files
authored
dev: use slice of pointers (#5854)
1 parent c24d5d1 commit f851497

File tree

82 files changed

+329
-339
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+329
-339
lines changed

docs/src/docs/contributing/architecture.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ The abstraction is simple:
222222

223223
```go title=pkg/result/processors/processor.go
224224
type Processor interface {
225-
Process(issues []result.Issue) ([]result.Issue, error)
225+
Process(issues []*result.Issue) ([]*result.Issue, error)
226226
Name() string
227227
Finish()
228228
}

pkg/commands/run.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ func (c *runCommand) runAndPrint(ctx context.Context) error {
376376
}
377377

378378
// runAnalysis executes the linters that have been enabled in the configuration.
379-
func (c *runCommand) runAnalysis(ctx context.Context) ([]result.Issue, error) {
379+
func (c *runCommand) runAnalysis(ctx context.Context) ([]*result.Issue, error) {
380380
lintersToRun, err := c.dbManager.GetOptimizedLinters()
381381
if err != nil {
382382
return nil, err
@@ -408,7 +408,7 @@ func (c *runCommand) setOutputToDevNull() (savedStdout, savedStderr *os.File) {
408408
return
409409
}
410410

411-
func (c *runCommand) setExitCodeIfIssuesFound(issues []result.Issue) {
411+
func (c *runCommand) setExitCodeIfIssuesFound(issues []*result.Issue) {
412412
if len(issues) != 0 {
413413
c.exitCode = c.cfg.Run.ExitCodeIfIssuesFound
414414
}
@@ -433,7 +433,7 @@ func (c *runCommand) printDeprecatedLinterMessages(enabledLinters map[string]*li
433433
}
434434
}
435435

436-
func (c *runCommand) printStats(issues []result.Issue) {
436+
func (c *runCommand) printStats(issues []*result.Issue) {
437437
if !c.cfg.Output.ShowStats {
438438
return
439439
}

pkg/goanalysis/issue.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import (
99
)
1010

1111
type Issue struct {
12-
result.Issue
12+
*result.Issue
1313
Pass *analysis.Pass
1414
}
1515

16-
func NewIssue(issue *result.Issue, pass *analysis.Pass) Issue {
17-
return Issue{
18-
Issue: *issue,
16+
func NewIssue(issue *result.Issue, pass *analysis.Pass) *Issue {
17+
return &Issue{
18+
Issue: issue,
1919
Pass: pass,
2020
}
2121
}

pkg/goanalysis/linter.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type Linter struct {
4040
name, desc string
4141
analyzers []*analysis.Analyzer
4242
cfg map[string]map[string]any
43-
issuesReporter func(*linter.Context) []Issue
43+
issuesReporter func(*linter.Context) []*Issue
4444
contextSetter func(*linter.Context)
4545
loadMode LoadMode
4646
needUseOriginalPackages bool
@@ -54,7 +54,7 @@ func NewLinterFromAnalyzer(analyzer *analysis.Analyzer) *Linter {
5454
return NewLinter(analyzer.Name, analyzer.Doc, []*analysis.Analyzer{analyzer}, nil)
5555
}
5656

57-
func (lnt *Linter) Run(_ context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
57+
func (lnt *Linter) Run(_ context.Context, lintCtx *linter.Context) ([]*result.Issue, error) {
5858
if err := lnt.preRun(lintCtx); err != nil {
5959
return nil, err
6060
}
@@ -93,7 +93,7 @@ func (lnt *Linter) WithLoadMode(loadMode LoadMode) *Linter {
9393
return lnt
9494
}
9595

96-
func (lnt *Linter) WithIssuesReporter(r func(*linter.Context) []Issue) *Linter {
96+
func (lnt *Linter) WithIssuesReporter(r func(*linter.Context) []*Issue) *Linter {
9797
lnt.issuesReporter = r
9898
return lnt
9999
}
@@ -193,7 +193,7 @@ func (lnt *Linter) useOriginalPackages() bool {
193193
return lnt.needUseOriginalPackages
194194
}
195195

196-
func (lnt *Linter) reportIssues(lintCtx *linter.Context) []Issue {
196+
func (lnt *Linter) reportIssues(lintCtx *linter.Context) []*Issue {
197197
if lnt.issuesReporter != nil {
198198
return lnt.issuesReporter(lintCtx)
199199
}

pkg/goanalysis/metalinter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func NewMetaLinter(linters []*Linter) *MetaLinter {
2121
return ml
2222
}
2323

24-
func (ml MetaLinter) Run(_ context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
24+
func (ml MetaLinter) Run(_ context.Context, lintCtx *linter.Context) ([]*result.Issue, error) {
2525
for _, l := range ml.linters {
2626
if err := l.preRun(lintCtx); err != nil {
2727
return nil, fmt.Errorf("failed to pre-run %s: %w", l.Name(), err)
@@ -65,8 +65,8 @@ func (MetaLinter) useOriginalPackages() bool {
6565
return false // `unused` can't be run by this metalinter
6666
}
6767

68-
func (ml MetaLinter) reportIssues(lintCtx *linter.Context) []Issue {
69-
var ret []Issue
68+
func (ml MetaLinter) reportIssues(lintCtx *linter.Context) []*Issue {
69+
var ret []*Issue
7070
for _, lnt := range ml.linters {
7171
if lnt.issuesReporter != nil {
7272
ret = append(ret, lnt.issuesReporter(lintCtx)...)

pkg/goanalysis/pkgerrors/errors.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ func (e *IllTypedError) Error() string {
1818
return fmt.Sprintf("IllTypedError: errors in package: %v", e.Pkg.Errors)
1919
}
2020

21-
func BuildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]result.Issue, error) {
22-
var issues []result.Issue
21+
func BuildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]*result.Issue, error) {
22+
var issues []*result.Issue
2323
uniqReportedIssues := map[string]bool{}
2424

2525
var other error
@@ -43,7 +43,7 @@ func BuildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]resu
4343
lintCtx.Log.Errorf("typechecking error: %s", err.Msg)
4444
} else {
4545
issue.Pkg = ill.Pkg // to save to cache later
46-
issues = append(issues, *issue)
46+
issues = append(issues, issue)
4747
}
4848
}
4949
}

pkg/goanalysis/runner.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func newRunner(prefix string, logger logutils.Log, pkgCache *cache.Cache, loadGu
7676
// It provides most of the logic for the main functions of both the
7777
// singlechecker and the multi-analysis commands.
7878
// It returns the appropriate exit code.
79-
func (r *runner) run(analyzers []*analysis.Analyzer, initialPackages []*packages.Package) ([]Diagnostic,
79+
func (r *runner) run(analyzers []*analysis.Analyzer, initialPackages []*packages.Package) ([]*Diagnostic,
8080
[]error, map[*analysis.Pass]*packages.Package,
8181
) {
8282
debugf("Analyzing %d packages on load mode %s", len(initialPackages), r.loadMode)
@@ -275,7 +275,7 @@ func (r *runner) analyze(pkgs []*packages.Package, analyzers []*analysis.Analyze
275275
return rootActions
276276
}
277277

278-
func extractDiagnostics(roots []*action) (retDiags []Diagnostic, retErrors []error) {
278+
func extractDiagnostics(roots []*action) (retDiags []*Diagnostic, retErrors []error) {
279279
extracted := make(map[*action]bool)
280280
var extract func(*action)
281281
var visitAll func(actions []*action)
@@ -322,7 +322,7 @@ func extractDiagnostics(roots []*action) (retDiags []Diagnostic, retErrors []err
322322
}
323323
seen[k] = true
324324

325-
retDiag := Diagnostic{
325+
retDiag := &Diagnostic{
326326
File: file,
327327
Diagnostic: diag,
328328
Analyzer: act.Analyzer,

pkg/goanalysis/runners.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package goanalysis
33
import (
44
"fmt"
55
"go/token"
6+
"slices"
67
"strings"
78

89
"golang.org/x/tools/go/analysis"
@@ -20,11 +21,11 @@ type runAnalyzersConfig interface {
2021
getLinterNameForDiagnostic(*Diagnostic) string
2122
getAnalyzers() []*analysis.Analyzer
2223
useOriginalPackages() bool
23-
reportIssues(*linter.Context) []Issue
24+
reportIssues(*linter.Context) []*Issue
2425
getLoadMode() LoadMode
2526
}
2627

27-
func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Issue, error) {
28+
func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]*result.Issue, error) {
2829
log := lintCtx.Log.Child(logutils.DebugKeyGoAnalysis)
2930
sw := timeutils.NewStopwatch("analyzers", log)
3031

@@ -56,18 +57,19 @@ func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Iss
5657
}
5758
}()
5859

59-
buildAllIssues := func() []result.Issue {
60-
var retIssues []result.Issue
60+
buildAllIssues := func() []*result.Issue {
61+
var retIssues []*result.Issue
62+
6163
reportedIssues := cfg.reportIssues(lintCtx)
62-
for i := range reportedIssues {
63-
issue := &reportedIssues[i].Issue
64-
if issue.Pkg == nil {
65-
issue.Pkg = passToPkg[reportedIssues[i].Pass]
64+
for _, reportedIssue := range reportedIssues {
65+
if reportedIssue.Pkg == nil {
66+
reportedIssue.Pkg = passToPkg[reportedIssue.Pass]
6667
}
67-
retIssues = append(retIssues, *issue)
68+
69+
retIssues = append(retIssues, reportedIssue.Issue)
6870
}
69-
retIssues = append(retIssues, buildIssues(diags, cfg.getLinterNameForDiagnostic)...)
70-
return retIssues
71+
72+
return slices.Concat(retIssues, buildIssues(diags, cfg.getLinterNameForDiagnostic))
7173
}
7274

7375
errIssues, err := pkgerrors.BuildIssuesFromIllTypedError(errs, lintCtx)
@@ -81,11 +83,10 @@ func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Iss
8183
return issues, nil
8284
}
8385

84-
func buildIssues(diags []Diagnostic, linterNameBuilder func(diag *Diagnostic) string) []result.Issue {
85-
var issues []result.Issue
86+
func buildIssues(diags []*Diagnostic, linterNameBuilder func(diag *Diagnostic) string) []*result.Issue {
87+
var issues []*result.Issue
8688

87-
for i := range diags {
88-
diag := &diags[i]
89+
for _, diag := range diags {
8990
linterName := linterNameBuilder(diag)
9091

9192
var text string
@@ -126,7 +127,7 @@ func buildIssues(diags []Diagnostic, linterNameBuilder func(diag *Diagnostic) st
126127
suggestedFixes = append(suggestedFixes, nsf)
127128
}
128129

129-
issues = append(issues, result.Issue{
130+
issues = append(issues, &result.Issue{
130131
FromLinter: linterName,
131132
Text: text,
132133
Pos: diag.Position,
@@ -142,7 +143,7 @@ func buildIssues(diags []Diagnostic, linterNameBuilder func(diag *Diagnostic) st
142143
relatedPos = diag.Position
143144
}
144145

145-
issues = append(issues, result.Issue{
146+
issues = append(issues, &result.Issue{
146147
FromLinter: linterName,
147148
Text: fmt.Sprintf("%s(related information): %s", diag.Analyzer.Name, info.Message),
148149
Pos: relatedPos,

pkg/goanalysis/runners_cache.go

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@ import (
1717
)
1818

1919
func saveIssuesToCache(allPkgs []*packages.Package, pkgsFromCache map[*packages.Package]bool,
20-
issues []result.Issue, lintCtx *linter.Context, analyzers []*analysis.Analyzer,
20+
issues []*result.Issue, lintCtx *linter.Context, analyzers []*analysis.Analyzer,
2121
) {
2222
startedAt := time.Now()
23-
perPkgIssues := map[*packages.Package][]result.Issue{}
24-
for ind := range issues {
25-
i := &issues[ind]
26-
perPkgIssues[i.Pkg] = append(perPkgIssues[i.Pkg], *i)
23+
perPkgIssues := map[*packages.Package][]*result.Issue{}
24+
for _, issue := range issues {
25+
perPkgIssues[issue.Pkg] = append(perPkgIssues[issue.Pkg], issue)
2726
}
2827

2928
var savedIssuesCount int64 = 0
@@ -34,23 +33,22 @@ func saveIssuesToCache(allPkgs []*packages.Package, pkgsFromCache map[*packages.
3433
wg.Add(workerCount)
3534

3635
pkgCh := make(chan *packages.Package, len(allPkgs))
37-
for i := 0; i < workerCount; i++ {
36+
for range workerCount {
3837
go func() {
3938
defer wg.Done()
4039
for pkg := range pkgCh {
4140
pkgIssues := perPkgIssues[pkg]
4241
encodedIssues := make([]EncodingIssue, 0, len(pkgIssues))
43-
for ind := range pkgIssues {
44-
i := &pkgIssues[ind]
42+
for _, issue := range pkgIssues {
4543
encodedIssues = append(encodedIssues, EncodingIssue{
46-
FromLinter: i.FromLinter,
47-
Text: i.Text,
48-
Severity: i.Severity,
49-
Pos: i.Pos,
50-
LineRange: i.LineRange,
51-
SuggestedFixes: i.SuggestedFixes,
52-
ExpectNoLint: i.ExpectNoLint,
53-
ExpectedNoLintLinter: i.ExpectedNoLintLinter,
44+
FromLinter: issue.FromLinter,
45+
Text: issue.Text,
46+
Severity: issue.Severity,
47+
Pos: issue.Pos,
48+
LineRange: issue.LineRange,
49+
SuggestedFixes: issue.SuggestedFixes,
50+
ExpectNoLint: issue.ExpectNoLint,
51+
ExpectedNoLintLinter: issue.ExpectedNoLintLinter,
5452
})
5553
}
5654

@@ -81,12 +79,12 @@ func saveIssuesToCache(allPkgs []*packages.Package, pkgsFromCache map[*packages.
8179

8280
func loadIssuesFromCache(pkgs []*packages.Package, lintCtx *linter.Context,
8381
analyzers []*analysis.Analyzer,
84-
) (issuesFromCache []result.Issue, pkgsFromCache map[*packages.Package]bool) {
82+
) (issuesFromCache []*result.Issue, pkgsFromCache map[*packages.Package]bool) {
8583
startedAt := time.Now()
8684

8785
lintResKey := getIssuesCacheKey(analyzers)
8886
type cacheRes struct {
89-
issues []result.Issue
87+
issues []*result.Issue
9088
loadErr error
9189
}
9290
pkgToCacheRes := make(map[*packages.Package]*cacheRes, len(pkgs))
@@ -103,7 +101,7 @@ func loadIssuesFromCache(pkgs []*packages.Package, lintCtx *linter.Context,
103101
go func() {
104102
defer wg.Done()
105103
for pkg := range pkgCh {
106-
var pkgIssues []EncodingIssue
104+
var pkgIssues []*EncodingIssue
107105
err := lintCtx.PkgCache.Get(pkg, cache.HashModeNeedAllDeps, lintResKey, &pkgIssues)
108106
cacheRes := pkgToCacheRes[pkg]
109107
cacheRes.loadErr = err
@@ -114,10 +112,9 @@ func loadIssuesFromCache(pkgs []*packages.Package, lintCtx *linter.Context,
114112
continue
115113
}
116114

117-
issues := make([]result.Issue, 0, len(pkgIssues))
118-
for i := range pkgIssues {
119-
issue := &pkgIssues[i]
120-
issues = append(issues, result.Issue{
115+
issues := make([]*result.Issue, 0, len(pkgIssues))
116+
for _, issue := range pkgIssues {
117+
issues = append(issues, &result.Issue{
121118
FromLinter: issue.FromLinter,
122119
Text: issue.Text,
123120
Severity: issue.Severity,

pkg/golinters/dupl/dupl.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const linterName = "dupl"
2020

2121
func New(settings *config.DuplSettings) *goanalysis.Linter {
2222
var mu sync.Mutex
23-
var resIssues []goanalysis.Issue
23+
var resIssues []*goanalysis.Issue
2424

2525
return goanalysis.
2626
NewLinterFromAnalyzer(&analysis.Analyzer{
@@ -43,13 +43,13 @@ func New(settings *config.DuplSettings) *goanalysis.Linter {
4343
return nil, nil
4444
},
4545
}).
46-
WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
46+
WithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {
4747
return resIssues
4848
}).
4949
WithLoadMode(goanalysis.LoadModeSyntax)
5050
}
5151

52-
func runDupl(pass *analysis.Pass, settings *config.DuplSettings) ([]goanalysis.Issue, error) {
52+
func runDupl(pass *analysis.Pass, settings *config.DuplSettings) ([]*goanalysis.Issue, error) {
5353
issues, err := duplAPI.Run(internal.GetGoFileNames(pass), settings.Threshold)
5454
if err != nil {
5555
return nil, err
@@ -59,7 +59,7 @@ func runDupl(pass *analysis.Pass, settings *config.DuplSettings) ([]goanalysis.I
5959
return nil, nil
6060
}
6161

62-
res := make([]goanalysis.Issue, 0, len(issues))
62+
res := make([]*goanalysis.Issue, 0, len(issues))
6363

6464
for _, i := range issues {
6565
toFilename, err := fsutils.ShortestRelPath(i.To.Filename(), "")

pkg/golinters/errcheck/errcheck.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const linterName = "errcheck"
2121

2222
func New(settings *config.ErrcheckSettings) *goanalysis.Linter {
2323
var mu sync.Mutex
24-
var resIssues []goanalysis.Issue
24+
var resIssues []*goanalysis.Issue
2525

2626
analyzer := &analysis.Analyzer{
2727
Name: linterName,
@@ -50,13 +50,13 @@ func New(settings *config.ErrcheckSettings) *goanalysis.Linter {
5050
return nil, nil
5151
}
5252
}).
53-
WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
53+
WithIssuesReporter(func(*linter.Context) []*goanalysis.Issue {
5454
return resIssues
5555
}).
5656
WithLoadMode(goanalysis.LoadModeTypesInfo)
5757
}
5858

59-
func runErrCheck(pass *analysis.Pass, checker *errcheck.Checker, verbose bool) []goanalysis.Issue {
59+
func runErrCheck(pass *analysis.Pass, checker *errcheck.Checker, verbose bool) []*goanalysis.Issue {
6060
pkg := &packages.Package{
6161
Fset: pass.Fset,
6262
Syntax: pass.Files,
@@ -69,7 +69,7 @@ func runErrCheck(pass *analysis.Pass, checker *errcheck.Checker, verbose bool) [
6969
return nil
7070
}
7171

72-
issues := make([]goanalysis.Issue, len(lintIssues.UncheckedErrors))
72+
issues := make([]*goanalysis.Issue, len(lintIssues.UncheckedErrors))
7373

7474
for i, err := range lintIssues.UncheckedErrors {
7575
text := "Error return value is not checked"

0 commit comments

Comments
 (0)