Skip to content

Commit 3c2ca7b

Browse files
author
golangci
authored
Merge pull request #6 from golangci/feature/optimize-linters-scheduling
optimize linters scheduling: run slow linters first
2 parents 3a5d2a4 + cdc1251 commit 3c2ca7b

File tree

7 files changed

+267
-104
lines changed

7 files changed

+267
-104
lines changed

pkg/commands/run.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func buildLintCtx(ctx context.Context, linters []pkg.Linter, cfg *config.Config)
202202
}, nil
203203
}
204204

205-
func (e *Executor) runAnalysis(ctx context.Context, args []string) (chan result.Issue, error) {
205+
func (e *Executor) runAnalysis(ctx context.Context, args []string) (<-chan result.Issue, error) {
206206
e.cfg.Run.Args = args
207207

208208
linters, err := pkg.GetEnabledLinters(e.cfg)

pkg/enabled_linters.go

+30-23
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type LinterConfig struct {
3838
DoesFullImport bool
3939
NeedsSSARepr bool
4040
InPresets []string
41+
Speed int // more value means faster execution of linter
4142
}
4243

4344
func (lc LinterConfig) WithFullImport() LinterConfig {
@@ -56,6 +57,11 @@ func (lc LinterConfig) WithPresets(presets ...string) LinterConfig {
5657
return lc
5758
}
5859

60+
func (lc LinterConfig) WithSpeed(speed int) LinterConfig {
61+
lc.Speed = speed
62+
return lc
63+
}
64+
5965
func newLinterConfig(linter Linter) LinterConfig {
6066
return LinterConfig{
6167
Linter: linter,
@@ -93,30 +99,31 @@ func enableLinterConfigs(lcs []LinterConfig, isEnabled func(lc *LinterConfig) bo
9399

94100
func GetAllSupportedLinterConfigs() []LinterConfig {
95101
lcs := []LinterConfig{
96-
newLinterConfig(golinters.Govet{}).WithPresets(PresetBugs),
97-
newLinterConfig(golinters.Errcheck{}).WithFullImport().WithPresets(PresetBugs),
98-
newLinterConfig(golinters.Golint{}).WithPresets(PresetStyle),
99-
100-
newLinterConfig(golinters.Megacheck{StaticcheckEnabled: true}).WithSSA().WithPresets(PresetBugs),
101-
newLinterConfig(golinters.Megacheck{UnusedEnabled: true}).WithSSA().WithPresets(PresetUnused),
102-
newLinterConfig(golinters.Megacheck{GosimpleEnabled: true}).WithSSA().WithPresets(PresetStyle),
103-
104-
newLinterConfig(golinters.Gas{}).WithFullImport().WithPresets(PresetBugs),
105-
newLinterConfig(golinters.Structcheck{}).WithFullImport().WithPresets(PresetUnused),
106-
newLinterConfig(golinters.Varcheck{}).WithFullImport().WithPresets(PresetUnused),
107-
newLinterConfig(golinters.Interfacer{}).WithSSA().WithPresets(PresetStyle),
108-
newLinterConfig(golinters.Unconvert{}).WithFullImport().WithPresets(PresetStyle),
109-
newLinterConfig(golinters.Ineffassign{}).WithPresets(PresetUnused),
110-
newLinterConfig(golinters.Dupl{}).WithPresets(PresetStyle),
111-
newLinterConfig(golinters.Goconst{}).WithPresets(PresetStyle),
112-
newLinterConfig(golinters.Deadcode{}).WithFullImport().WithPresets(PresetUnused),
113-
newLinterConfig(golinters.Gocyclo{}).WithPresets(PresetComplexity),
114-
115-
newLinterConfig(golinters.Gofmt{}).WithPresets(PresetFormatting),
116-
newLinterConfig(golinters.Gofmt{UseGoimports: true}).WithPresets(PresetFormatting),
117-
newLinterConfig(golinters.Maligned{}).WithFullImport().WithPresets(PresetPerformance),
102+
newLinterConfig(golinters.Govet{}).WithPresets(PresetBugs).WithSpeed(4),
103+
newLinterConfig(golinters.Errcheck{}).WithFullImport().WithPresets(PresetBugs).WithSpeed(10),
104+
newLinterConfig(golinters.Golint{}).WithPresets(PresetStyle).WithSpeed(3),
105+
106+
newLinterConfig(golinters.Megacheck{StaticcheckEnabled: true}).WithSSA().
107+
WithPresets(PresetBugs).WithSpeed(2),
108+
newLinterConfig(golinters.Megacheck{UnusedEnabled: true}).WithSSA().WithPresets(PresetUnused).WithSpeed(5),
109+
newLinterConfig(golinters.Megacheck{GosimpleEnabled: true}).WithSSA().WithPresets(PresetStyle).WithSpeed(5),
110+
111+
newLinterConfig(golinters.Gas{}).WithFullImport().WithPresets(PresetBugs).WithSpeed(8),
112+
newLinterConfig(golinters.Structcheck{}).WithFullImport().WithPresets(PresetUnused).WithSpeed(10),
113+
newLinterConfig(golinters.Varcheck{}).WithFullImport().WithPresets(PresetUnused).WithSpeed(10),
114+
newLinterConfig(golinters.Interfacer{}).WithSSA().WithPresets(PresetStyle).WithSpeed(6),
115+
newLinterConfig(golinters.Unconvert{}).WithFullImport().WithPresets(PresetStyle).WithSpeed(10),
116+
newLinterConfig(golinters.Ineffassign{}).WithPresets(PresetUnused).WithSpeed(9),
117+
newLinterConfig(golinters.Dupl{}).WithPresets(PresetStyle).WithSpeed(7),
118+
newLinterConfig(golinters.Goconst{}).WithPresets(PresetStyle).WithSpeed(9),
119+
newLinterConfig(golinters.Deadcode{}).WithFullImport().WithPresets(PresetUnused).WithSpeed(10),
120+
newLinterConfig(golinters.Gocyclo{}).WithPresets(PresetComplexity).WithSpeed(8),
121+
122+
newLinterConfig(golinters.Gofmt{}).WithPresets(PresetFormatting).WithSpeed(7),
123+
newLinterConfig(golinters.Gofmt{UseGoimports: true}).WithPresets(PresetFormatting).WithSpeed(5),
124+
newLinterConfig(golinters.Maligned{}).WithFullImport().WithPresets(PresetPerformance).WithSpeed(10),
118125
newLinterConfig(golinters.Megacheck{GosimpleEnabled: true, UnusedEnabled: true, StaticcheckEnabled: true}).
119-
WithSSA().WithPresets(PresetStyle, PresetBugs, PresetUnused),
126+
WithSSA().WithPresets(PresetStyle, PresetBugs, PresetUnused).WithSpeed(1),
120127
}
121128

122129
if os.Getenv("GOLANGCI_COM_RUN") == "1" {

pkg/printers/json.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func NewJSON() *JSON {
1313
return &JSON{}
1414
}
1515

16-
func (JSON) Print(issues chan result.Issue) (bool, error) {
16+
func (JSON) Print(issues <-chan result.Issue) (bool, error) {
1717
var allIssues []result.Issue
1818
for i := range issues {
1919
allIssues = append(allIssues, i)

pkg/printers/printer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ package printers
33
import "github.com/golangci/golangci-lint/pkg/result"
44

55
type Printer interface {
6-
Print(issues chan result.Issue) (bool, error)
6+
Print(issues <-chan result.Issue) (bool, error)
77
}

pkg/printers/text.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (p *Text) getFileLinesForIssue(i *result.Issue) (linesCache, error) {
5858
return fc, nil
5959
}
6060

61-
func (p *Text) Print(issues chan result.Issue) (bool, error) {
61+
func (p *Text) Print(issues <-chan result.Issue) (bool, error) {
6262
var issuedLineExtractingDuration time.Duration
6363
defer func() {
6464
logrus.Infof("Extracting issued lines took %s", issuedLineExtractingDuration)

0 commit comments

Comments
 (0)