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