diff --git a/pkg/golinters/goanalysis/runners.go b/pkg/golinters/goanalysis/runners.go index 559fb1392b96..11f5545e63de 100644 --- a/pkg/golinters/goanalysis/runners.go +++ b/pkg/golinters/goanalysis/runners.go @@ -3,6 +3,7 @@ package goanalysis import ( "fmt" "runtime" + "slices" "sort" "strings" "sync" @@ -42,14 +43,35 @@ func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Iss pkgs = lintCtx.OriginalPackages } + pkgByPath := make(map[string]*packages.Package, len(pkgs)) + for _, pkg := range pkgs { + pkgByPath[pkg.PkgPath] = pkg + } + issues, pkgsFromCache := loadIssuesFromCache(pkgs, lintCtx, cfg.getAnalyzers()) + var pkgsToAnalyze []*packages.Package for _, pkg := range pkgs { if !pkgsFromCache[pkg] { pkgsToAnalyze = append(pkgsToAnalyze, pkg) + + // Also add the local packages imported by a package to analyze. + // Some linters produce reports on a package reported by another one. + // This is only needed for local imports. + for _, v := range pkg.Imports { + if p, found := pkgByPath[v.PkgPath]; found { + pkgsToAnalyze = append(pkgsToAnalyze, p) + } + } } } + // keep only unique packages + slices.SortFunc(pkgsToAnalyze, func(a, b *packages.Package) int { + return strings.Compare(a.PkgPath, b.PkgPath) + }) + pkgsToAnalyze = slices.Compact(pkgsToAnalyze) + diags, errs, passToPkg := runner.run(cfg.getAnalyzers(), pkgsToAnalyze) defer func() {