sa5000.go raw

   1  package sa5000
   2  
   3  import (
   4  	"honnef.co/go/tools/analysis/lint"
   5  	"honnef.co/go/tools/analysis/report"
   6  	"honnef.co/go/tools/go/ir"
   7  	"honnef.co/go/tools/go/ir/irutil"
   8  	"honnef.co/go/tools/internal/passes/buildir"
   9  
  10  	"golang.org/x/tools/go/analysis"
  11  )
  12  
  13  var SCAnalyzer = lint.InitializeAnalyzer(&lint.Analyzer{
  14  	Analyzer: &analysis.Analyzer{
  15  		Name:     "SA5000",
  16  		Run:      run,
  17  		Requires: []*analysis.Analyzer{buildir.Analyzer},
  18  	},
  19  	Doc: &lint.RawDocumentation{
  20  		Title:    `Assignment to nil map`,
  21  		Since:    "2017.1",
  22  		Severity: lint.SeverityError,
  23  		MergeIf:  lint.MergeIfAny,
  24  	},
  25  })
  26  
  27  var Analyzer = SCAnalyzer.Analyzer
  28  
  29  func run(pass *analysis.Pass) (interface{}, error) {
  30  	for _, fn := range pass.ResultOf[buildir.Analyzer].(*buildir.IR).SrcFuncs {
  31  		for _, block := range fn.Blocks {
  32  			for _, ins := range block.Instrs {
  33  				mu, ok := ins.(*ir.MapUpdate)
  34  				if !ok {
  35  					continue
  36  				}
  37  				c, ok := irutil.Flatten(mu.Map).(*ir.Const)
  38  				if !ok {
  39  					continue
  40  				}
  41  				if c.Value != nil {
  42  					continue
  43  				}
  44  				report.Report(pass, mu, "assignment to nil map")
  45  			}
  46  		}
  47  	}
  48  	return nil, nil
  49  }
  50