Skip to content

Commit cce8b0e

Browse files
committed
fix: error extractor
1 parent 2732197 commit cce8b0e

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed

pkg/goanalysis/pkgerrors/extract.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@ func extractErrors(pkg *packages.Package) []packages.Error {
1919
}
2020

2121
seenErrors := map[string]bool{}
22+
2223
var uniqErrors []packages.Error
2324
for _, err := range errors {
2425
msg := stackCrusher(err.Error())
2526
if seenErrors[msg] {
2627
continue
2728
}
2829

30+
// Important to avoid duplicate errors:
31+
// the goal is to keep the most relevant error.
2932
if msg != err.Error() {
3033
continue
3134
}
@@ -35,6 +38,20 @@ func extractErrors(pkg *packages.Package) []packages.Error {
3538
uniqErrors = append(uniqErrors, err)
3639
}
3740

41+
// In some cases, the error stack doesn't contain the tip error.
42+
// We must keep the original error.
43+
if len(uniqErrors) == 0 {
44+
for _, err := range errors {
45+
if seenErrors[err.Error()] {
46+
continue
47+
}
48+
49+
seenErrors[err.Error()] = true
50+
51+
uniqErrors = append(uniqErrors, err)
52+
}
53+
}
54+
3855
if len(pkg.GoFiles) != 0 {
3956
// errors were extracted from deps and have at least one file in package
4057
for i := range uniqErrors {

pkg/goanalysis/pkgerrors/extract_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,102 @@ import (
44
"testing"
55

66
"github.com/stretchr/testify/assert"
7+
"golang.org/x/tools/go/packages"
78
)
89

10+
func Test_extractErrors(t *testing.T) {
11+
testCases := []struct {
12+
desc string
13+
pkg *packages.Package
14+
15+
expected []packages.Error
16+
}{
17+
{
18+
desc: "package with errors",
19+
pkg: &packages.Package{
20+
IllTyped: true,
21+
Errors: []packages.Error{
22+
{Pos: "/home/ldez/sources/golangci/sandbox/main.go:6:11", Msg: "test"},
23+
},
24+
},
25+
expected: []packages.Error{
26+
{Pos: "/home/ldez/sources/golangci/sandbox/main.go:6:11", Msg: "test"},
27+
},
28+
},
29+
{
30+
desc: "full error stack deduplication",
31+
pkg: &packages.Package{
32+
IllTyped: true,
33+
Imports: map[string]*packages.Package{
34+
"test": {
35+
IllTyped: true,
36+
Errors: []packages.Error{
37+
{
38+
Pos: "/home/ldez/sources/golangci/sandbox/main.go:6:11",
39+
Msg: `/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2: /home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2: could not import github.com/golangci/golangci-lint/pkg/lint/lintersdb (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2: could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName))`,
40+
Kind: 3,
41+
},
42+
{
43+
Pos: "/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go:13:2",
44+
Msg: `could not import github.com/golangci/golangci-lint/pkg/lint/lintersdb (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2: could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName))`,
45+
Kind: 3,
46+
},
47+
{
48+
Pos: "/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go:13:2",
49+
Msg: `could not import github.com/golangci/golangci-lint/pkg/golinters (/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9: undeclared name: linterName)`,
50+
Kind: 3,
51+
},
52+
{
53+
Pos: "/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9:",
54+
Msg: `undeclared name: linterName)`,
55+
Kind: 3,
56+
},
57+
},
58+
},
59+
},
60+
},
61+
expected: []packages.Error{{
62+
Pos: "/home/ldez/sources/go/src/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go:21:9:",
63+
Msg: "undeclared name: linterName)",
64+
Kind: 3,
65+
}},
66+
},
67+
{
68+
desc: "package with import errors but with only one error and without tip error",
69+
pkg: &packages.Package{
70+
IllTyped: true,
71+
Imports: map[string]*packages.Package{
72+
"test": {
73+
IllTyped: true,
74+
Errors: []packages.Error{
75+
{
76+
Pos: "/home/ldez/sources/golangci/sandbox/main.go:6:11",
77+
Msg: "could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\n\tgo get github.com/golangci/sandbox)",
78+
Kind: 3,
79+
},
80+
},
81+
},
82+
},
83+
},
84+
expected: []packages.Error{{
85+
Pos: "/home/ldez/sources/golangci/sandbox/main.go:6:11",
86+
Msg: "could not import github.com/example/foo (main.go:6:2: missing go.sum entry for module providing package github.com/example/foo (imported by github.com/golangci/sandbox); to add:\n\tgo get github.com/golangci/sandbox)",
87+
Kind: 3,
88+
}},
89+
},
90+
}
91+
92+
for _, test := range testCases {
93+
t.Run(test.desc, func(t *testing.T) {
94+
t.Parallel()
95+
96+
errors := extractErrors(test.pkg)
97+
98+
assert.Equal(t, test.expected, errors)
99+
})
100+
}
101+
}
102+
9103
func Test_stackCrusher(t *testing.T) {
10104
testCases := []struct {
11105
desc string

0 commit comments

Comments
 (0)