From 8bea8e7de897fab1cfb514f90e3b972d4a5b2005 Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Wed, 24 Apr 2024 14:51:20 +0200 Subject: [PATCH] dev: dedicated package about IllTypedError parsing (#4675) --- pkg/goanalysis/{ => pkgerrors}/errors.go | 26 +++++-------------- .../pkgerrors/extract.go} | 6 ++--- .../pkgerrors/extract_test.go} | 2 +- .../pkgerrors/parse.go} | 21 +++++++++++++-- .../parse_test.go} | 4 +-- pkg/goanalysis/runner_action.go | 3 ++- pkg/goanalysis/runners.go | 3 ++- 7 files changed, 35 insertions(+), 30 deletions(-) rename pkg/goanalysis/{ => pkgerrors}/errors.go (60%) rename pkg/{packages/util.go => goanalysis/pkgerrors/extract.go} (93%) rename pkg/{packages/util_test.go => goanalysis/pkgerrors/extract_test.go} (99%) rename pkg/{packages/errors.go => goanalysis/pkgerrors/parse.go} (60%) rename pkg/goanalysis/{linter_test.go => pkgerrors/parse_test.go} (93%) diff --git a/pkg/goanalysis/errors.go b/pkg/goanalysis/pkgerrors/errors.go similarity index 60% rename from pkg/goanalysis/errors.go rename to pkg/goanalysis/pkgerrors/errors.go index f59e02cc..91f6dd39 100644 --- a/pkg/goanalysis/errors.go +++ b/pkg/goanalysis/pkgerrors/errors.go @@ -1,4 +1,4 @@ -package goanalysis +package pkgerrors import ( "errors" @@ -7,7 +7,6 @@ import ( "golang.org/x/tools/go/packages" "github.com/golangci/golangci-lint/pkg/lint/linter" - libpackages "github.com/golangci/golangci-lint/pkg/packages" "github.com/golangci/golangci-lint/pkg/result" ) @@ -19,7 +18,7 @@ func (e *IllTypedError) Error() string { return fmt.Sprintf("errors in package: %v", e.Pkg.Errors) } -func buildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]result.Issue, error) { +func BuildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]result.Issue, error) { var issues []result.Issue uniqReportedIssues := map[string]bool{} @@ -36,8 +35,8 @@ func buildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]resu continue } - for _, err := range libpackages.ExtractErrors(ill.Pkg) { - i, perr := parseError(err) + for _, err := range extractErrors(ill.Pkg) { + issue, perr := parseError(err) if perr != nil { // failed to parse if uniqReportedIssues[err.Msg] { continue @@ -45,8 +44,8 @@ func buildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]resu uniqReportedIssues[err.Msg] = true lintCtx.Log.Errorf("typechecking error: %s", err.Msg) } else { - i.Pkg = ill.Pkg // to save to cache later - issues = append(issues, *i) + issue.Pkg = ill.Pkg // to save to cache later + issues = append(issues, *issue) } } } @@ -57,16 +56,3 @@ func buildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]resu return issues, nil } - -func parseError(srcErr packages.Error) (*result.Issue, error) { - pos, err := libpackages.ParseErrorPosition(srcErr.Pos) - if err != nil { - return nil, err - } - - return &result.Issue{ - Pos: *pos, - Text: srcErr.Msg, - FromLinter: "typecheck", - }, nil -} diff --git a/pkg/packages/util.go b/pkg/goanalysis/pkgerrors/extract.go similarity index 93% rename from pkg/packages/util.go rename to pkg/goanalysis/pkgerrors/extract.go index 6a7789eb..d1257e66 100644 --- a/pkg/packages/util.go +++ b/pkg/goanalysis/pkgerrors/extract.go @@ -1,4 +1,4 @@ -package packages +package pkgerrors import ( "fmt" @@ -12,7 +12,7 @@ import ( // ex: `/example/main.go:11:17: foobar` var reFile = regexp.MustCompile(`^.+\.go:\d+:\d+: .+`) -func ExtractErrors(pkg *packages.Package) []packages.Error { +func extractErrors(pkg *packages.Package) []packages.Error { errors := extractErrorsImpl(pkg, map[*packages.Package]bool{}) if len(errors) == 0 { return errors @@ -38,7 +38,7 @@ func ExtractErrors(pkg *packages.Package) []packages.Error { if len(pkg.GoFiles) != 0 { // errors were extracted from deps and have at least one file in package for i := range uniqErrors { - if _, parseErr := ParseErrorPosition(uniqErrors[i].Pos); parseErr == nil { + if _, parseErr := parseErrorPosition(uniqErrors[i].Pos); parseErr == nil { continue } diff --git a/pkg/packages/util_test.go b/pkg/goanalysis/pkgerrors/extract_test.go similarity index 99% rename from pkg/packages/util_test.go rename to pkg/goanalysis/pkgerrors/extract_test.go index 53084299..1e014ea4 100644 --- a/pkg/packages/util_test.go +++ b/pkg/goanalysis/pkgerrors/extract_test.go @@ -1,4 +1,4 @@ -package packages +package pkgerrors import ( "testing" diff --git a/pkg/packages/errors.go b/pkg/goanalysis/pkgerrors/parse.go similarity index 60% rename from pkg/packages/errors.go rename to pkg/goanalysis/pkgerrors/parse.go index ff37651a..b25b50f7 100644 --- a/pkg/packages/errors.go +++ b/pkg/goanalysis/pkgerrors/parse.go @@ -1,4 +1,4 @@ -package packages +package pkgerrors import ( "errors" @@ -6,9 +6,26 @@ import ( "go/token" "strconv" "strings" + + "golang.org/x/tools/go/packages" + + "github.com/golangci/golangci-lint/pkg/result" ) -func ParseErrorPosition(pos string) (*token.Position, error) { +func parseError(srcErr packages.Error) (*result.Issue, error) { + pos, err := parseErrorPosition(srcErr.Pos) + if err != nil { + return nil, err + } + + return &result.Issue{ + Pos: *pos, + Text: srcErr.Msg, + FromLinter: "typecheck", + }, nil +} + +func parseErrorPosition(pos string) (*token.Position, error) { // file:line(:colon) parts := strings.Split(pos, ":") if len(parts) == 1 { diff --git a/pkg/goanalysis/linter_test.go b/pkg/goanalysis/pkgerrors/parse_test.go similarity index 93% rename from pkg/goanalysis/linter_test.go rename to pkg/goanalysis/pkgerrors/parse_test.go index 44ded600..86d62666 100644 --- a/pkg/goanalysis/linter_test.go +++ b/pkg/goanalysis/pkgerrors/parse_test.go @@ -1,4 +1,4 @@ -package goanalysis +package pkgerrors import ( "fmt" @@ -8,7 +8,7 @@ import ( "golang.org/x/tools/go/packages" ) -func TestParseError(t *testing.T) { +func Test_parseError(t *testing.T) { cases := []struct { in, out string good bool diff --git a/pkg/goanalysis/runner_action.go b/pkg/goanalysis/runner_action.go index 6b57cb0c..58ea297e 100644 --- a/pkg/goanalysis/runner_action.go +++ b/pkg/goanalysis/runner_action.go @@ -15,6 +15,7 @@ import ( "github.com/golangci/golangci-lint/internal/errorutil" "github.com/golangci/golangci-lint/internal/pkgcache" + "github.com/golangci/golangci-lint/pkg/goanalysis/pkgerrors" ) type actionAllocator struct { @@ -184,7 +185,7 @@ func (act *action) analyze() { // It looks like there should be !pass.Analyzer.RunDespiteErrors // but govet's cgocall crashes on it. Govet itself contains !pass.Analyzer.RunDespiteErrors condition here, // but it exits before it if packages.Load have failed. - act.err = fmt.Errorf("analysis skipped: %w", &IllTypedError{Pkg: act.pkg}) + act.err = fmt.Errorf("analysis skipped: %w", &pkgerrors.IllTypedError{Pkg: act.pkg}) } else { startedAt = time.Now() act.result, act.err = pass.Analyzer.Run(pass) diff --git a/pkg/goanalysis/runners.go b/pkg/goanalysis/runners.go index b832fc32..c02d33b7 100644 --- a/pkg/goanalysis/runners.go +++ b/pkg/goanalysis/runners.go @@ -13,6 +13,7 @@ import ( "golang.org/x/tools/go/packages" "github.com/golangci/golangci-lint/internal/pkgcache" + "github.com/golangci/golangci-lint/pkg/goanalysis/pkgerrors" "github.com/golangci/golangci-lint/pkg/lint/linter" "github.com/golangci/golangci-lint/pkg/logutils" "github.com/golangci/golangci-lint/pkg/result" @@ -74,7 +75,7 @@ func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Iss return retIssues } - errIssues, err := buildIssuesFromIllTypedError(errs, lintCtx) + errIssues, err := pkgerrors.BuildIssuesFromIllTypedError(errs, lintCtx) if err != nil { return nil, err }