From 91e48e2beda7b0aaa439d062ada655b8ee086ef5 Mon Sep 17 00:00:00 2001 From: Dinko Korunic Date: Fri, 14 Feb 2025 13:25:06 +0100 Subject: [PATCH] Add betteralign linter --- .golangci.next.reference.yml | 19 ++++++++ go.mod | 7 ++- go.sum | 14 ++++++ pkg/config/linters_settings.go | 8 ++++ pkg/golinters/betteralign/betteralign.go | 48 +++++++++++++++++++ .../betteralign_integration_test.go | 11 +++++ .../betteralign/testdata/betteralign.go | 47 ++++++++++++++++++ pkg/lint/lintersdb/builder_linter.go | 7 +++ 8 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 pkg/golinters/betteralign/betteralign.go create mode 100644 pkg/golinters/betteralign/betteralign_integration_test.go create mode 100644 pkg/golinters/betteralign/testdata/betteralign.go diff --git a/.golangci.next.reference.yml b/.golangci.next.reference.yml index 1912a5bd6500..f8dfaa5fa5a6 100644 --- a/.golangci.next.reference.yml +++ b/.golangci.next.reference.yml @@ -13,6 +13,7 @@ linters: enable: - asasalint - asciicheck + - betteralign - bidichk - bodyclose - canonicalheader @@ -129,6 +130,7 @@ linters: disable: - asasalint - asciicheck + - betteralign - bidichk - bodyclose - canonicalheader @@ -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. diff --git a/go.mod b/go.mod index 749ba9cb5df2..dfa413e967c9 100644 --- a/go.mod +++ b/go.mod @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/go.sum b/go.sum index dbe7bc7899af..402e72fdfaef 100644 --- a/go.sum +++ b/go.sum @@ -132,6 +132,12 @@ 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/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= +github.com/dkorunic/betteralign v0.6.3 h1:nMbsxf2arwTmd2XAmyDHEoBBZ6No6vDrYm66l28VNv4= +github.com/dkorunic/betteralign v0.6.3/go.mod h1:wuAYwCx/6p2A01tienn89c61OmsJcxgp01X0+qMv8JE= +github.com/dkorunic/betteralign v0.6.4 h1:+osPwiYwmikmFOCae6B28jYeHSfhqm0g5T2QU55k1qU= +github.com/dkorunic/betteralign v0.6.4/go.mod h1:NG0BoswX0f6U8TnZJ2ssfHpuBbnub1NYeeWKT9Ur3sg= +github.com/dkorunic/betteralign v0.6.5 h1:mhOQ+5f5Ssw80n82UsNB5/jCsFtocAbloKMncp7JWTs= +github.com/dkorunic/betteralign v0.6.5/go.mod h1:NG0BoswX0f6U8TnZJ2ssfHpuBbnub1NYeeWKT9Ur3sg= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= @@ -276,6 +282,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= +github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= @@ -492,10 +500,14 @@ github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxX github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= github.com/securego/gosec/v2 v2.22.1 h1:IcBt3TpI5Y9VN1YlwjSpM2cHu0i3Iw52QM+PQeg7jN8= github.com/securego/gosec/v2 v2.22.1/go.mod h1:4bb95X4Jz7VSEPdVjC0hD7C/yR6kdeUBvCPOy9gDQ0g= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirkon/dst v0.26.4 h1:ETxfjyp5JKE8OCpdybyyhzTyQqq/MwbIIcs7kxcUAcA= +github.com/sirkon/dst v0.26.4/go.mod h1:e6HRc56jU5F2XT6GB8Cyci1Jb5cjX6gLqrm5+T/P7Zo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -977,6 +989,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index 94650a66de9b..0c67a28acfb2 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -215,6 +215,7 @@ var defaultLintersSettings = LintersSettings{ type LintersSettings struct { Asasalint AsasalintSettings + Betteralign BetteralignSettings BiDiChk BiDiChkSettings CopyLoopVar CopyLoopVarSettings Cyclop Cyclop @@ -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"` diff --git a/pkg/golinters/betteralign/betteralign.go b/pkg/golinters/betteralign/betteralign.go new file mode 100644 index 000000000000..5d59f05f0ccc --- /dev/null +++ b/pkg/golinters/betteralign/betteralign.go @@ -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) +} diff --git a/pkg/golinters/betteralign/betteralign_integration_test.go b/pkg/golinters/betteralign/betteralign_integration_test.go new file mode 100644 index 000000000000..591eb6bbc094 --- /dev/null +++ b/pkg/golinters/betteralign/betteralign_integration_test.go @@ -0,0 +1,11 @@ +package betteralign + +import ( + "testing" + + "github.com/golangci/golangci-lint/test/testshared/integration" +) + +func TestFromTestdata(t *testing.T) { + integration.RunTestdata(t) +} diff --git a/pkg/golinters/betteralign/testdata/betteralign.go b/pkg/golinters/betteralign/testdata/betteralign.go new file mode 100644 index 000000000000..331f51fdf5f2 --- /dev/null +++ b/pkg/golinters/betteralign/testdata/betteralign.go @@ -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 +} diff --git a/pkg/lint/lintersdb/builder_linter.go b/pkg/lint/lintersdb/builder_linter.go index 7fa63e526676..8eea753d37c4 100644 --- a/pkg/lint/lintersdb/builder_linter.go +++ b/pkg/lint/lintersdb/builder_linter.go @@ -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" @@ -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).