github.com/vanstinator/golangci-lint@v0.0.0-20240223191551-cc572f00d9d1/pkg/golinters/importas.go (about) 1 package golinters 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 8 "github.com/julz/importas" //nolint:misspell 9 "golang.org/x/tools/go/analysis" 10 11 "github.com/vanstinator/golangci-lint/pkg/config" 12 "github.com/vanstinator/golangci-lint/pkg/golinters/goanalysis" 13 "github.com/vanstinator/golangci-lint/pkg/lint/linter" 14 ) 15 16 func NewImportAs(settings *config.ImportAsSettings) *goanalysis.Linter { 17 analyzer := importas.Analyzer 18 19 return goanalysis.NewLinter( 20 analyzer.Name, 21 analyzer.Doc, 22 []*analysis.Analyzer{analyzer}, 23 nil, 24 ).WithContextSetter(func(lintCtx *linter.Context) { 25 if settings == nil { 26 return 27 } 28 if len(settings.Alias) == 0 { 29 lintCtx.Log.Infof("importas settings found, but no aliases listed. List aliases under alias: key.") //nolint:misspell 30 } 31 32 if err := analyzer.Flags.Set("no-unaliased", strconv.FormatBool(settings.NoUnaliased)); err != nil { 33 lintCtx.Log.Errorf("failed to parse configuration: %v", err) 34 } 35 36 if err := analyzer.Flags.Set("no-extra-aliases", strconv.FormatBool(settings.NoExtraAliases)); err != nil { 37 lintCtx.Log.Errorf("failed to parse configuration: %v", err) 38 } 39 40 uniqPackages := make(map[string]config.ImportAsAlias) 41 uniqAliases := make(map[string]config.ImportAsAlias) 42 for _, a := range settings.Alias { 43 if a.Pkg == "" { 44 lintCtx.Log.Errorf("invalid configuration, empty package: pkg=%s alias=%s", a.Pkg, a.Alias) 45 continue 46 } 47 48 if v, ok := uniqPackages[a.Pkg]; ok { 49 lintCtx.Log.Errorf("invalid configuration, multiple aliases for the same package: pkg=%s aliases=[%s,%s]", a.Pkg, a.Alias, v.Alias) 50 } else { 51 uniqPackages[a.Pkg] = a 52 } 53 54 // skip the duplication check when the alias is a regular expression replacement pattern (ie. contains `$`). 55 if v, ok := uniqAliases[a.Alias]; ok && !strings.Contains(a.Alias, "$") { 56 lintCtx.Log.Errorf("invalid configuration, multiple packages with the same alias: alias=%s packages=[%s,%s]", a.Alias, a.Pkg, v.Pkg) 57 } else { 58 uniqAliases[a.Alias] = a 59 } 60 61 err := analyzer.Flags.Set("alias", fmt.Sprintf("%s:%s", a.Pkg, a.Alias)) 62 if err != nil { 63 lintCtx.Log.Errorf("failed to parse configuration: %v", err) 64 } 65 } 66 }).WithLoadMode(goanalysis.LoadModeTypesInfo) 67 }