From 466a1ebd073f9b32cbc5d4dd9743c5d8b39b2771 Mon Sep 17 00:00:00 2001 From: Camden Cheek Date: Tue, 8 Aug 2023 13:42:34 -0600 Subject: [PATCH 1/3] add unused linter --- BUILD.bazel | 1 + dev/linters/unused/BUILD.bazel | 12 ++++++++++++ dev/linters/unused/unused.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 dev/linters/unused/BUILD.bazel create mode 100644 dev/linters/unused/unused.go diff --git a/BUILD.bazel b/BUILD.bazel index d40e69681d56..f35e5cc18c06 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -317,6 +317,7 @@ nogo( "//dev/linters/gocritic", "//dev/linters/ineffassign", "//dev/linters/unparam", + "//dev/linters/unused", ] + STATIC_CHECK_ANALYZERS, }), ) diff --git a/dev/linters/unused/BUILD.bazel b/dev/linters/unused/BUILD.bazel new file mode 100644 index 000000000000..d6f287dc6da8 --- /dev/null +++ b/dev/linters/unused/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "unused", + srcs = ["unused.go"], + importpath = "github.com/sourcegraph/sourcegraph/dev/linters/unused", + visibility = ["//visibility:public"], + deps = [ + "@co_honnef_go_tools//unused", + "@org_golang_x_tools//go/analysis", + ], +) diff --git a/dev/linters/unused/unused.go b/dev/linters/unused/unused.go new file mode 100644 index 000000000000..5e247a096c74 --- /dev/null +++ b/dev/linters/unused/unused.go @@ -0,0 +1,31 @@ +package unused + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/unused" +) + +var Analyzer = &analysis.Analyzer{ + Name: "unused", + Doc: unused.Analyzer.Analyzer.Doc, + Run: func(pass *analysis.Pass) (interface{}, error) { + res, err := unused.Analyzer.Analyzer.Run(pass) + if err != nil { + return res, err + } + allUnused := res.(unused.Result).Unused + for _, u := range allUnused { + pass.Report(analysis.Diagnostic{ + Pos: token.Pos(u.Position.Offset), + Message: fmt.Sprintf("%s is unused", u.Name), + }) + } + return res, err + }, + Requires: unused.Analyzer.Analyzer.Requires, + ResultType: unused.Analyzer.Analyzer.ResultType, + FactTypes: []analysis.Fact{}, +} From 2bb3647dc1640d2b178f79dbc3569a77b4ce3ce6 Mon Sep 17 00:00:00 2001 From: Camden Cheek Date: Tue, 8 Aug 2023 14:12:18 -0600 Subject: [PATCH 2/3] disable unused by default --- BUILD.bazel | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BUILD.bazel b/BUILD.bazel index f35e5cc18c06..49721eb64d88 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -317,7 +317,8 @@ nogo( "//dev/linters/gocritic", "//dev/linters/ineffassign", "//dev/linters/unparam", - "//dev/linters/unused", + # Disabled because we currently have a lot of unused code + # "//dev/linters/unused", ] + STATIC_CHECK_ANALYZERS, }), ) From 0c0b4642d2fb5494819c7dbff2baba49fbaaa5fb Mon Sep 17 00:00:00 2001 From: Camden Cheek Date: Tue, 8 Aug 2023 14:23:53 -0600 Subject: [PATCH 3/3] make it an idiomatic wrapper --- dev/linters/unused/BUILD.bazel | 1 + dev/linters/unused/unused.go | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/dev/linters/unused/BUILD.bazel b/dev/linters/unused/BUILD.bazel index d6f287dc6da8..54669035cd97 100644 --- a/dev/linters/unused/BUILD.bazel +++ b/dev/linters/unused/BUILD.bazel @@ -6,6 +6,7 @@ go_library( importpath = "github.com/sourcegraph/sourcegraph/dev/linters/unused", visibility = ["//visibility:public"], deps = [ + "//dev/linters/nolint", "@co_honnef_go_tools//unused", "@org_golang_x_tools//go/analysis", ], diff --git a/dev/linters/unused/unused.go b/dev/linters/unused/unused.go index 5e247a096c74..738e084b817b 100644 --- a/dev/linters/unused/unused.go +++ b/dev/linters/unused/unused.go @@ -3,29 +3,29 @@ package unused import ( "fmt" "go/token" + "reflect" + "github.com/sourcegraph/sourcegraph/dev/linters/nolint" "golang.org/x/tools/go/analysis" "honnef.co/go/tools/unused" ) -var Analyzer = &analysis.Analyzer{ +var Analyzer = nolint.Wrap(&analysis.Analyzer{ Name: "unused", - Doc: unused.Analyzer.Analyzer.Doc, + Doc: "Unused code", Run: func(pass *analysis.Pass) (interface{}, error) { - res, err := unused.Analyzer.Analyzer.Run(pass) - if err != nil { - return res, err - } - allUnused := res.(unused.Result).Unused + // This is just a lightweight wrapper around the default unused + // analyzer that reports a diagnostic error rather than just returning + // a result + allUnused := pass.ResultOf[unused.Analyzer.Analyzer].(unused.Result).Unused for _, u := range allUnused { pass.Report(analysis.Diagnostic{ Pos: token.Pos(u.Position.Offset), Message: fmt.Sprintf("%s is unused", u.Name), }) } - return res, err + return nil, nil }, - Requires: unused.Analyzer.Analyzer.Requires, - ResultType: unused.Analyzer.Analyzer.ResultType, - FactTypes: []analysis.Fact{}, -} + Requires: []*analysis.Analyzer{unused.Analyzer.Analyzer}, + ResultType: reflect.TypeOf(nil), +})