github.com/nozzle/golangci-lint@v1.49.0-nz3/pkg/golinters/goanalysis/metalinter.go (about) 1 package goanalysis 2 3 import ( 4 "context" 5 6 "github.com/pkg/errors" 7 "golang.org/x/tools/go/analysis" 8 9 "github.com/golangci/golangci-lint/pkg/lint/linter" 10 "github.com/golangci/golangci-lint/pkg/result" 11 ) 12 13 type MetaLinter struct { 14 linters []*Linter 15 analyzerToLinterName map[*analysis.Analyzer]string 16 } 17 18 func NewMetaLinter(linters []*Linter) *MetaLinter { 19 ml := &MetaLinter{linters: linters} 20 ml.analyzerToLinterName = ml.getAnalyzerToLinterNameMapping() 21 return ml 22 } 23 24 func (ml MetaLinter) Run(_ context.Context, lintCtx *linter.Context) ([]result.Issue, error) { 25 for _, l := range ml.linters { 26 if err := l.preRun(lintCtx); err != nil { 27 return nil, errors.Wrapf(err, "failed to pre-run %s", l.Name()) 28 } 29 } 30 31 return runAnalyzers(ml, lintCtx) 32 } 33 34 func (ml MetaLinter) Name() string { 35 return "goanalysis_metalinter" 36 } 37 38 func (ml MetaLinter) Desc() string { 39 return "" 40 } 41 42 func (ml MetaLinter) getLoadMode() LoadMode { 43 loadMode := LoadModeNone 44 for _, l := range ml.linters { 45 if l.loadMode > loadMode { 46 loadMode = l.loadMode 47 } 48 } 49 return loadMode 50 } 51 52 func (ml MetaLinter) getAnalyzers() []*analysis.Analyzer { 53 var allAnalyzers []*analysis.Analyzer 54 for _, l := range ml.linters { 55 allAnalyzers = append(allAnalyzers, l.analyzers...) 56 } 57 return allAnalyzers 58 } 59 60 func (ml MetaLinter) getName() string { 61 return "metalinter" 62 } 63 64 func (ml MetaLinter) useOriginalPackages() bool { 65 return false // `unused` can't be run by this metalinter 66 } 67 68 func (ml MetaLinter) reportIssues(lintCtx *linter.Context) []Issue { 69 var ret []Issue 70 for _, lnt := range ml.linters { 71 if lnt.issuesReporter != nil { 72 ret = append(ret, lnt.issuesReporter(lintCtx)...) 73 } 74 } 75 return ret 76 } 77 78 func (ml MetaLinter) getLinterNameForDiagnostic(diag *Diagnostic) string { 79 return ml.analyzerToLinterName[diag.Analyzer] 80 } 81 82 func (ml MetaLinter) getAnalyzerToLinterNameMapping() map[*analysis.Analyzer]string { 83 analyzerToLinterName := map[*analysis.Analyzer]string{} 84 for _, l := range ml.linters { 85 for _, a := range l.analyzers { 86 analyzerToLinterName[a] = l.Name() 87 } 88 } 89 return analyzerToLinterName 90 }