59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package pkgerrors
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"golang.org/x/tools/go/packages"
|
|
|
|
"github.com/golangci/golangci-lint/pkg/lint/linter"
|
|
"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 extractErrors(ill.Pkg) {
|
|
issue, 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 {
|
|
issue.Pkg = ill.Pkg // to save to cache later
|
|
issues = append(issues, *issue)
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(issues) == 0 && other != nil {
|
|
return nil, other
|
|
}
|
|
|
|
return issues, nil
|
|
}
|