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  }