diff --git a/pkg/goanalysis/runner_loadingpackage.go b/pkg/goanalysis/runner_loadingpackage.go index c54357eb6794..ad546fcc756f 100644 --- a/pkg/goanalysis/runner_loadingpackage.go +++ b/pkg/goanalysis/runner_loadingpackage.go @@ -9,6 +9,8 @@ import ( "go/types" "os" "reflect" + "runtime" + "strings" "sync" "sync/atomic" @@ -150,12 +152,15 @@ func (lp *loadingPackage) loadFromSource(loadMode LoadMode) error { } return imp.Types, nil } + tc := &types.Config{ Importer: importerFunc(importer), Error: func(err error) { pkg.Errors = append(pkg.Errors, lp.convertError(err)...) }, + GoVersion: getGoVersion(), } + _ = types.NewChecker(tc, pkg.Fset, pkg.Types, pkg.TypesInfo).Files(pkg.Syntax) // Don't handle error here: errors are adding by tc.Error function. @@ -497,3 +502,17 @@ func sizeOfReflectValueTreeBytes(rv reflect.Value, visitedPtrs map[uintptr]struc panic("unknown rv of type " + rv.String()) } } + +// TODO(ldez) temporary workaround +func getGoVersion() string { + goVersion := runtime.Version() + + parts := strings.Fields(goVersion) + + if len(parts) == 0 { + return goVersion + } + + // When using GOEXPERIMENT, the version returned might look something like "go1.23.0 X:boringcrypto". + return parts[0] +} diff --git a/pkg/golinters/gosimple/gosimple.go b/pkg/golinters/gosimple/gosimple.go index 6a0d967232ab..c03871adf9b5 100644 --- a/pkg/golinters/gosimple/gosimple.go +++ b/pkg/golinters/gosimple/gosimple.go @@ -11,7 +11,7 @@ import ( func New(settings *config.StaticCheckSettings) *goanalysis.Linter { cfg := internal.StaticCheckConfig(settings) - analyzers := internal.SetupStaticCheckAnalyzers(simple.Analyzers, internal.GetGoVersion(settings), cfg.Checks) + analyzers := internal.SetupStaticCheckAnalyzers(simple.Analyzers, cfg.Checks) return goanalysis.NewLinter( "gosimple", diff --git a/pkg/golinters/internal/staticcheck_common.go b/pkg/golinters/internal/staticcheck_common.go index 5b5812c318a2..958013d0df2c 100644 --- a/pkg/golinters/internal/staticcheck_common.go +++ b/pkg/golinters/internal/staticcheck_common.go @@ -14,20 +14,7 @@ import ( var debugf = logutils.Debug(logutils.DebugKeyMegacheck) -func GetGoVersion(settings *config.StaticCheckSettings) string { - var goVersion string - if settings != nil { - goVersion = settings.GoVersion - } - - if goVersion != "" { - return goVersion - } - - return "1.17" -} - -func SetupStaticCheckAnalyzers(src []*lint.Analyzer, goVersion string, checks []string) []*analysis.Analyzer { +func SetupStaticCheckAnalyzers(src []*lint.Analyzer, checks []string) []*analysis.Analyzer { var names []string for _, a := range src { names = append(names, a.Analyzer.Name) @@ -38,7 +25,6 @@ func SetupStaticCheckAnalyzers(src []*lint.Analyzer, goVersion string, checks [] var ret []*analysis.Analyzer for _, a := range src { if filter[a.Analyzer.Name] { - SetAnalyzerGoVersion(a.Analyzer, goVersion) ret = append(ret, a.Analyzer) } } diff --git a/pkg/golinters/spancheck/testdata/go.mod b/pkg/golinters/spancheck/testdata/go.mod index de347098a901..f35f25df4589 100644 --- a/pkg/golinters/spancheck/testdata/go.mod +++ b/pkg/golinters/spancheck/testdata/go.mod @@ -1,6 +1,6 @@ module spancheck -go 1.20 +go 1.21 require ( go.opentelemetry.io/otel v1.21.0 diff --git a/pkg/golinters/staticcheck/staticcheck.go b/pkg/golinters/staticcheck/staticcheck.go index 0c0534539ea5..79394bdb7f8a 100644 --- a/pkg/golinters/staticcheck/staticcheck.go +++ b/pkg/golinters/staticcheck/staticcheck.go @@ -10,7 +10,7 @@ import ( func New(settings *config.StaticCheckSettings) *goanalysis.Linter { cfg := internal.StaticCheckConfig(settings) - analyzers := internal.SetupStaticCheckAnalyzers(staticcheck.Analyzers, internal.GetGoVersion(settings), cfg.Checks) + analyzers := internal.SetupStaticCheckAnalyzers(staticcheck.Analyzers, cfg.Checks) return goanalysis.NewLinter( "staticcheck", diff --git a/pkg/golinters/stylecheck/stylecheck.go b/pkg/golinters/stylecheck/stylecheck.go index b8fc8fe547d1..60859f28afc3 100644 --- a/pkg/golinters/stylecheck/stylecheck.go +++ b/pkg/golinters/stylecheck/stylecheck.go @@ -20,7 +20,7 @@ func New(settings *config.StaticCheckSettings) *goanalysis.Linter { return cfg, nil } - analyzers := internal.SetupStaticCheckAnalyzers(stylecheck.Analyzers, internal.GetGoVersion(settings), cfg.Checks) + analyzers := internal.SetupStaticCheckAnalyzers(stylecheck.Analyzers, cfg.Checks) return goanalysis.NewLinter( "stylecheck", diff --git a/pkg/golinters/unused/unused.go b/pkg/golinters/unused/unused.go index 19cf7476fc03..7b2b478fc943 100644 --- a/pkg/golinters/unused/unused.go +++ b/pkg/golinters/unused/unused.go @@ -12,14 +12,13 @@ import ( "github.com/golangci/golangci-lint/pkg/config" "github.com/golangci/golangci-lint/pkg/goanalysis" - "github.com/golangci/golangci-lint/pkg/golinters/internal" "github.com/golangci/golangci-lint/pkg/lint/linter" "github.com/golangci/golangci-lint/pkg/result" ) const linterName = "unused" -func New(settings *config.UnusedSettings, scSettings *config.StaticCheckSettings) *goanalysis.Linter { +func New(settings *config.UnusedSettings) *goanalysis.Linter { var mu sync.Mutex var resIssues []goanalysis.Issue @@ -41,8 +40,6 @@ func New(settings *config.UnusedSettings, scSettings *config.StaticCheckSettings }, } - internal.SetAnalyzerGoVersion(analyzer, internal.GetGoVersion(scSettings)) - return goanalysis.NewLinter( linterName, "Checks Go code for unused constants, variables, functions and types", diff --git a/pkg/lint/lintersdb/builder_linter.go b/pkg/lint/lintersdb/builder_linter.go index 7b83a81530a7..3a46cbf88e5e 100644 --- a/pkg/lint/lintersdb/builder_linter.go +++ b/pkg/lint/lintersdb/builder_linter.go @@ -774,7 +774,7 @@ func (LinterBuilder) Build(cfg *config.Config) ([]*linter.Config, error) { WithLoadForGoAnalysis(). WithURL("https://github.com/mvdan/unparam"), - linter.NewConfig(unused.New(&cfg.LintersSettings.Unused, &cfg.LintersSettings.Staticcheck)). + linter.NewConfig(unused.New(&cfg.LintersSettings.Unused)). WithEnabledByDefault(). WithSince("v1.20.0"). WithLoadForGoAnalysis().