github.com/nozzle/golangci-lint@v1.49.0-nz3/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/golangci/golangci-lint/pkg/config"
    47  	"github.com/golangci/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 NewGovet(settings *config.GovetSettings) *goanalysis.Linter {
   123  	var conf map[string]map[string]interface{}
   124  	if settings != nil {
   125  		conf = settings.Settings
   126  	}
   127  
   128  	return goanalysis.NewLinter(
   129  		"govet",
   130  		"Vet examines Go source code and reports suspicious constructs, "+
   131  			"such as Printf calls whose arguments do not align with the format string",
   132  		analyzersFromConfig(settings),
   133  		conf,
   134  	).WithLoadMode(goanalysis.LoadModeTypesInfo)
   135  }
   136  
   137  func analyzersFromConfig(settings *config.GovetSettings) []*analysis.Analyzer {
   138  	if settings == nil {
   139  		return defaultAnalyzers
   140  	}
   141  
   142  	if settings.CheckShadowing {
   143  		// Keeping for backward compatibility.
   144  		settings.Enable = append(settings.Enable, shadow.Analyzer.Name)
   145  	}
   146  
   147  	var enabledAnalyzers []*analysis.Analyzer
   148  	for _, a := range allAnalyzers {
   149  		if isAnalyzerEnabled(a.Name, settings, defaultAnalyzers) {
   150  			enabledAnalyzers = append(enabledAnalyzers, a)
   151  		}
   152  	}
   153  
   154  	return enabledAnalyzers
   155  }
   156  
   157  func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool {
   158  	if cfg.EnableAll {
   159  		for _, n := range cfg.Disable {
   160  			if n == name {
   161  				return false
   162  			}
   163  		}
   164  		return true
   165  	}
   166  
   167  	// Raw for loops should be OK on small slice lengths.
   168  	for _, n := range cfg.Enable {
   169  		if n == name {
   170  			return true
   171  		}
   172  	}
   173  
   174  	for _, n := range cfg.Disable {
   175  		if n == name {
   176  			return false
   177  		}
   178  	}
   179  
   180  	if cfg.DisableAll {
   181  		return false
   182  	}
   183  
   184  	for _, a := range defaultAnalyzers {
   185  		if a.Name == name {
   186  			return true
   187  		}
   188  	}
   189  	return false
   190  }