@@ -2,12 +2,7 @@ package golinters
22
33import (
44 "context"
5- "fmt"
6- "go/token"
7- "strconv"
8- "strings"
95
10- "github.com/pkg/errors"
116 "golang.org/x/tools/go/packages"
127
138 "github.com/golangci/golangci-lint/pkg/lint/linter"
@@ -26,44 +21,31 @@ func (TypeCheck) Desc() string {
2621}
2722
2823func (lint TypeCheck ) parseError (srcErr packages.Error ) (* result.Issue , error ) {
29- // file:line(<optional>:colon)
30- parts := strings .Split (srcErr .Pos , ":" )
31- if len (parts ) == 1 {
32- return nil , errors .New ("no colons" )
33- }
34-
35- file := parts [0 ]
36- line , err := strconv .Atoi (parts [1 ])
24+ pos , err := libpackages .ParseErrorPosition (srcErr .Pos )
3725 if err != nil {
38- return nil , fmt .Errorf ("can't parse line number %q: %s" , parts [1 ], err )
39- }
40-
41- var column int
42- if len (parts ) == 3 { // no column
43- column , err = strconv .Atoi (parts [2 ])
44- if err != nil {
45- return nil , errors .Wrapf (err , "failed to parse column from %q" , parts [2 ])
46- }
26+ return nil , err
4727 }
4828
4929 return & result.Issue {
50- Pos : token.Position {
51- Filename : file ,
52- Line : line ,
53- Column : column ,
54- },
30+ Pos : * pos ,
5531 Text : srcErr .Msg ,
5632 FromLinter : lint .Name (),
5733 }, nil
5834}
5935
6036func (lint TypeCheck ) Run (ctx context.Context , lintCtx * linter.Context ) ([]result.Issue , error ) {
37+ uniqReportedIssues := map [string ]bool {}
38+
6139 var res []result.Issue
6240 for _ , pkg := range lintCtx .NotCompilingPackages {
63- errors := libpackages .ExtractErrors (pkg )
41+ errors := libpackages .ExtractErrors (pkg , lintCtx . ASTCache )
6442 for _ , err := range errors {
6543 i , perr := lint .parseError (err )
6644 if perr != nil { // failed to parse
45+ if uniqReportedIssues [err .Msg ] {
46+ continue
47+ }
48+ uniqReportedIssues [err .Msg ] = true
6749 lintCtx .Log .Errorf ("typechecking error: %s" , err .Msg )
6850 } else {
6951 res = append (res , * i )
0 commit comments