diff --git a/go.mod b/go.mod index 01a1286bffd4..173b1ff8b80c 100644 --- a/go.mod +++ b/go.mod @@ -83,7 +83,7 @@ require ( github.com/spf13/viper v1.10.1 github.com/ssgreg/nlreturn/v2 v2.2.1 github.com/stretchr/testify v1.7.0 - github.com/sylvia7788/contextcheck v1.0.4 + github.com/sylvia7788/contextcheck v1.0.5 github.com/tdakkota/asciicheck v0.1.1 github.com/tetafro/godot v1.4.11 github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 diff --git a/go.sum b/go.sum index fadae35e04d9..bec182cbfe9e 100644 --- a/go.sum +++ b/go.sum @@ -752,8 +752,8 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/sylvia7788/contextcheck v1.0.4 h1:MsiVqROAdr0efZc/fOCt0c235qm9XJqHtWwM+2h2B04= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= +github.com/sylvia7788/contextcheck v1.0.5 h1:sIC4UT2ffb4XfcBB6YxFNhdyZVpblh4kc3R8FMnRq4c= +github.com/sylvia7788/contextcheck v1.0.5/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A= github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= diff --git a/pkg/golinters/contextcheck.go b/pkg/golinters/contextcheck.go index eb12ed4ef39f..946f0076d68f 100644 --- a/pkg/golinters/contextcheck.go +++ b/pkg/golinters/contextcheck.go @@ -5,6 +5,7 @@ import ( "golang.org/x/tools/go/analysis" "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" + "github.com/golangci/golangci-lint/pkg/lint/linter" ) func NewContextCheck() *goanalysis.Linter { @@ -14,5 +15,8 @@ func NewContextCheck() *goanalysis.Linter { "check the function whether use a non-inherited context", []*analysis.Analyzer{analyzer}, nil, - ).WithLoadMode(goanalysis.LoadModeTypesInfo) + ).WithLoadMode(goanalysis.LoadModeTypesInfo).WithNoCache(). + WithContextSetter(func(lintCtx *linter.Context) { + analyzer.Run = contextcheck.NewRun(lintCtx.Packages) + }) } diff --git a/pkg/golinters/goanalysis/linter.go b/pkg/golinters/goanalysis/linter.go index ef49e4284aa3..3eb37a025e3e 100644 --- a/pkg/golinters/goanalysis/linter.go +++ b/pkg/golinters/goanalysis/linter.go @@ -49,6 +49,7 @@ type Linter struct { contextSetter func(*linter.Context) loadMode LoadMode needUseOriginalPackages bool + noCache bool } func NewLinter(name, desc string, analyzers []*analysis.Analyzer, cfg map[string]map[string]interface{}) *Linter { @@ -86,6 +87,11 @@ func (lnt *Linter) WithContextSetter(cs func(*linter.Context)) *Linter { return lnt } +func (lnt *Linter) WithNoCache() *Linter { + lnt.noCache = true + return lnt +} + func (lnt *Linter) Name() string { return lnt.name } @@ -187,6 +193,10 @@ func (lnt *Linter) getLoadMode() LoadMode { return lnt.loadMode } +func (lnt *Linter) withoutCache() bool { + return lnt.noCache +} + func allFlagNames(fs *flag.FlagSet) []string { var ret []string fs.VisitAll(func(f *flag.Flag) { diff --git a/pkg/golinters/goanalysis/metalinter.go b/pkg/golinters/goanalysis/metalinter.go index 5c24d10964c9..456b7e2bd4b9 100644 --- a/pkg/golinters/goanalysis/metalinter.go +++ b/pkg/golinters/goanalysis/metalinter.go @@ -88,3 +88,12 @@ func (ml MetaLinter) getAnalyzerToLinterNameMapping() map[*analysis.Analyzer]str } return analyzerToLinterName } + +func (ml MetaLinter) withoutCache() bool { + for _, l := range ml.linters { + if l.withoutCache() { + return true + } + } + return false +} diff --git a/pkg/golinters/goanalysis/runners.go b/pkg/golinters/goanalysis/runners.go index 7e4cf902e79c..8577c45354c7 100644 --- a/pkg/golinters/goanalysis/runners.go +++ b/pkg/golinters/goanalysis/runners.go @@ -25,6 +25,7 @@ type runAnalyzersConfig interface { useOriginalPackages() bool reportIssues(*linter.Context) []Issue getLoadMode() LoadMode + withoutCache() bool } func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Issue, error) { @@ -41,7 +42,11 @@ func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Iss pkgs = lintCtx.OriginalPackages } - issues, pkgsFromCache := loadIssuesFromCache(pkgs, lintCtx, cfg.getAnalyzers()) + var issues []result.Issue + var pkgsFromCache map[*packages.Package]bool + if !cfg.withoutCache() { + issues, pkgsFromCache = loadIssuesFromCache(pkgs, lintCtx, cfg.getAnalyzers()) + } var pkgsToAnalyze []*packages.Package for _, pkg := range pkgs { if !pkgsFromCache[pkg] { @@ -52,7 +57,7 @@ func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Iss diags, errs, passToPkg := runner.run(cfg.getAnalyzers(), pkgsToAnalyze) defer func() { - if len(errs) == 0 { + if len(errs) == 0 && !cfg.withoutCache() { // If we try to save to cache even if we have compilation errors // we won't see them on repeated runs. saveIssuesToCache(pkgs, pkgsFromCache, issues, lintCtx, cfg.getAnalyzers())