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