From 772b4250ba71c1ab16a463bba51395d35b198d96 Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Fri, 26 Feb 2021 22:02:47 +0100 Subject: [PATCH] Add ForceTypeAssert linter --- go.mod | 1 + go.sum | 3 +++ pkg/golinters/forcetypeassert.go | 19 +++++++++++++++++++ pkg/lint/lintersdb/manager.go | 4 ++++ test/testdata/forcetypeassert.go | 20 ++++++++++++++++++++ 5 files changed, 47 insertions(+) create mode 100644 pkg/golinters/forcetypeassert.go create mode 100644 test/testdata/forcetypeassert.go diff --git a/go.mod b/go.mod index bd5617980b15..63808eef14bb 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,7 @@ require ( github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 + github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 github.com/gostaticanalysis/nilerr v0.1.1 github.com/jgautheron/goconst v1.4.0 github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d diff --git a/go.sum b/go.sum index 77edad8a5074..c55e3c1ee9f7 100644 --- a/go.sum +++ b/go.sum @@ -179,6 +179,8 @@ github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0 github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= github.com/gostaticanalysis/comment v1.4.1 h1:xHopR5L2lRz6OsjH4R2HG5wRhW9ySl3FsHIvi5pcXwc= github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 h1:rx8127mFPqXXsfPSo8BwnIU97MKFZc89WHAHt8PwDVY= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -560,6 +562,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= diff --git a/pkg/golinters/forcetypeassert.go b/pkg/golinters/forcetypeassert.go new file mode 100644 index 000000000000..e1a94f68a4c1 --- /dev/null +++ b/pkg/golinters/forcetypeassert.go @@ -0,0 +1,19 @@ +package golinters + +import ( + "github.com/gostaticanalysis/forcetypeassert" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewForceTypeAssert() *goanalysis.Linter { + a := forcetypeassert.Analyzer + + return goanalysis.NewLinter( + a.Name, + "finds forced type assertions", + []*analysis.Analyzer{a}, + nil, + ).WithLoadMode(goanalysis.LoadModeTypesInfo) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 55c850565149..950d96942826 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -390,6 +390,10 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithLoadForGoAnalysis(). WithPresets(linter.PresetBugs). WithURL("https://github.com/gostaticanalysis/nilerr"), + linter.NewConfig(golinters.NewForceTypeAssert()). + WithPresets(linter.PresetStyle). + WithLoadForGoAnalysis(). + WithURL("https://github.com/gostaticanalysis/forcetypeassert"), // nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives linter.NewConfig(golinters.NewNoLintLint()). diff --git a/test/testdata/forcetypeassert.go b/test/testdata/forcetypeassert.go new file mode 100644 index 000000000000..6febae596907 --- /dev/null +++ b/test/testdata/forcetypeassert.go @@ -0,0 +1,20 @@ +//args: -Eforcetypeassert +package testdata + +import "fmt" + +func forcetypeassertInvalid() { + var a interface{} + _ = a.(int) // ERROR "type assertion must be checked" + + var b interface{} + bi := b.(int) // ERROR "type assertion must be checked" + fmt.Println(bi) +} + +func forcetypeassertValid() { + var a interface{} + if ai, ok := a.(int); ok { + fmt.Println(ai) + } +}