Ludovic Fernandez 9aea4aee1c
Some checks failed
Extra / Vulnerability scanner (push) Has been cancelled
CI / go-mod (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Release a tag / release (push) Has been cancelled
CI / tests-on-windows (push) Has been cancelled
CI / tests-on-macos (push) Has been cancelled
CI / tests-on-unix (1.14) (push) Has been cancelled
CI / tests-on-unix (1.15) (push) Has been cancelled
CI / tests-on-unix (1.16) (push) Has been cancelled
CI / check_generated (push) Has been cancelled
Release a tag / docker-release (map[Dockerfile:build/Dockerfile.alpine]) (push) Has been cancelled
Release a tag / docker-release (map[Dockerfile:build/Dockerfile]) (push) Has been cancelled
typecheck: display compilation errors as report instead of error (#1861)
2021-03-25 23:52:55 +01:00

91 lines
2.0 KiB
Go

package goanalysis
import (
"context"
"github.com/pkg/errors"
"golang.org/x/tools/go/analysis"
"github.com/golangci/golangci-lint/pkg/lint/linter"
"github.com/golangci/golangci-lint/pkg/result"
)
type MetaLinter struct {
linters []*Linter
analyzerToLinterName map[*analysis.Analyzer]string
}
func NewMetaLinter(linters []*Linter) *MetaLinter {
ml := &MetaLinter{linters: linters}
ml.analyzerToLinterName = ml.getAnalyzerToLinterNameMapping()
return ml
}
func (ml MetaLinter) Run(_ context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
for _, l := range ml.linters {
if err := l.preRun(lintCtx); err != nil {
return nil, errors.Wrapf(err, "failed to pre-run %s", l.Name())
}
}
return runAnalyzers(ml, lintCtx)
}
func (ml MetaLinter) Name() string {
return "goanalysis_metalinter"
}
func (ml MetaLinter) Desc() string {
return ""
}
func (ml MetaLinter) getLoadMode() LoadMode {
loadMode := LoadModeNone
for _, l := range ml.linters {
if l.loadMode > loadMode {
loadMode = l.loadMode
}
}
return loadMode
}
func (ml MetaLinter) getAnalyzers() []*analysis.Analyzer {
var allAnalyzers []*analysis.Analyzer
for _, l := range ml.linters {
allAnalyzers = append(allAnalyzers, l.analyzers...)
}
return allAnalyzers
}
func (ml MetaLinter) getName() string {
return "metalinter"
}
func (ml MetaLinter) useOriginalPackages() bool {
return false // `unused` can't be run by this metalinter
}
func (ml MetaLinter) reportIssues(lintCtx *linter.Context) []Issue {
var ret []Issue
for _, lnt := range ml.linters {
if lnt.issuesReporter != nil {
ret = append(ret, lnt.issuesReporter(lintCtx)...)
}
}
return ret
}
func (ml MetaLinter) getLinterNameForDiagnostic(diag *Diagnostic) string {
return ml.analyzerToLinterName[diag.Analyzer]
}
func (ml MetaLinter) getAnalyzerToLinterNameMapping() map[*analysis.Analyzer]string {
analyzerToLinterName := map[*analysis.Analyzer]string{}
for _, l := range ml.linters {
for _, a := range l.analyzers {
analyzerToLinterName[a] = l.Name()
}
}
return analyzerToLinterName
}