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
 | |
| }
 | 
