Skip to content

Commit 07e0a29

Browse files
committed
Fix many linters ignoring cgo files
This change fixes a bug caused that many linters ignored all files that are using Cgo. It was introduced by PR golangci#1065, which assumed that all files referenced by //line directives are non-Go files, which is not true. In the case of Cgo they point to the original Go files which are used by Cgo as templates to generate other Go files. The fix replaces all calls of Pass.Fset.PositionFor with a function `getFileNames()` that first calls Pass.Fset.PositionFor with adjustment, and only if it results in a non-Go file it calls Pass.Fset.PositionFor again without adjustment. Fixes: golangci#2910 Signed-off-by: Sven Anderson <[email protected]>
1 parent 5d6e9d7 commit 07e0a29

File tree

12 files changed

+29
-53
lines changed

12 files changed

+29
-53
lines changed

pkg/golinters/dupl.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,7 @@ func NewDupl(settings *config.DuplSettings) *goanalysis.Linter {
5555
}
5656

5757
func runDupl(pass *analysis.Pass, settings *config.DuplSettings) ([]goanalysis.Issue, error) {
58-
var fileNames []string
59-
for _, f := range pass.Files {
60-
pos := pass.Fset.PositionFor(f.Pos(), false)
61-
fileNames = append(fileNames, pos.Filename)
62-
}
58+
fileNames := getFileNames(pass)
6359

6460
issues, err := duplAPI.Run(fileNames, settings.Threshold)
6561
if err != nil {

pkg/golinters/gci.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ func NewGci(settings *config.GciSettings) *goanalysis.Linter {
8383
}
8484

8585
func runGci(pass *analysis.Pass, lintCtx *linter.Context, cfg *gcicfg.Config, lock *sync.Mutex) ([]goanalysis.Issue, error) {
86-
var fileNames []string
87-
for _, f := range pass.Files {
88-
pos := pass.Fset.PositionFor(f.Pos(), false)
89-
fileNames = append(fileNames, pos.Filename)
90-
}
86+
fileNames := getFileNames(pass)
9187

9288
var diffs []string
9389
err := diffFormattedFilesToArray(fileNames, *cfg, &diffs, lock)

pkg/golinters/gofmt.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,7 @@ func NewGofmt(settings *config.GoFmtSettings) *goanalysis.Linter {
5353
}
5454

5555
func runGofmt(lintCtx *linter.Context, pass *analysis.Pass, settings *config.GoFmtSettings) ([]goanalysis.Issue, error) {
56-
var fileNames []string
57-
for _, f := range pass.Files {
58-
pos := pass.Fset.PositionFor(f.Pos(), false)
59-
fileNames = append(fileNames, pos.Filename)
60-
}
56+
fileNames := getFileNames(pass)
6157

6258
var issues []goanalysis.Issue
6359

pkg/golinters/gofumpt.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,7 @@ func NewGofumpt(settings *config.GofumptSettings) *goanalysis.Linter {
7373
}
7474

7575
func runGofumpt(lintCtx *linter.Context, pass *analysis.Pass, diff differ, options format.Options) ([]goanalysis.Issue, error) {
76-
var fileNames []string
77-
for _, f := range pass.Files {
78-
pos := pass.Fset.PositionFor(f.Pos(), false)
79-
fileNames = append(fileNames, pos.Filename)
80-
}
76+
fileNames := getFileNames(pass)
8177

8278
var issues []goanalysis.Issue
8379

pkg/golinters/goimports.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,7 @@ func NewGoimports(settings *config.GoImportsSettings) *goanalysis.Linter {
5555
}
5656

5757
func runGoiImports(lintCtx *linter.Context, pass *analysis.Pass) ([]goanalysis.Issue, error) {
58-
var fileNames []string
59-
for _, f := range pass.Files {
60-
pos := pass.Fset.PositionFor(f.Pos(), false)
61-
fileNames = append(fileNames, pos.Filename)
62-
}
58+
fileNames := getFileNames(pass)
6359

6460
var issues []goanalysis.Issue
6561

pkg/golinters/gomodguard.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,7 @@ func NewGomodguard(settings *config.GoModGuardSettings) *goanalysis.Linter {
7373
}
7474

7575
analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
76-
var files []string
77-
for _, file := range pass.Files {
78-
files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
79-
}
80-
81-
gomodguardIssues := processor.ProcessFiles(files)
76+
gomodguardIssues := processor.ProcessFiles(getFileNames(pass))
8277

8378
mu.Lock()
8479
defer mu.Unlock()

pkg/golinters/lll.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,7 @@ func NewLLL(settings *config.LllSettings) *goanalysis.Linter {
5656
}
5757

5858
func runLll(pass *analysis.Pass, settings *config.LllSettings) ([]goanalysis.Issue, error) {
59-
var fileNames []string
60-
for _, f := range pass.Files {
61-
pos := pass.Fset.PositionFor(f.Pos(), false)
62-
fileNames = append(fileNames, pos.Filename)
63-
}
59+
fileNames := getFileNames(pass)
6460

6561
spaces := strings.Repeat(" ", settings.TabWidth)
6662

pkg/golinters/misspell.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,7 @@ func NewMisspell(settings *config.MisspellSettings) *goanalysis.Linter {
6161
}
6262

6363
func runMisspell(lintCtx *linter.Context, pass *analysis.Pass, replacer *misspell.Replacer) ([]goanalysis.Issue, error) {
64-
var fileNames []string
65-
66-
for _, f := range pass.Files {
67-
pos := pass.Fset.PositionFor(f.Pos(), false)
68-
fileNames = append(fileNames, pos.Filename)
69-
}
64+
fileNames := getFileNames(pass)
7065

7166
var issues []goanalysis.Issue
7267
for _, filename := range fileNames {

pkg/golinters/revive.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,7 @@ func NewRevive(settings *config.ReviveSettings) *goanalysis.Linter {
7575
}
7676

7777
func runRevive(lintCtx *linter.Context, pass *analysis.Pass, settings *config.ReviveSettings) ([]goanalysis.Issue, error) {
78-
var files []string
79-
for _, file := range pass.Files {
80-
files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
81-
}
82-
packages := [][]string{files}
78+
packages := [][]string{getFileNames(pass)}
8379

8480
conf, err := getReviveConfig(settings)
8581
if err != nil {

pkg/golinters/util.go

+16
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package golinters
22

33
import (
44
"fmt"
5+
"path/filepath"
56
"strings"
67

78
"github.com/golangci/golangci-lint/pkg/config"
9+
"golang.org/x/tools/go/analysis"
810
)
911

1012
func formatCode(code string, _ *config.Config) string {
@@ -22,3 +24,17 @@ func formatCodeBlock(code string, _ *config.Config) string {
2224

2325
return fmt.Sprintf("```\n%s\n```", code)
2426
}
27+
28+
func getFileNames(pass *analysis.Pass) []string {
29+
var fileNames []string
30+
for _, f := range pass.Files {
31+
fileName := pass.Fset.PositionFor(f.Pos(), false).Filename
32+
ext := filepath.Ext(fileName)
33+
if ext != "" && ext != ".go" {
34+
// position has been adjusted to a non-go file, revert to original file
35+
fileName = pass.Fset.PositionFor(f.Pos(), false).Filename
36+
}
37+
fileNames = append(fileNames, fileName)
38+
}
39+
return fileNames
40+
}

pkg/golinters/wsl.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,11 @@ func NewWSL(settings *config.WSLSettings) *goanalysis.Linter {
6767
}
6868

6969
func runWSL(pass *analysis.Pass, conf *wsl.Configuration) []goanalysis.Issue {
70-
var files = make([]string, 0, len(pass.Files))
71-
for _, file := range pass.Files {
72-
files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
73-
}
74-
7570
if conf == nil {
7671
return nil
7772
}
7873

74+
files := getFileNames(pass)
7975
wslErrors, _ := wsl.NewProcessorWithConfig(*conf).ProcessFiles(files)
8076
if len(wslErrors) == 0 {
8177
return nil

test/run_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ func TestCgoWithIssues(t *testing.T) {
106106
ExpectHasIssue("SA5009: Printf format %t has arg #1 of wrong type")
107107
r.Run("--no-config", "--disable-all", "-Egofmt", getTestDataDir("cgo_with_issues")).
108108
ExpectHasIssue("File is not `gofmt`-ed with `-s` (gofmt)")
109+
r.Run("--no-config", "--disable-all", "-Erevive", getTestDataDir("cgo_with_issues")).
110+
ExpectHasIssue("indent-error-flow: if block ends with a return statement")
109111
}
110112

111113
func TestUnsafeOk(t *testing.T) {
@@ -129,7 +131,7 @@ func TestLineDirectiveProcessedFilesLiteLoading(t *testing.T) {
129131
}
130132

131133
func TestSortedResults(t *testing.T) {
132-
var testCases = []struct {
134+
testCases := []struct {
133135
opt string
134136
want string
135137
}{

0 commit comments

Comments
 (0)