diff --git a/pkg/golinters/govet.go b/pkg/golinters/govet.go index 7ea1f094e641..4e79c980b8ff 100644 --- a/pkg/golinters/govet.go +++ b/pkg/golinters/govet.go @@ -17,6 +17,7 @@ import ( "golang.org/x/tools/go/analysis/passes/errorsas" "golang.org/x/tools/go/analysis/passes/findcall" "golang.org/x/tools/go/analysis/passes/httpresponse" + "golang.org/x/tools/go/analysis/passes/ifaceassert" _ "golang.org/x/tools/go/analysis/passes/inspect" // unused internal analyzer "golang.org/x/tools/go/analysis/passes/loopclosure" "golang.org/x/tools/go/analysis/passes/lostcancel" @@ -28,6 +29,7 @@ import ( "golang.org/x/tools/go/analysis/passes/shift" "golang.org/x/tools/go/analysis/passes/sortslice" "golang.org/x/tools/go/analysis/passes/stdmethods" + "golang.org/x/tools/go/analysis/passes/stringintconv" "golang.org/x/tools/go/analysis/passes/structtag" "golang.org/x/tools/go/analysis/passes/testinggoroutine" "golang.org/x/tools/go/analysis/passes/tests" @@ -55,6 +57,7 @@ var ( errorsas.Analyzer, findcall.Analyzer, httpresponse.Analyzer, + ifaceassert.Analyzer, loopclosure.Analyzer, lostcancel.Analyzer, nilfunc.Analyzer, @@ -64,6 +67,7 @@ var ( shift.Analyzer, sortslice.Analyzer, stdmethods.Analyzer, + stringintconv.Analyzer, structtag.Analyzer, testinggoroutine.Analyzer, tests.Analyzer, @@ -90,6 +94,7 @@ var ( printf.Analyzer, shift.Analyzer, stdmethods.Analyzer, + stringintconv.Analyzer, structtag.Analyzer, tests.Analyzer, unmarshal.Analyzer, diff --git a/test/testdata/govet.go b/test/testdata/govet/default.go similarity index 65% rename from test/testdata/govet.go rename to test/testdata/govet/default.go index c928699cdcd0..6dfec6aae0cb 100644 --- a/test/testdata/govet.go +++ b/test/testdata/govet/default.go @@ -1,6 +1,6 @@ //args: -Egovet //config: linters-settings.govet.check-shadowing=true -package testdata +package govet import ( "fmt" @@ -8,11 +8,11 @@ import ( "os" ) -func Govet() error { +func Composites() error { return &os.PathError{"first", "path", os.ErrNotExist} // ERROR "composites: `os.PathError` composite literal uses unkeyed fields" } -func GovetShadow(f io.Reader, buf []byte) (err error) { +func Shadow(f io.Reader, buf []byte) (err error) { if f != nil { _, err := f.Read(buf) // ERROR "shadow: declaration of .err. shadows declaration at line \d+" if err != nil { @@ -24,15 +24,20 @@ func GovetShadow(f io.Reader, buf []byte) (err error) { return } -func GovetNolintVet() error { +func NolintVet() error { return &os.PathError{"first", "path", os.ErrNotExist} //nolint:vet } -func GovetNolintVetShadow() error { +func NolintVetShadow() error { return &os.PathError{"first", "path", os.ErrNotExist} //nolint:vetshadow } -func GovetPrintf() { +func Printf() { x := "dummy" fmt.Printf("%d", x) // ERROR "printf: Printf format %d has arg x of wrong type string" } + +func StringIntConv() { + i := 42 + fmt.Println("i = " + string(i)) // ERROR "stringintconv: conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)" +} diff --git a/test/testdata/govet/ifaceassert.go b/test/testdata/govet/ifaceassert.go new file mode 100644 index 000000000000..c00535c226e8 --- /dev/null +++ b/test/testdata/govet/ifaceassert.go @@ -0,0 +1,14 @@ +//args: -Egovet +//config: linters-settings.govet.enable=["ifaceassert"] +package govet + +import ( + "io" +) + +func IfaceAssert() { + var v interface { + Read() + } + _ = v.(io.Reader) // ERROR "composites: `os.PathError` composite literal uses unkeyed fields" +}