diff --git a/.golangci.reference.yml b/.golangci.reference.yml index be547461a2b0..d949e2fbea51 100644 --- a/.golangci.reference.yml +++ b/.golangci.reference.yml @@ -2416,6 +2416,7 @@ linters: - durationcheck - errcheck - errchkjson + - errifinline - errname - errorlint - execinquery @@ -2537,6 +2538,7 @@ linters: - durationcheck - errcheck - errchkjson + - errifinline - errname - errorlint - execinquery diff --git a/go.mod b/go.mod index 94bd84ea5c1d..26a11d25f3e9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/golangci/golangci-lint -go 1.21 +go 1.21.0 + +toolchain go1.21.7 require ( 4d63.com/gocheckcompilerdirectives v1.2.1 @@ -20,6 +22,7 @@ require ( github.com/alingse/asasalint v0.0.11 github.com/ashanbrown/forbidigo v1.6.0 github.com/ashanbrown/makezero v1.1.1 + github.com/bastianccm/errifinline v0.0.1 github.com/bkielbasa/cyclop v1.2.1 github.com/blizzy78/varnamelen v0.8.0 github.com/bombsimon/wsl/v4 v4.2.1 @@ -123,7 +126,7 @@ require ( go-simpler.org/musttag v0.8.0 go-simpler.org/sloglint v0.4.0 golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc - golang.org/x/tools v0.17.0 + golang.org/x/tools v0.18.0 gopkg.in/yaml.v3 v3.0.1 honnef.co/go/tools v0.4.6 mvdan.cc/gofumpt v0.6.0 diff --git a/go.sum b/go.sum index d02410c64c65..4801d009a5b4 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,10 @@ github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8ger github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= +github.com/bastianccm/errifinline v0.0.0-20240215070448-9c2961c832a3 h1:ejUBTyGAv/ERMEayurlGTlvGATOSVnJBjx8USaFursQ= +github.com/bastianccm/errifinline v0.0.0-20240215070448-9c2961c832a3/go.mod h1:x3B7XsP3L1NlHgW4BT/nSaCkseasvQ+7pGNxKtrI1/4= +github.com/bastianccm/errifinline v0.0.1 h1:T+jie6PNIFST0p8OvmISox2hkgMJTLkEN2wmmPRRWJw= +github.com/bastianccm/errifinline v0.0.1/go.mod h1:x3B7XsP3L1NlHgW4BT/nSaCkseasvQ+7pGNxKtrI1/4= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -869,6 +873,8 @@ golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/golinters/errifinline.go b/pkg/golinters/errifinline.go new file mode 100644 index 000000000000..5f0ac8b933e4 --- /dev/null +++ b/pkg/golinters/errifinline.go @@ -0,0 +1,22 @@ +package golinters + +import ( + "github.com/bastianccm/errifinline" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewErrIfInline() *goanalysis.Linter { + a, err := errifinline.NewAnalyzer() + if err != nil { + linterLogger.Fatalf("errifinline: create analyzer: %v", err) + } + + return goanalysis.NewLinter( + a.Name, + a.Doc, + []*analysis.Analyzer{a}, + nil, + ).WithLoadMode(goanalysis.LoadModeTypesInfo) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index fdc73ec734a1..5ff9c2d62782 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -356,6 +356,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithLoadForGoAnalysis(). WithURL("https://github.com/breml/errchkjson"), + linter.NewConfig(golinters.NewErrIfInline()). + WithSince("1.57.0"). + WithLoadForGoAnalysis(). + WithURL("https://github.com/bastianccm/errifinline"), + linter.NewConfig(golinters.NewErrName()). WithSince("v1.42.0"). WithPresets(linter.PresetStyle). diff --git a/test/testdata/errifinline.go b/test/testdata/errifinline.go new file mode 100644 index 000000000000..c5cfe6ad7335 --- /dev/null +++ b/test/testdata/errifinline.go @@ -0,0 +1,36 @@ +//golangcitest:args -Eerrifinline +package testdata + +func error1() error { + return nil +} + +func error2() (any, error) { + return nil, nil +} + +func errIfInline() { + err := error1() + if err != nil { // want `inline err assignment in if initializer` + _ = err + } + + if err := error1(); err != nil { + _ = err + } + + _, err = error2() + if err != nil { // want `inline err assignment in if initializer` + _ = err + } + + if _, err := error2(); err != nil { + _ = err + } + + something, err := error2() + if err != nil { + _ = err + } + _ = something +}