golangci-lint/pkg/lint/lintersdb/builder_plugin_module.go
2024-03-26 20:55:39 +01:00

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
}