github.com/vanstinator/golangci-lint@v0.0.0-20240223191551-cc572f00d9d1/pkg/golinters/govet.go (about)

     1  package golinters
     2  
     3  import (
     4  	"golang.org/x/tools/go/analysis"
     5  	"golang.org/x/tools/go/analysis/passes/appends"
     6  	"golang.org/x/tools/go/analysis/passes/asmdecl"
     7  	"golang.org/x/tools/go/analysis/passes/assign"
     8  	"golang.org/x/tools/go/analysis/passes/atomic"
     9  	"golang.org/x/tools/go/analysis/passes/atomicalign"
    10  	"golang.org/x/tools/go/analysis/passes/bools"
    11  	_ "golang.org/x/tools/go/analysis/passes/buildssa" // unused, internal analyzer
    12  	"golang.org/x/tools/go/analysis/passes/buildtag"
    13  	"golang.org/x/tools/go/analysis/passes/cgocall"
    14  	"golang.org/x/tools/go/analysis/passes/composite"
    15  	"golang.org/x/tools/go/analysis/passes/copylock"
    16  	_ "golang.org/x/tools/go/analysis/passes/ctrlflow" // unused, internal analyzer
    17  	"golang.org/x/tools/go/analysis/passes/deepequalerrors"
    18  	"golang.org/x/tools/go/analysis/passes/defers"
    19  	"golang.org/x/tools/go/analysis/passes/directive"
    20  	"golang.org/x/tools/go/analysis/passes/errorsas"
    21  	"golang.org/x/tools/go/analysis/passes/fieldalignment"
    22  	"golang.org/x/tools/go/analysis/passes/findcall"
    23  	"golang.org/x/tools/go/analysis/passes/framepointer"
    24  	"golang.org/x/tools/go/analysis/passes/httpresponse"
    25  	"golang.org/x/tools/go/analysis/passes/ifaceassert"
    26  	_ "golang.org/x/tools/go/analysis/passes/inspect" // unused internal analyzer
    27  	"golang.org/x/tools/go/analysis/passes/loopclosure"
    28  	"golang.org/x/tools/go/analysis/passes/lostcancel"
    29  	"golang.org/x/tools/go/analysis/passes/nilfunc"
    30  	"golang.org/x/tools/go/analysis/passes/nilness"
    31  	_ "golang.org/x/tools/go/analysis/passes/pkgfact" // unused, internal analyzer
    32  	"golang.org/x/tools/go/analysis/passes/printf"
    33  	"golang.org/x/tools/go/analysis/passes/reflectvaluecompare"
    34  	"golang.org/x/tools/go/analysis/passes/shadow"
    35  	"golang.org/x/tools/go/analysis/passes/shift"
    36  	"golang.org/x/tools/go/analysis/passes/sigchanyzer"
    37  	"golang.org/x/tools/go/analysis/passes/slog"
    38  	"golang.org/x/tools/go/analysis/passes/sortslice"
    39  	"golang.org/x/tools/go/analysis/passes/stdmethods"
    40  	"golang.org/x/tools/go/analysis/passes/stringintconv"
    41  	"golang.org/x/tools/go/analysis/passes/structtag"
    42  	"golang.org/x/tools/go/analysis/passes/testinggoroutine"
    43  	"golang.org/x/tools/go/analysis/passes/tests"
    44  	"golang.org/x/tools/go/analysis/passes/timeformat"
    45  	"golang.org/x/tools/go/analysis/passes/unmarshal"
    46  	"golang.org/x/tools/go/analysis/passes/unreachable"
    47  	"golang.org/x/tools/go/analysis/passes/unsafeptr"
    48  	"golang.org/x/tools/go/analysis/passes/unusedresult"
    49  	"golang.org/x/tools/go/analysis/passes/unusedwrite"
    50  
    51  	"github.com/vanstinator/golangci-lint/pkg/config"
    52  	"github.com/vanstinator/golangci-lint/pkg/golinters/goanalysis"
    53  )
    54  
    55  var (
    56  	allAnalyzers = []*analysis.Analyzer{
    57  		appends.Analyzer,
    58  		asmdecl.Analyzer,
    59  		assign.Analyzer,
    60  		atomic.Analyzer,
    61  		atomicalign.Analyzer,
    62  		bools.Analyzer,
    63  		buildtag.Analyzer,
    64  		cgocall.Analyzer,
    65  		composite.Analyzer,
    66  		copylock.Analyzer,
    67  		deepequalerrors.Analyzer,
    68  		defers.Analyzer,
    69  		directive.Analyzer,
    70  		errorsas.Analyzer,
    71  		fieldalignment.Analyzer,
    72  		findcall.Analyzer,
    73  		framepointer.Analyzer,
    74  		httpresponse.Analyzer,
    75  		ifaceassert.Analyzer,
    76  		loopclosure.Analyzer,
    77  		lostcancel.Analyzer,
    78  		nilfunc.Analyzer,
    79  		nilness.Analyzer,
    80  		printf.Analyzer,
    81  		reflectvaluecompare.Analyzer,
    82  		shadow.Analyzer,
    83  		shift.Analyzer,
    84  		sigchanyzer.Analyzer,
    85  		slog.Analyzer,
    86  		sortslice.Analyzer,
    87  		stdmethods.Analyzer,
    88  		stringintconv.Analyzer,
    89  		structtag.Analyzer,
    90  		testinggoroutine.Analyzer,
    91  		tests.Analyzer,
    92  		timeformat.Analyzer,
    93  		unmarshal.Analyzer,
    94  		unreachable.Analyzer,
    95  		unsafeptr.Analyzer,
    96  		unusedresult.Analyzer,
    97  		unusedwrite.Analyzer,
    98  	}
    99  
   100  	// https://github.com/golang/go/blob/b56645a87b28840a180d64077877cb46570b4176/src/cmd/vet/main.go#L49-L81
   101  	defaultAnalyzers = []*analysis.Analyzer{
   102  		appends.Analyzer,
   103  		asmdecl.Analyzer,
   104  		assign.Analyzer,
   105  		atomic.Analyzer,
   106  		bools.Analyzer,
   107  		buildtag.Analyzer,
   108  		cgocall.Analyzer,
   109  		composite.Analyzer,
   110  		copylock.Analyzer,
   111  		defers.Analyzer,
   112  		directive.Analyzer,
   113  		errorsas.Analyzer,
   114  		framepointer.Analyzer,
   115  		httpresponse.Analyzer,
   116  		ifaceassert.Analyzer,
   117  		loopclosure.Analyzer,
   118  		lostcancel.Analyzer,
   119  		nilfunc.Analyzer,
   120  		printf.Analyzer,
   121  		shift.Analyzer,
   122  		sigchanyzer.Analyzer,
   123  		slog.Analyzer,
   124  		stdmethods.Analyzer,
   125  		stringintconv.Analyzer,
   126  		structtag.Analyzer,
   127  		testinggoroutine.Analyzer,
   128  		tests.Analyzer,
   129  		timeformat.Analyzer,
   130  		unmarshal.Analyzer,
   131  		unreachable.Analyzer,
   132  		unsafeptr.Analyzer,
   133  		unusedresult.Analyzer,
   134  	}
   135  )
   136  
   137  func NewGovet(settings *config.GovetSettings) *goanalysis.Linter {
   138  	var conf map[string]map[string]any
   139  	if settings != nil {
   140  		conf = settings.Settings
   141  	}
   142  
   143  	return goanalysis.NewLinter(
   144  		"govet",
   145  		"Vet examines Go source code and reports suspicious constructs, "+
   146  			"such as Printf calls whose arguments do not align with the format string",
   147  		analyzersFromConfig(settings),
   148  		conf,
   149  	).WithLoadMode(goanalysis.LoadModeTypesInfo)
   150  }
   151  
   152  func analyzersFromConfig(settings *config.GovetSettings) []*analysis.Analyzer {
   153  	if settings == nil {
   154  		return defaultAnalyzers
   155  	}
   156  
   157  	if settings.CheckShadowing {
   158  		// Keeping for backward compatibility.
   159  		settings.Enable = append(settings.Enable, shadow.Analyzer.Name)
   160  	}
   161  
   162  	var enabledAnalyzers []*analysis.Analyzer
   163  	for _, a := range allAnalyzers {
   164  		if isAnalyzerEnabled(a.Name, settings, defaultAnalyzers) {
   165  			enabledAnalyzers = append(enabledAnalyzers, a)
   166  		}
   167  	}
   168  
   169  	return enabledAnalyzers
   170  }
   171  
   172  func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool {
   173  	if cfg.EnableAll {
   174  		for _, n := range cfg.Disable {
   175  			if n == name {
   176  				return false
   177  			}
   178  		}
   179  		return true
   180  	}
   181  
   182  	// Raw for loops should be OK on small slice lengths.
   183  	for _, n := range cfg.Enable {
   184  		if n == name {
   185  			return true
   186  		}
   187  	}
   188  
   189  	for _, n := range cfg.Disable {
   190  		if n == name {
   191  			return false
   192  		}
   193  	}
   194  
   195  	if cfg.DisableAll {
   196  		return false
   197  	}
   198  
   199  	for _, a := range defaultAnalyzers {
   200  		if a.Name == name {
   201  			return true
   202  		}
   203  	}
   204  	return false
   205  }