86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
package lintersdb
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/golangci/plugin-module-register/register"
|
|
|
|
"github.com/golangci/golangci-lint/pkg/config"
|
|
"github.com/golangci/golangci-lint/pkg/goanalysis"
|
|
"github.com/golangci/golangci-lint/pkg/lint/linter"
|
|
"github.com/golangci/golangci-lint/pkg/logutils"
|
|
)
|
|
|
|
const modulePluginType = "module"
|
|
|
|
// PluginModuleBuilder builds the custom linters (module plugin) based on the configuration.
|
|
type PluginModuleBuilder struct {
|
|
log logutils.Log
|
|
}
|
|
|
|
// NewPluginModuleBuilder creates new PluginModuleBuilder.
|
|
func NewPluginModuleBuilder(log logutils.Log) *PluginModuleBuilder {
|
|
return &PluginModuleBuilder{log: log}
|
|
}
|
|
|
|
// Build loads custom linters that are specified in the golangci-lint config file.
|
|
func (b *PluginModuleBuilder) Build(cfg *config.Config) ([]*linter.Config, error) {
|
|
if cfg == nil || b.log == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
var linters []*linter.Config
|
|
|
|
for name, settings := range cfg.LintersSettings.Custom {
|
|
if settings.Type != modulePluginType {
|
|
continue
|
|
}
|
|
|
|
b.log.Infof("Loaded %s: %s", settings.Path, name)
|
|
|
|
newPlugin, err := register.GetPlugin(name)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("plugin(%s): %w", name, err)
|
|
}
|
|
|
|
p, err := newPlugin(settings.Settings)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("plugin(%s): newPlugin %w", name, err)
|
|
}
|
|
|
|
analyzers, err := p.BuildAnalyzers()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("plugin(%s): BuildAnalyzers %w", name, err)
|
|
}
|
|
|
|
customLinter := goanalysis.NewLinter(name, settings.Description, analyzers, nil)
|
|
|
|
switch strings.ToLower(p.GetLoadMode()) {
|
|
case register.LoadModeSyntax:
|
|
customLinter = customLinter.WithLoadMode(goanalysis.LoadModeSyntax)
|
|
case register.LoadModeTypesInfo:
|
|
customLinter = customLinter.WithLoadMode(goanalysis.LoadModeTypesInfo)
|
|
default:
|
|
customLinter = customLinter.WithLoadMode(goanalysis.LoadModeTypesInfo)
|
|
}
|
|
|
|
lc := linter.NewConfig(customLinter).
|
|
WithEnabledByDefault().
|
|
WithURL(settings.OriginalURL)
|
|
|
|
switch strings.ToLower(p.GetLoadMode()) {
|
|
case register.LoadModeSyntax:
|
|
// noop
|
|
case register.LoadModeTypesInfo:
|
|
lc = lc.WithLoadForGoAnalysis()
|
|
default:
|
|
lc = lc.WithLoadForGoAnalysis()
|
|
}
|
|
|
|
linters = append(linters, lc)
|
|
}
|
|
|
|
return linters, nil
|
|
}
|