diff --git a/BUILD.bazel b/BUILD.bazel index 2f23bc5cf35..4e00a11cfc5 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -209,6 +209,7 @@ nogo( "//dev/linters/bodyclose", "//dev/linters/forbidigo", "//dev/linters/ineffassign", + "//dev/linters/gocritic", ], ) diff --git a/dev/linters/go.mod b/dev/linters/go.mod index 771752b3e16..349493adac2 100644 --- a/dev/linters/go.mod +++ b/dev/linters/go.mod @@ -4,14 +4,27 @@ go 1.19 require ( github.com/ashanbrown/forbidigo v1.5.1 + github.com/go-critic/go-critic v0.6.7 github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e - golang.org/x/tools v0.3.0 + golang.org/x/tools v0.6.0 ) require ( - github.com/google/go-cmp v0.5.6 // indirect + github.com/go-toolsmith/astcast v1.1.0 // indirect + github.com/go-toolsmith/astcopy v1.0.2 // indirect + github.com/go-toolsmith/astequal v1.1.0 // indirect + github.com/go-toolsmith/astfmt v1.1.0 // indirect + github.com/go-toolsmith/astp v1.1.0 // indirect + github.com/go-toolsmith/strparse v1.1.0 // indirect + github.com/go-toolsmith/typep v1.1.0 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.4.2 // indirect + github.com/quasilyte/go-ruleguard v0.3.19 // indirect + github.com/quasilyte/gogrep v0.5.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect + golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/dev/linters/go.sum b/dev/linters/go.sum index 3828ecad958..ec7fc48def7 100644 --- a/dev/linters/go.sum +++ b/dev/linters/go.sum @@ -3,10 +3,32 @@ github.com/ashanbrown/forbidigo v1.5.1/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-critic/go-critic v0.6.7 h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM= +github.com/go-critic/go-critic v0.6.7/go.mod h1:fYZUijFdcnxgx6wPjQA2QEjIRaNCT0gO8bhexy6/QmE= +github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.0.2 h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0= +github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= @@ -25,6 +47,14 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9 github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= +github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -42,12 +72,15 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 h1:6WHiuFL9FNjg8RljAaT7FNUuKDbvMqS1i5cr2OE2sLQ= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -92,12 +125,12 @@ golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0t golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/dev/linters/gocritic/BUILD.bazel b/dev/linters/gocritic/BUILD.bazel new file mode 100644 index 00000000000..c608d2a314e --- /dev/null +++ b/dev/linters/gocritic/BUILD.bazel @@ -0,0 +1,13 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "gocritic", + srcs = ["gocritic.go"], + importpath = "github.com/sourcegraph/sourcegraph/dev/linters/gocritic", + visibility = ["//visibility:public"], + deps = [ + "@com_github_gocritic_gocritic//framework/linter:linter", + "@org_golang_x_tools//go/analysis:go_default_library", + "@org_golang_x_exp_typeparams//:go_default_library", + ], +) diff --git a/dev/linters/gocritic/gocritic.go b/dev/linters/gocritic/gocritic.go new file mode 100644 index 00000000000..9eee411f01d --- /dev/null +++ b/dev/linters/gocritic/gocritic.go @@ -0,0 +1,112 @@ +package gocritic + +import ( + "fmt" + "path/filepath" + + "github.com/go-critic/go-critic/framework/linter" + "golang.org/x/tools/go/analysis" +) + +var Analyzer *analysis.Analyzer = createAnalyzer() + +// DisabledLinters is a list of linter names that should be disabled and not be used during analysis +var DisabledLinters = []string{ + "appendAssign", + "assignOp", + "commentFormatting", + "deprecatedComment", + "exitAfterDefer", + "ifElseChain", + "singleCaseSwitch", +} + +func createAnalyzer() *analysis.Analyzer { + linters := GetEnabledLinters(DisabledLinters...) + + return &analysis.Analyzer{ + Name: "gocritic", + Doc: "linter from go-critic/go-critic, modified to be runnable in nogo", + Run: runWithLinters(linters), + } +} + +// runWithLinters is copied from https://sourcegraph.com/github.com/go-critic/go-critic@3f8d719ce34bb78eacfdb8fef52228aff8cbdb10/-/blob/checkers/analyzer/run.go?L27 +// modifications: manually specify the checkers instead of parsing it from command line args +func runWithLinters(enabledLinters []*linter.CheckerInfo) func(*analysis.Pass) (interface{}, error) { + return func(pass *analysis.Pass) (interface{}, error) { + ctx := linter.NewContext(pass.Fset, pass.TypesSizes) + ctx.SetPackageInfo(pass.TypesInfo, pass.Pkg) + + checkers, err := toCheckers(ctx, enabledLinters) + if err != nil { + return nil, err + } + for _, f := range pass.Files { + filename := filepath.Base(pass.Fset.Position(f.Pos()).Filename) + ctx.SetFileInfo(filename, f) + for _, c := range checkers { + warnings := c.Check(f) + for _, warning := range warnings { + diag := analysis.Diagnostic{ + Pos: warning.Pos, + Message: fmt.Sprintf("%s: %s", c.Info.Name, warning.Text), + } + if warning.HasQuickFix() { + diag.SuggestedFixes = []analysis.SuggestedFix{ + { + Message: "suggested replacement", + TextEdits: []analysis.TextEdit{ + { + Pos: warning.Suggestion.From, + End: warning.Suggestion.To, + NewText: warning.Suggestion.Replacement, + }, + }, + }, + } + } + pass.Report(diag) + } + } + } + + return nil, nil + } +} + +func toCheckers(ctx *linter.Context, linters []*linter.CheckerInfo) ([]*linter.Checker, error) { + checkers := []*linter.Checker{} + + for _, l := range linters { + c, err := linter.NewChecker(ctx, l) + if err != nil { + return nil, err + } + checkers = append(checkers, c) + } + + return checkers, nil +} + +func GetEnabledLinters(disabledLinters ...string) []*linter.CheckerInfo { + all := linter.GetCheckersInfo() + + enabled := []*linter.CheckerInfo{} + for _, l := range all { + if !isDisabled(l, disabledLinters) { + enabled = append(enabled, l) + } + } + + return enabled +} + +func isDisabled(linter *linter.CheckerInfo, disabledLinters []string) bool { + for _, d := range disabledLinters { + if d == linter.Name { + return true + } + } + return false +} diff --git a/linter_deps.bzl b/linter_deps.bzl index 51764114174..f3aefda3d4f 100644 --- a/linter_deps.bzl +++ b/linter_deps.bzl @@ -35,9 +35,115 @@ def linter_dependencies(): go_repository( name = "com_github_gordonklaus_ineffassign", + build_file_proto_mode = "disable_global", importpath = "github.com/gordonklaus/ineffassign", version = "v0.0.0-20230107090616-13ace0543b28", sum = "h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U=", ) + go_repository( + name = "com_github_gocritic_gocritic", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-critic/go-critic", + version = "v0.6.7", + sum = "h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM=", + ) + go_repository( + name = "com_github_go_toolsmith_astcast", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/astcast", + version = "v1.1.0", + sum = "h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8=", + ) + + go_repository( + name = "com_github_go_toolsmith_astcopy", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/astcopy", + version = "v1.0.2", + sum = "h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0=", + ) + + go_repository( + name = "com_github_go_toolsmith_astequal", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/astequal", + version = "v1.1.0", + sum = "h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw=", + ) + + go_repository( + name = "com_github_go_toolsmith_astfmt", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/astfmt", + version = "v1.1.0", + sum = "h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco=", + ) + + go_repository( + name = "com_github_go_toolsmith_astp", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/astp", + version = "v1.1.0", + sum = "h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA=", + ) + + go_repository( + name = "com_github_go_toolsmith_pkgload", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/pkgload", + version = "v1.0.2-0.20220101231613-e814995d17c5", + sum = "h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o=", + ) + + go_repository( + name = "com_github_go_toolsmith_strparse", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/strparse", + version = "v1.1.0", + sum = "h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw=", + ) + + go_repository( + name = "com_github_go_toolsmith_typep", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-toolsmith/typep", + version = "v1.1.0", + sum = "h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus=", + ) + + go_repository( + name = "com_github_quasilyte_go_ruleguard", + importpath = "github.com/quasilyte/go-ruleguard", + version = "v0.3.19", + sum = "h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc=", + ) + + go_repository( + name = "com_github_quasilyte_gogrep", + importpath = "github.com/quasilyte/gogrep", + version = "v0.5.0", + sum = "h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo=", + ) + + go_repository( + name = "com_github_quasilyte_regex_syntax", + importpath = "github.com/quasilyte/regex/syntax", + version = "v0.0.0-20200407221936-30656e2c4a95", + sum = "h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY=", + ) + + go_repository( + name = "com_github_quasilyte_stdinfo", + importpath = "github.com/quasilyte/stdinfo", + version = "v0.0.0-20220114132959-f7386bf02567", + sum = "h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs=", + ) + + go_repository( + name = "org_golang_x_exp_typeparams", + importpath = "golang.org/x/exp/typeparams", + version = "v0.0.0-20230203172020-98cc5a0785f9", + sum = "h1:6WHiuFL9FNjg8RljAaT7FNUuKDbvMqS1i5cr2OE2sLQ=", + )