diff --git a/go.mod b/go.mod index 79835dae4bf2..8bb0635cd5d2 100644 --- a/go.mod +++ b/go.mod @@ -73,6 +73,7 @@ require ( github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c github.com/shirou/gopsutil/v3 v3.21.12 github.com/sirupsen/logrus v1.8.1 + github.com/sivchari/containedctx v1.0.1 github.com/sivchari/tenv v1.4.7 github.com/sonatard/noctx v0.0.1 github.com/sourcegraph/go-diff v0.6.1 diff --git a/go.sum b/go.sum index 4c60d553b8cb..604c663bea91 100644 --- a/go.sum +++ b/go.sum @@ -702,6 +702,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sivchari/containedctx v1.0.1 h1:fJq44cX+tD+uT5xGrsg25GwiaY61NGybQk9WWKij3Uo= +github.com/sivchari/containedctx v1.0.1/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= github.com/sivchari/tenv v1.4.7 h1:FdTpgRlTue5eb5nXIYgS/lyVXSjugU8UUVDwhP1NLU8= github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= diff --git a/pkg/golinters/containedctx.go b/pkg/golinters/containedctx.go new file mode 100644 index 000000000000..8592eef1f9ae --- /dev/null +++ b/pkg/golinters/containedctx.go @@ -0,0 +1,19 @@ +package golinters + +import ( + "github.com/sivchari/containedctx" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewContainedCtx() *goanalysis.Linter { + a := containedctx.Analyzer + + return goanalysis.NewLinter( + a.Name, + a.Doc, + []*analysis.Analyzer{a}, + nil, + ).WithLoadMode(goanalysis.LoadModeSyntax) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 1213dc518e1d..f9a303aeb358 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -183,6 +183,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetPerformance, linter.PresetBugs). WithURL("https://github.com/timakin/bodyclose"), + linter.NewConfig(golinters.NewContainedCtx()). + WithSince("1.44.0"). + WithPresets(linter.PresetStyle). + WithURL("https://github.com/sivchari/containedctx"), + linter.NewConfig(golinters.NewContextCheck()). WithSince("v1.43.0"). WithPresets(linter.PresetBugs). diff --git a/test/testdata/containedctx.go b/test/testdata/containedctx.go new file mode 100644 index 000000000000..ef8fc9fce6db --- /dev/null +++ b/test/testdata/containedctx.go @@ -0,0 +1,15 @@ +// args: -Econtainedctx +package testdata + +import "context" + +type ok struct { + i int + s string +} + +type ng struct { + ctx context.Context // ERROR "found a struct that contains a context.Context field" +} + +type empty struct{}