Skip to content

Commit

Permalink
typecheck: display compilation errors as report instead of error (#1861)
Browse files Browse the repository at this point in the history
  • Loading branch information
ldez committed Mar 25, 2021
1 parent ccb5bd0 commit 9aea4ae
Show file tree
Hide file tree
Showing 18 changed files with 1,509 additions and 1,423 deletions.
1 change: 1 addition & 0 deletions go.mod
Expand Up @@ -33,6 +33,7 @@ require (
github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254
github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5
github.com/gostaticanalysis/nilerr v0.1.1
github.com/hashicorp/go-multierror v1.0.0
github.com/jgautheron/goconst v1.4.0
github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af
Expand Down
2 changes: 2 additions & 0 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

72 changes: 72 additions & 0 deletions pkg/golinters/goanalysis/errors.go
@@ -0,0 +1,72 @@
package goanalysis

import (
"fmt"

"github.com/pkg/errors"
"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"
)

type IllTypedError struct {
Pkg *packages.Package
}

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) {
var issues []result.Issue
uniqReportedIssues := map[string]bool{}

var other error

for _, err := range errs {
err := err

var ill *IllTypedError
if !errors.As(err, &ill) {
if other == nil {
other = err
}
continue
}

for _, err := range libpackages.ExtractErrors(ill.Pkg) {
i, perr := parseError(err)
if perr != nil { // failed to parse
if uniqReportedIssues[err.Msg] {
continue
}
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)
}
}
}

if len(issues) == 0 && other != nil {
return nil, other
}

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
}

0 comments on commit 9aea4ae

Please sign in to comment.