Skip to content

Commit 846fab8

Browse files
authored
cgo: fix linters ignoring Cgo files (#3025)
1 parent 886fbd7 commit 846fab8

File tree

13 files changed

+45
-54
lines changed

13 files changed

+45
-54
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

+17
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package golinters
22

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

8+
"golang.org/x/tools/go/analysis"
9+
710
"github.com/golangci/golangci-lint/pkg/config"
811
)
912

@@ -22,3 +25,17 @@ func formatCodeBlock(code string, _ *config.Config) string {
2225

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

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func TestTestsAreLintedByDefault(t *testing.T) {
9595
}
9696

9797
func TestCgoOk(t *testing.T) {
98-
testshared.NewLintRunner(t).Run("--no-config", "--enable-all", "-D", "nosnakecase", getTestDataDir("cgo")).ExpectNoIssues()
98+
testshared.NewLintRunner(t).Run("--no-config", "--enable-all", "-D", "nosnakecase,gci", getTestDataDir("cgo")).ExpectNoIssues()
9999
}
100100

101101
func TestCgoWithIssues(t *testing.T) {
@@ -104,6 +104,10 @@ func TestCgoWithIssues(t *testing.T) {
104104
ExpectHasIssue("Printf format %t has arg cs of wrong type")
105105
r.Run("--no-config", "--disable-all", "-Estaticcheck", getTestDataDir("cgo_with_issues")).
106106
ExpectHasIssue("SA5009: Printf format %t has arg #1 of wrong type")
107+
r.Run("--no-config", "--disable-all", "-Egofmt", getTestDataDir("cgo_with_issues")).
108+
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")
107111
}
108112

109113
func TestUnsafeOk(t *testing.T) {
@@ -127,7 +131,7 @@ func TestLineDirectiveProcessedFilesLiteLoading(t *testing.T) {
127131
}
128132

129133
func TestSortedResults(t *testing.T) {
130-
var testCases = []struct {
134+
testCases := []struct {
131135
opt string
132136
want string
133137
}{

test/testdata/cgo_with_issues/main.go

+12
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,15 @@ func Example() {
2121
fmt.Printf("bad format %t", cs)
2222
C.free(unsafe.Pointer(cs))
2323
}
24+
25+
func notFormattedForGofmt() {
26+
}
27+
28+
func errorForRevive(p *int) error {
29+
if p == nil {
30+
return nil
31+
} else {
32+
return nil
33+
}
34+
}
35+

0 commit comments

Comments
 (0)