Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cgo: fix many linters ignoring Cgo files #3025

Merged
merged 3 commits into from Jul 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 1 addition & 5 deletions pkg/golinters/dupl.go
Expand Up @@ -55,11 +55,7 @@ func NewDupl(settings *config.DuplSettings) *goanalysis.Linter {
}

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

issues, err := duplAPI.Run(fileNames, settings.Threshold)
if err != nil {
Expand Down
6 changes: 1 addition & 5 deletions pkg/golinters/gci.go
Expand Up @@ -83,11 +83,7 @@ func NewGci(settings *config.GciSettings) *goanalysis.Linter {
}

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

var diffs []string
err := diffFormattedFilesToArray(fileNames, *cfg, &diffs, lock)
Expand Down
6 changes: 1 addition & 5 deletions pkg/golinters/gofmt.go
Expand Up @@ -53,11 +53,7 @@ func NewGofmt(settings *config.GoFmtSettings) *goanalysis.Linter {
}

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

var issues []goanalysis.Issue

Expand Down
6 changes: 1 addition & 5 deletions pkg/golinters/gofumpt.go
Expand Up @@ -73,11 +73,7 @@ func NewGofumpt(settings *config.GofumptSettings) *goanalysis.Linter {
}

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

var issues []goanalysis.Issue

Expand Down
6 changes: 1 addition & 5 deletions pkg/golinters/goimports.go
Expand Up @@ -55,11 +55,7 @@ func NewGoimports(settings *config.GoImportsSettings) *goanalysis.Linter {
}

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

var issues []goanalysis.Issue

Expand Down
7 changes: 1 addition & 6 deletions pkg/golinters/gomodguard.go
Expand Up @@ -73,12 +73,7 @@ func NewGomodguard(settings *config.GoModGuardSettings) *goanalysis.Linter {
}

analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
var files []string
for _, file := range pass.Files {
files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
}

gomodguardIssues := processor.ProcessFiles(files)
gomodguardIssues := processor.ProcessFiles(getFileNames(pass))

mu.Lock()
defer mu.Unlock()
Expand Down
6 changes: 1 addition & 5 deletions pkg/golinters/lll.go
Expand Up @@ -56,11 +56,7 @@ func NewLLL(settings *config.LllSettings) *goanalysis.Linter {
}

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

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

Expand Down
7 changes: 1 addition & 6 deletions pkg/golinters/misspell.go
Expand Up @@ -61,12 +61,7 @@ func NewMisspell(settings *config.MisspellSettings) *goanalysis.Linter {
}

func runMisspell(lintCtx *linter.Context, pass *analysis.Pass, replacer *misspell.Replacer) ([]goanalysis.Issue, error) {
var fileNames []string

for _, f := range pass.Files {
pos := pass.Fset.PositionFor(f.Pos(), false)
fileNames = append(fileNames, pos.Filename)
}
fileNames := getFileNames(pass)

var issues []goanalysis.Issue
for _, filename := range fileNames {
Expand Down
6 changes: 1 addition & 5 deletions pkg/golinters/revive.go
Expand Up @@ -75,11 +75,7 @@ func NewRevive(settings *config.ReviveSettings) *goanalysis.Linter {
}

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

conf, err := getReviveConfig(settings)
if err != nil {
Expand Down
17 changes: 17 additions & 0 deletions pkg/golinters/util.go
Expand Up @@ -2,8 +2,11 @@ package golinters

import (
"fmt"
"path/filepath"
"strings"

"golang.org/x/tools/go/analysis"

"github.com/golangci/golangci-lint/pkg/config"
)

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

return fmt.Sprintf("```\n%s\n```", code)
}

func getFileNames(pass *analysis.Pass) []string {
var fileNames []string
for _, f := range pass.Files {
fileName := pass.Fset.PositionFor(f.Pos(), true).Filename
ext := filepath.Ext(fileName)
if ext != "" && ext != ".go" {
// position has been adjusted to a non-go file, revert to original file
fileName = pass.Fset.PositionFor(f.Pos(), false).Filename
}
fileNames = append(fileNames, fileName)
}
return fileNames
}
6 changes: 1 addition & 5 deletions pkg/golinters/wsl.go
Expand Up @@ -67,15 +67,11 @@ func NewWSL(settings *config.WSLSettings) *goanalysis.Linter {
}

func runWSL(pass *analysis.Pass, conf *wsl.Configuration) []goanalysis.Issue {
var files = make([]string, 0, len(pass.Files))
for _, file := range pass.Files {
files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
}

if conf == nil {
return nil
}

files := getFileNames(pass)
wslErrors, _ := wsl.NewProcessorWithConfig(*conf).ProcessFiles(files)
if len(wslErrors) == 0 {
return nil
Expand Down
8 changes: 6 additions & 2 deletions test/run_test.go
Expand Up @@ -95,7 +95,7 @@ func TestTestsAreLintedByDefault(t *testing.T) {
}

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

func TestCgoWithIssues(t *testing.T) {
Expand All @@ -104,6 +104,10 @@ func TestCgoWithIssues(t *testing.T) {
ExpectHasIssue("Printf format %t has arg cs of wrong type")
r.Run("--no-config", "--disable-all", "-Estaticcheck", getTestDataDir("cgo_with_issues")).
ExpectHasIssue("SA5009: Printf format %t has arg #1 of wrong type")
r.Run("--no-config", "--disable-all", "-Egofmt", getTestDataDir("cgo_with_issues")).
ExpectHasIssue("File is not `gofmt`-ed with `-s` (gofmt)")
r.Run("--no-config", "--disable-all", "-Erevive", getTestDataDir("cgo_with_issues")).
ExpectHasIssue("indent-error-flow: if block ends with a return statement")
}

func TestUnsafeOk(t *testing.T) {
Expand All @@ -127,7 +131,7 @@ func TestLineDirectiveProcessedFilesLiteLoading(t *testing.T) {
}

func TestSortedResults(t *testing.T) {
var testCases = []struct {
testCases := []struct {
opt string
want string
}{
Expand Down
12 changes: 12 additions & 0 deletions test/testdata/cgo_with_issues/main.go
Expand Up @@ -21,3 +21,15 @@ func Example() {
fmt.Printf("bad format %t", cs)
C.free(unsafe.Pointer(cs))
}

func notFormattedForGofmt() {
}

func errorForRevive(p *int) error {
if p == nil {
return nil
} else {
return nil
}
}