diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index 9a26ca06a4ba..aed8ddcd2b9b 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -226,7 +226,8 @@ type FunlenSettings struct { } type GciSettings struct { - LocalPrefixes string `mapstructure:"local-prefixes"` + LocalPrefixes string `mapstructure:"local-prefixes"` + LocalPrefixModule bool `mapstructure:"local-prefix-module"` } type GocognitSettings struct { @@ -277,7 +278,8 @@ type GoHeaderSettings struct { } type GoImportsSettings struct { - LocalPrefixes string `mapstructure:"local-prefixes"` + LocalPrefixes string `mapstructure:"local-prefixes"` + LocalPrefixModule bool `mapstructure:"local-prefix-module"` } type GoLintSettings struct { diff --git a/pkg/golinters/gci.go b/pkg/golinters/gci.go index 9886fc5f2587..ee3a56c38093 100644 --- a/pkg/golinters/gci.go +++ b/pkg/golinters/gci.go @@ -3,6 +3,7 @@ package golinters import ( "bytes" "fmt" + "strings" "sync" "github.com/daixiang0/gci/pkg/gci" @@ -32,11 +33,32 @@ func NewGci() *goanalysis.Linter { nil, ).WithContextSetter(func(lintCtx *linter.Context) { localFlag := lintCtx.Settings().Gci.LocalPrefixes + + if localFlag == "" && lintCtx.Settings().Gci.LocalPrefixModule { + var modules []string + + for _, module := range lintCtx.Modules { + modules = append(modules, module.Path) + } + + localFlag = strings.Join(modules, ",") + } + goimportsFlag := lintCtx.Settings().Goimports.LocalPrefixes if localFlag == "" && goimportsFlag != "" { localFlag = goimportsFlag } + if localFlag == "" && lintCtx.Settings().Goimports.LocalPrefixModule { + var modules []string + + for _, module := range lintCtx.Modules { + modules = append(modules, module.Path) + } + + localFlag = strings.Join(modules, ",") + } + analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { var fileNames []string for _, f := range pass.Files { diff --git a/pkg/golinters/goimports.go b/pkg/golinters/goimports.go index b58af1967602..c9d72bb8e000 100644 --- a/pkg/golinters/goimports.go +++ b/pkg/golinters/goimports.go @@ -1,6 +1,7 @@ package golinters import ( + "strings" "sync" goimportsAPI "github.com/golangci/gofmt/goimports" @@ -29,6 +30,17 @@ func NewGoimports() *goanalysis.Linter { nil, ).WithContextSetter(func(lintCtx *linter.Context) { imports.LocalPrefix = lintCtx.Settings().Goimports.LocalPrefixes + + if imports.LocalPrefix == "" && lintCtx.Settings().Goimports.LocalPrefixModule { + var modules []string + + for _, module := range lintCtx.Modules { + modules = append(modules, module.Path) + } + + imports.LocalPrefix = strings.Join(modules, ",") + } + analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { var fileNames []string for _, f := range pass.Files { diff --git a/pkg/lint/linter/context.go b/pkg/lint/linter/context.go index a9f9d7d7f2b3..33c65686b213 100644 --- a/pkg/lint/linter/context.go +++ b/pkg/lint/linter/context.go @@ -20,6 +20,8 @@ type Context struct { // version for each of packages OriginalPackages []*packages.Package + Modules []*packages.Module + Cfg *config.Config FileCache *fsutils.FileCache LineCache *fsutils.LineCache diff --git a/pkg/lint/load.go b/pkg/lint/load.go index a393a1d081eb..2c87fa6f2886 100644 --- a/pkg/lint/load.go +++ b/pkg/lint/load.go @@ -65,7 +65,7 @@ func (cl *ContextLoader) prepareBuildContext() { } func (cl *ContextLoader) findLoadMode(linters []*linter.Config) packages.LoadMode { - loadMode := packages.LoadMode(0) + loadMode := packages.LoadMode(0) | packages.NeedModule // TODO: make this part of the linter load mode? for _, lc := range linters { loadMode |= lc.LoadMode } @@ -283,6 +283,20 @@ func (cl *ContextLoader) filterDuplicatePackages(pkgs []*packages.Package) []*pa return retPkgs } +func (cl *ContextLoader) getModules(pkgs []*packages.Package) []*packages.Module { + modules := []*packages.Module{} + moduleIndex := map[string]bool{} + + for _, pkg := range pkgs { + if pkg.Module != nil && moduleIndex[pkg.Module.Path] == false { + moduleIndex[pkg.Module.Path] = true + modules = append(modules, pkg.Module) + } + } + + return modules +} + func (cl *ContextLoader) Load(ctx context.Context, linters []*linter.Config) (*linter.Context, error) { loadMode := cl.findLoadMode(linters) pkgs, err := cl.loadPackages(ctx, loadMode) @@ -296,6 +310,8 @@ func (cl *ContextLoader) Load(ctx context.Context, linters []*linter.Config) (*l return nil, exitcodes.ErrNoGoFiles } + modules := cl.getModules(pkgs) + ret := &linter.Context{ Packages: deduplicatedPkgs, @@ -303,6 +319,8 @@ func (cl *ContextLoader) Load(ctx context.Context, linters []*linter.Config) (*l // see https://github.com/golangci/golangci-lint/pull/585. OriginalPackages: pkgs, + Modules: modules, + Cfg: cl.cfg, Log: cl.log, FileCache: cl.fileCache,