Skip to content

Add betteralign linter #5417

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .golangci.next.reference.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ linters:
enable:
- asasalint
- asciicheck
- betteralign
- bidichk
- bodyclose
- canonicalheader
Expand Down Expand Up @@ -129,6 +130,7 @@ linters:
disable:
- asasalint
- asciicheck
- betteralign
- bidichk
- bodyclose
- canonicalheader
Expand Down Expand Up @@ -292,6 +294,23 @@ linters-settings:
# Default: false
ignore-test: true

betteralign:
# Enable checking and fixing test files as well (ending in `_test.go`)
# Default: false
test-files: false

# Enable checking and fixing generated files (ending in `_generated.go`, `_gen.go`, `.gen.go`, `.pb.go`, `.pb.gw.go`)
# Default: false
generated-files: false

# Exclude files matching the specified glob pattern, for instance: `testdata/src/exclude/b/b/*.go`
# Default: []
exclude-files:

# Exclude directories matching the specified glob pattern, for instance: `testdata/src/exclude/all/`
# Default: []
exclude-dirs:

bidichk:
# The following configurations check for all mentioned invisible Unicode runes.
# All runes are enabled by default.
Expand Down
7 changes: 6 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
module github.com/golangci/golangci-lint

go 1.23.0
go 1.24

toolchain go1.24.0

require (
4d63.com/gocheckcompilerdirectives v1.2.1
Expand Down Expand Up @@ -35,6 +37,7 @@ require (
github.com/curioswitch/go-reassign v0.3.0
github.com/daixiang0/gci v0.13.5
github.com/denis-tingaikin/go-header v0.5.0
github.com/dkorunic/betteralign v0.6.5
github.com/fatih/color v1.18.0
github.com/firefart/nonamedreturns v1.0.5
github.com/fzipp/gocyclo v0.6.0
Expand Down Expand Up @@ -156,6 +159,7 @@ require (
github.com/gobwas/glob v0.2.3 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/renameio/v2 v2.0.0 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
github.com/gostaticanalysis/comment v1.4.2 // indirect
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
Expand All @@ -182,6 +186,7 @@ require (
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/sirkon/dst v0.26.4 // indirect
github.com/spf13/afero v1.12.0 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
Expand Down
14 changes: 14 additions & 0 deletions go.sum

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

8 changes: 8 additions & 0 deletions pkg/config/linters_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ var defaultLintersSettings = LintersSettings{

type LintersSettings struct {
Asasalint AsasalintSettings
Betteralign BetteralignSettings
BiDiChk BiDiChkSettings
CopyLoopVar CopyLoopVarSettings
Cyclop Cyclop
Expand Down Expand Up @@ -322,6 +323,13 @@ type AsasalintSettings struct {
IgnoreTest bool `mapstructure:"ignore-test"`
}

type BetteralignSettings struct {
TestFiles bool `mapstructure:"test-files"`
GeneratedFiles bool `mapstructure:"generated-files"`
ExcludeFiles []string `mapstructure:"exclude-files"`
ExcludeDirs []string `mapstructure:"exclude-dirs"`
}

type BiDiChkSettings struct {
LeftToRightEmbedding bool `mapstructure:"left-to-right-embedding"`
RightToLeftEmbedding bool `mapstructure:"right-to-left-embedding"`
Expand Down
48 changes: 48 additions & 0 deletions pkg/golinters/betteralign/betteralign.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package betteralign

import (
"strconv"
"strings"

"github.com/dkorunic/betteralign"
"golang.org/x/tools/go/analysis"

"github.com/golangci/golangci-lint/pkg/config"
"github.com/golangci/golangci-lint/pkg/goanalysis"
"github.com/golangci/golangci-lint/pkg/lint/linter"
)

func New(settings *config.BetteralignSettings) *goanalysis.Linter {
a := betteralign.Analyzer

return goanalysis.NewLinter(
a.Name,
a.Doc,
[]*analysis.Analyzer{a},
nil,
).WithContextSetter(func(ctx *linter.Context) {
if settings == nil {
return
}

if err := a.Flags.Set("test_files", strconv.FormatBool(settings.TestFiles)); err != nil {
ctx.Log.Infof("failed to parse configuration: %v", err)
}

if err := a.Flags.Set("generated_files", strconv.FormatBool(settings.GeneratedFiles)); err != nil {
ctx.Log.Infof("failed to parse configuration: %v", err)
}

if len(settings.ExcludeFiles) > 0 {
if err := a.Flags.Set("exclude_files", strings.Join(settings.ExcludeFiles, ",")); err != nil {
ctx.Log.Infof("failed to parse configuration: %v", err)
}
}

if len(settings.ExcludeDirs) > 0 {
if err := a.Flags.Set("exclude_dirs", strings.Join(settings.ExcludeDirs, ",")); err != nil {
ctx.Log.Infof("failed to parse configuration: %v", err)
}
}
}).WithLoadMode(goanalysis.LoadModeTypesInfo)
}
11 changes: 11 additions & 0 deletions pkg/golinters/betteralign/betteralign_integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package betteralign

import (
"testing"

"github.com/golangci/golangci-lint/test/testshared/integration"
)

func TestFromTestdata(t *testing.T) {
integration.RunTestdata(t)
}
47 changes: 47 additions & 0 deletions pkg/golinters/betteralign/testdata/betteralign.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//golangcitest:args -Ebetteralign
package testdata

type Good struct {
y int32
x byte
z byte
}

type Bad struct { // want "struct of size 12 could be 8"
x byte
y int32
z byte
}

type ZeroGood struct {
a [0]byte
b uint32
}

type ZeroBad struct { // want "struct of size 8 could be 4"
a uint32
b [0]byte
}

type NoNameGood struct {
Good
y int32
x byte
z byte
}

type NoNameBad struct { // want "struct of size 20 could be 16"
Good
x byte
y int32
z byte
}

type WithComments struct { // want "struct of size 8 could be 4"
// doc style comment
a uint32 // field a comment
b [0]byte // field b comment
// other doc style comment

// and a last comment
}
7 changes: 7 additions & 0 deletions pkg/lint/lintersdb/builder_linter.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/golangci/golangci-lint/pkg/golinters"
"github.com/golangci/golangci-lint/pkg/golinters/asasalint"
"github.com/golangci/golangci-lint/pkg/golinters/asciicheck"
"github.com/golangci/golangci-lint/pkg/golinters/betteralign"
"github.com/golangci/golangci-lint/pkg/golinters/bidichk"
"github.com/golangci/golangci-lint/pkg/golinters/bodyclose"
"github.com/golangci/golangci-lint/pkg/golinters/canonicalheader"
Expand Down Expand Up @@ -147,6 +148,12 @@ func (LinterBuilder) Build(cfg *config.Config) ([]*linter.Config, error) {
WithPresets(linter.PresetBugs, linter.PresetStyle).
WithURL("https://github.com/tdakkota/asciicheck"),

linter.NewConfig(betteralign.New(&cfg.LintersSettings.Betteralign)).
WithSince("v1.65.0").
WithLoadForGoAnalysis().
WithPresets(linter.PresetPerformance, linter.PresetBugs).
WithURL("https://github.com/dkorunic/betteralign"),

linter.NewConfig(bidichk.New(&cfg.LintersSettings.BiDiChk)).
WithSince("v1.43.0").
WithPresets(linter.PresetBugs).
Expand Down