Skip to content

Commit

Permalink
add nosnakecase lint (golangci#2828)
Browse files Browse the repository at this point in the history
Co-authored-by: Fernandez Ludovic <ldez@users.noreply.github.com>
  • Loading branch information
2 people authored and SeigeC committed Apr 4, 2023
1 parent fed51b5 commit 6d475f5
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 7 deletions.
1 change: 1 addition & 0 deletions go.mod
Expand Up @@ -155,6 +155,7 @@ require (
github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/sivchari/nosnakecase v1.5.0
github.com/spf13/afero v1.8.2 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
Expand Down
8 changes: 2 additions & 6 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions pkg/golinters/nosnakecase.go
@@ -0,0 +1,19 @@
package golinters

import (
"github.com/sivchari/nosnakecase"
"golang.org/x/tools/go/analysis"

"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)

func NewNoSnakeCase() *goanalysis.Linter {
a := nosnakecase.Analyzer

return goanalysis.NewLinter(
a.Name,
a.Doc,
[]*analysis.Analyzer{a},
nil,
).WithLoadMode(goanalysis.LoadModeSyntax)
}
5 changes: 5 additions & 0 deletions pkg/lint/lintersdb/manager.go
Expand Up @@ -631,6 +631,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithPresets(linter.PresetStyle).
WithURL("https://github.com/firefart/nonamedreturns"),

linter.NewConfig(golinters.NewNoSnakeCase()).
WithSince("v1.47.0").
WithPresets(linter.PresetStyle).
WithURL("https://github.com/sivchari/nosnakecase"),

linter.NewConfig(golinters.NewNoSprintfHostPort()).
WithSince("v1.46.0").
WithPresets(linter.PresetStyle).
Expand Down
2 changes: 1 addition & 1 deletion test/run_test.go
Expand Up @@ -95,7 +95,7 @@ func TestTestsAreLintedByDefault(t *testing.T) {
}

func TestCgoOk(t *testing.T) {
testshared.NewLintRunner(t).Run("--no-config", "--enable-all", getTestDataDir("cgo")).ExpectNoIssues()
testshared.NewLintRunner(t).Run("--no-config", "--enable-all", "-D", "nosnakecase", getTestDataDir("cgo")).ExpectNoIssues()
}

func TestCgoWithIssues(t *testing.T) {
Expand Down
149 changes: 149 additions & 0 deletions test/testdata/nosnakecase.go
@@ -0,0 +1,149 @@
//args: -Enosnakecase
package testdata

import (
_ "fmt"
f_m_t "fmt" // ERROR "f_m_t contains underscore. You should use mixedCap or MixedCap."
)

// global variable name with underscore.
var v_v = 0 // ERROR "v_v contains underscore. You should use mixedCap or MixedCap."

// global constant name with underscore.
const c_c = 0 // ERROR "c_c contains underscore. You should use mixedCap or MixedCap."

// struct name with underscore.
type S_a struct { // ERROR "S_a contains underscore. You should use mixedCap or MixedCap."
fi int
}

// non-exported struct field name with underscore.
type Sa struct {
fi_a int // // ERROR "fi_a contains underscore. You should use mixedCap or MixedCap."
}

// function as struct field, with parameter name with underscore.
type Sb struct {
fib func(p_a int) // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."
}

// exported struct field with underscore.
type Sc struct {
Fi_A int // ERROR "Fi_A contains underscore. You should use mixedCap or MixedCap."
}

// function as struct field, with return name with underscore.
type Sd struct {
fib func(p int) (r_a int) // ERROR "r_a contains underscore. You should use mixedCap or MixedCap."
}

// interface name with underscore.
type I_a interface { // ERROR "I_a contains underscore. You should use mixedCap or MixedCap."
fn(p int)
}

// interface with parameter name with underscore.
type Ia interface {
fn(p_a int) // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."
}

// interface with parameter name with underscore.
type Ib interface {
Fn(p_a int) // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."
}

// function as struct field, with return name with underscore.
type Ic interface {
Fn_a() // ERROR "Fn_a contains underscore. You should use mixedCap or MixedCap."
}

// interface with return name with underscore.
type Id interface {
Fn() (r_a int) // ERROR "r_a contains underscore. You should use mixedCap or MixedCap."
}

// function name with underscore.
func f_a() {} // ERROR "f_a contains underscore. You should use mixedCap or MixedCap."

// function's parameter name with underscore.
func fb(p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."

// named return with underscore.
func fc() (r_b int) { // ERROR "r_b contains underscore. You should use mixedCap or MixedCap."
return 0
}

// local variable (short declaration) with underscore.
func fd(p int) int {
v_b := p * 2 // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."

return v_b // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."
}

// local constant with underscore.
func fe(p int) int {
const v_b = 2 // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."

return v_b * p // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."
}

// local variable with underscore.
func ff(p int) int {
var v_b = 2 // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."

return v_b * p // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."
}

// inner function, parameter name with underscore.
func fg() {
fgl := func(p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."
fgl(1)
}

type Foo struct{}

// method name with underscore.
func (f Foo) f_a() {} // ERROR "f_a contains underscore. You should use mixedCap or MixedCap."

// method's parameter name with underscore.
func (f Foo) fb(p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."

// named return with underscore.
func (f Foo) fc() (r_b int) { return 0 } // ERROR "r_b contains underscore. You should use mixedCap or MixedCap."

// local variable (short declaration) with underscore.
func (f Foo) fd(p int) int {
v_b := p * 2 // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."

return v_b // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."
}

// local constant with underscore.
func (f Foo) fe(p int) int {
const v_b = 2 // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."

return v_b * p // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."
}

// local variable with underscore.
func (f Foo) ff(p int) int {
var v_b = 2 // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."

return v_b * p // ERROR "v_b contains underscore. You should use mixedCap or MixedCap."
}

func fna(a, p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."

func fna1(a string, p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."

func fnb(a, b, p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."

func fnb1(a, b string, p_a int) {} // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."

func fnd(
p_a int, // ERROR "p_a contains underscore. You should use mixedCap or MixedCap."
p_b int, // ERROR "p_b contains underscore. You should use mixedCap or MixedCap."
p_c int, // ERROR "p_c contains underscore. You should use mixedCap or MixedCap."
) {
f_m_t.Println("") // ERROR "f_m_t contains underscore. You should use mixedCap or MixedCap."
}

0 comments on commit 6d475f5

Please sign in to comment.